C# 请求UAC权限以及管理员用户判定

小柊 发表于 2015年09月28日 00时19分40秒

虽然Windows Vista是微软Windows史上的一大败笔,但Vista里有很多元素再经过改良之后在Windows 7里大放异彩。比如说Windows Aero,Windows Aero也被称为毛玻璃特效,在Windows Vista里,Aero是一个名副其实的资源消耗大户,我也在网上找到了在Windows Vista里启动Aero特效的最低配置:

1GHz 32 位 (x86) 或 64 位 (x64) 的CPU处理器

1 千兆字节 (GB) 的随机存取内存 (RAM)

128-MB 图形卡:支持 Windows Display Driver Model 驱动程序、Pixel Shader 2.0 和 32 位每像素的 DirectX 9 类的图形处理器。

要知道这配置在刚发布Windows Vista的时候可不是一个可以轻松达到的配置。

另外,提起Windows Vista另外一个令人生厌的缺点,那就是繁琐的UAC。

 

UAC(User Account Control,用户帐户控制)是微软为提高系统安全而在Windows Vista中引入的新技术,它要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,提供权限或管理员密码。通过在这些操作启动前对其进行验证,UAC 可以帮助防止恶意软件和间谍软件在未经许可的情况下在计算机上进行安装或对计算机进行更改。

然而,在Windows Vista里,这项功能就不免有点繁琐了,甚至可以说是只要有一点风吹草动就会跳出来要求用户输入密码或者确认。

不过,令人欣慰的是,微软在Windows Vista这个大坑里跌倒后,也是很好的反思过,并在Windows 7里修正了这些问题。

咳咳,扯得有点远了。

前面也提过,UAC是Windows Vista之后引进的新技术,它能保护系统不被恶意软件恶意篡改。在Windows 7里,微软对UAC进行了重新的设计,新的UAC不会再像Windows Vista里一样神经过敏。当程序在对系统敏感位置进行操作时必须向UAC申请授权,只有获得权限才能操作,否则会被UAC静默处理。

问题也就出在这里,事实上我们在日常开发中,有时候程序不得不去访问一下系统敏感位置,比如说去注册表检查一下某些软件的键值以获得安装目录等,如果事先没有申请UAC授权,那么程序读写注册表的操作会被UAC重定向,这个操作有个专业的名词叫做文件和注册表虚拟化,关于这个问题我会另外写博客详解。这种UAC重定向这样很多时候就会获取到错误的结果,所以当我们需要进行一些比较敏感的操作时,就需要获得UAC授权。一般来说,获得UAC授权有两种方式:用户主动授权和程序主动申请。

用户主动授权就是用户在启动程序的时候右键程序图标,在弹出的右键菜单里选择“以管理员身份运行(U)”,这个时候系统就会弹出UAC窗口,提示用户进行UAC授权。

 

或者是用户手动设置程序的兼容性设置,把兼容性设置里的“以管理员身份运行此程序”勾上,这样程序在每次启动的时候都会提示进行UAC授权。

 

用户主动授权完全是依靠用户手动操作,这种方式并不可取,首先,它违背了KISS原则(KISS原则,keep it simple and stupid。简单的说,就是要把一个系统做的连白痴都会用),第二,世界这么大,总有几个人会没注意到你大大的大红的加粗的“请右键使用管理员权限运行”标语,双击直接打开然后抱怨你的程序做的垃圾。

所以,作为一个程序员,在知道自己的程序需要使用UAC权限之后,让程序在启动时主动申请UAC授权是一件非常重要的事情,那么才能做到呢?

其实主动申请UAC权限并不是一件难事,从Windows Vista开始出现了UAC之后,微软便很合时宜在自己Visual Studio里添加了这个申请UAC授权的功能,只要轻松几步就可以申请到UAC授权。接下来由我为大家展示一下具体流程:

以C#为例,首先在Visual Studio中在右侧的“解决方案资源管理器”中,右键单击自己需要主动申请UAC的项目,在弹出菜单中一次选择“添加(D)”——》“新建项(W)...”

 

在弹出的“添加新项”窗口中,选择“应用程序清单文件”,并单击“添加”添加到当前项目中来。

 

在添加了这个应用程序清单文件之后,Visual Studio会自动生成一份应用程序清单文件,并已经添加好了模版,我们一眼就可以看到有一块大大的绿色注释项目,写着“UAC清单选项”。

 

注释部分很详细的告诉我们如何该如何设置才能获得UAC权限,这三个选择具体效果如下:

asInvoker:应用程序以当前的权限运行

requireAdministrator:应用程序仅以系统管理员权限运行

highestAvailable:应用程序以当前用户可以获得的最高权限运行

我们只需要根据自己的需要来修改就行了,修改也很简单,只需要把对应的那条配置复制到下面并覆盖掉就可以了。

 

修改完毕后,按Ctrl+Shift+S全部保存,再按F6重新生成一遍。现在,我们的程序在启动时就会主动向用户申请UAC授权了。

 

顺带一提就是,在Visual Basic .net里,不需要我们这么麻烦的去手动添加,在对应的项目文件夹中,有个“My Project”文件夹,在这里面就有app.manifest文件,只需要手动拖到Visual Studio里打开编辑就行。

 

 

另外一个问题就是如何在程序运行中,如何判断当前使用的用户是否为管理员用户,这个判断有时候很重要,因为如果是普通用户,同时程序在申请UAC权限时使用的是highestAvailable,那么即便是通过了UAC授权,程序也没有得到管理员权限,在执行时会被系统拒绝。

 

判断当前用户是否为管理员用户,只需要添加以下函数:

 

在需要判断的时候调用这个函数,如果函数返回值为true,则说明当前用户为管理员用户,反之,用户为普通用户。

 

以上便是C# 请求UAC权限以及管理员用户判定的所有内容,UAC这个功能非常的有意思,在本篇中我也挖了一个坑,也请各位看官期待我后续的博文,谢谢。

 

小柊

2015年9月28日 00:16:49

相关文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注