为了使程序不出警告,强签名这里是在最后完成的。
简单说一下过程:
1.新建一个文本文件,输入以下代码:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
上面的资源文件里有一个配置选项叫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
将以上三段命令行写入编译后事件中,即可。
另:
要注意,程序强签名要设置为延迟签名。
即:程序签名处的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; }