今天在cnBlogs中看到一篇文章《自定义 Vista 系统下程序运行级别》,我很感兴趣。因为我曾经编写过一个用于控制Windows服务控制的小程序采用了UAC方法,要知道像修改系统服务状态这些操作在Vista下必须使用Administrator权限才可以。由于当时时间仓促,我没有深刻的研究这个问题(而且当时这也不是我的重点研究对象),因此我很“偷懒”地使用修改生成程序属性的方法解决了这个问题,但这并不是很好的解决方案。详细的文章见《做成一件小事,收获一份知识。(续)》。
今天我看到这篇文章非常高兴,以为可以解决当时所留下的问题了,于是我采用作者所写的方法完善了程序。在完善程序的过程中,我发现此方法非常令我失望,因为这个方法还不如我原来的那个方法。作者的方法较我的方法而言比较复杂,但作者的方法对我是有启示的,启示就是:如何在编译后直接生成采用UAC的程序(也许我的这种说法不准确,但大概就是在程序运行时让程序获得管理员权限的意思,还望广大网友指点)?注意,我原来的方法以及那篇文章的作者的方法均为在程序编译后对程序进行修改,我不太喜欢这种方法,我认为任何一个程序员都不应该把修改权限控制的事情留在编译之后,程序员的工作应该在编译之前完成。于是我上网查了查,没查出来,自己有试了一试,终于在最后得到一个满意的结果,现在广大园子中的网友们分享。具体的例子还是我在《做成一件小事,收获一份知识。(续)》中的那个小程序。
步骤如下:
- 在项目上右击鼠标,选择属性;
- 在属性卡中选择“安全性”,选择启用ClickOnce安全设置(打勾);
- 然后,可以看到在解决方案管理器中多了一个app.mainfest文件,修改文件内容。将requestedPrivilege中的节点requestedExecutionLevel的level属性修改为requireAdministrator(见Code第18行)
Code
1 <?xml version="1.0" encoding="utf-8"?>
2 <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
3 <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
4 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
5 <security>
6 <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
7 <!-- UAC 清单选项
8 如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换
9 requestedExecutionLevel 节点。
10
11 <requestedExecutionLevel level="asInvoker" uiAccess="false" />
12 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
13 <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
14
15 如果您希望利用文件和注册表虚拟化提供
16 向后兼容性,请删除 requestedExecutionLevel 节点。
17 -->
18 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
19 </requestedPrivileges>
20 <applicationRequestMinimum>
21 <defaultAssemblyRequest permissionSetReference="Custom" />
22 <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
23 </applicationRequestMinimum>
24 </security>
25 </trustInfo>
26 </asmv1:assembly - 然后将步骤2中的属性卡中的取消ClickOnce安全按属性(去除勾);
- 编译程序;
- 运行程序,系统弹出对话框让用户选择是否用Administrator身份运行程序(注意不要再VS中编译运行,否则UAC不起作用)。
我开发经验很少,因此对于对于许多问题的见解可能不深刻不透彻。如果我在这个随笔中所用到的方法有什么问题,还恳请给为老手指点。或者有什么刚好的方法,还请广大网友分享。