在win8系统中,微软提高了系统盘文件的权限,提高了其他系统操作的权限,因此一些桌面应用程序在运行时会报一些权限错误,比如C盘文件操作权限,或注册表操作无权限等。
我之前开发过一款用笔记本一键架设无线网络的程序WIFIHelper,在win7下运行正常,但是到win8下运行的时候,就读取不到系统网卡设备信息,一直想去解决,但是因为时间关系,没能解决。今天上网查了一下资料,发现在C#的System.Security.Principal命名空间下有一些windows系统用户账户的操作,经初步了解,已经可以解决权限问题。只需要在Program类中增加一个判断方法,代码如下:
1 private static bool IsAdministrator() 2 { 3 var identity = WindowsIdentity.GetCurrent(); 4 if (identity != null) 5 { 6 var principal = new WindowsPrincipal(identity); 7 return principal.IsInRole(WindowsBuiltInRole.Administrator); 8 } 9 return false; 10 }
这个方法返回当前用户是否具有管理员权限。
在Main方法里编写代码:
1 /// <summary> 2 /// 应用程序的主入口点。 3 /// </summary> 4 [STAThread] 5 private static void Main(string[] args) 6 { 7 if (IsAdministrator()) 8 {//如果具有管理员权限,直接运行程序 9 Application.EnableVisualStyles(); 10 Application.SetCompatibleTextRenderingDefault(false); 11 Application.Run(new FrmMain()); 12 } 13 else 14 {//如果不具有管理员权限,则以管理员身份执行可执行程序 15 var startInfo = new ProcessStartInfo 16 { 17 FileName = Application.ExecutablePath,//进程目标文件 18 Arguments = string.Join(" ", args),//进程参数 19 Verb = "runas"//管理员权限 20 }; 21 Process.Start(startInfo); 22 } 23 }
注:需要引入命名空间System.Security.Principal