Go提权并打包exe带图标和文件信息

88 阅读1分钟

工具下载

go installgithub.com/josephspurrier/goversioninfo/cmd/goversioninfo@latest

执行完毕后GOPATH的 bin 目录里出现一个goversioninfo.exe则为成功

提权

在main.go同级目录下创建 nac.manifest 文件内容为:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="9.0.0.0"
    processorArchitecture="x86"
    name="myapp.exe"
    type="win32"
/>
<description>myapp</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
    </security>
</trustInfo>
</assembly>

文件详细信息

在main.go同级目录创建 versioninfo.json 文件内容为:

{
    "FixedFileInfo": {
        "FileVersion": {
            "Major": 1,
            "Minor": 0,
            "Patch": 0,
            "Build": 0
        },
        "ProductVersion": {
            "Major": 1,
            "Minor": 0,
            "Patch": 0,
            "Build": 0
        },
        "FileFlagsMask": "3f",
        "FileFlags ": "00",
        "FileOS": "040004",
        "FileType": "01",
        "FileSubType": "00"
    },
    "StringFileInfo": {
        "Comments": "程序描述",
        "CompanyName": "公司名称",
        "FileDescription": "文件说明",
        "FileVersion": "v1.0.0.0",
        "InternalName": "程序内部名称",
        "LegalCopyright": "Copyright (c) 2022 xxxxxx",
        "LegalTrademarks": "",
        "OriginalFilename": "原始文件名",
        "PrivateBuild": "",
        "ProductName": "产品名称",
        "ProductVersion": "v1.0.0.0",
        "SpecialBuild": ""
    },
    "VarFileInfo": {
        "Translation": {
            "LangID": "0409",
            "CharsetID": "04B0"
        }
    },
    "IconPath": "你的图标文件",
    "ManifestPath": ""
}

设置图标

把图标复制到main.go同级目录下,图标格式为:ico ,并在main.go首行增加:

//go:generate goversioninfo -icon=图标文件 -manifest=提权文件

编译

  1. 生成编译需要的文件 :
go generate

成功则会生成 resource.syso资源文件 2. 打包

go build    //带有cmd黑框
go build -ldflags "-s -w -H=windowsgui"     //没有cmd黑框,适合有gui的

报错解决

image.png 上面的解决办法是,编译时带一下参数 -ldflags="-linkmode internal"

go build -ldflags "-s -w -linkmode internal"
go build -ldflags "-s -w -H=windowsgui -linkmode internal"     //没有cmd黑框,适合有gui的