C# winform 编译成功后为程序添加清单文件,添加Icon以及强签名

为了使程序不出警告,强签名这里是在最后完成的。

简单说一下过程:

1.新建一个文本文件,输入以下代码:

 

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

上面的资源文件里有一个配置选项叫requestedExecutionLevel,  这个项用于配置当前应用请求的执行权限级别。这个项有3个值可供选择,如下所示:

asInvoker : 如果选这个,应用程序就是以当前的权限运行。

highestAvailable: 这个是以当前用户可以获得的最高权限运行。

requireAdministrator: 这个是仅以系统管理员权限运行。

 

保存后改名为AppName.exe.manifest

利用mt.exe来注入该清单文件。

命令行:mt -mainfest AppName.exe.manifest -outputresource:AppName.exe ;#1

 

2.添加Icon

命令行:ReplaceVistaIcon.exe AppName.exe Icon.ico

ReplaceVistaIcon.exe是一个小工具。

 

3.强签名

命令行:sn -R AppName.exe Private.snk

 

将以上三段命令行写入编译后事件中,即可。

C# <wbr>winform <wbr>编译成功后为程序添加清单文件,添加Icon以及强签名

 

另:

要注意,程序强签名要设置为延迟签名。

即:程序签名处的AssemblyDelaySign属性设置为true([assembly:AssemblyDelaySign(true)])

 

以上命令行都是VS自带的command所执行的所以使用时,App可执行文件(exe),SN.EXE,MT.EXE,清单文件,ico图标等的目录需要根据实际情况设定。



判断程序是否以管理员身份运行

 需要添加命名空间:

using System.Security.Principal;

复制代码
    /// <summary>
    /// 确定当前主体是否属于具有指定 Administrator 的 Windows 用户组
    /// </summary>
    /// <returns>如果当前主体是指定的 Administrator 用户组的成员,则为 true;否则为 false。</returns>
    public static bool IsAdministrator()
    {
        bool result;
        try
        {
            WindowsIdentity identity = WindowsIdentity.GetCurrent();
            WindowsPrincipal principal = new WindowsPrincipal(identity);
            result = principal.IsInRole(WindowsBuiltInRole.Administrator);

            //http://www.cnblogs.com/Interkey/p/RunAsAdmin.html
            //AppDomain domain = Thread.GetDomain();
            //domain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
            //WindowsPrincipal windowsPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
            //result = windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
        }
        catch
        {
            result = false;
        }
        return result;
    }
复制代码

猜你喜欢

转载自blog.csdn.net/lwsas1/article/details/78050933