关于软件开发中兼容win7注册表的解决方案
编写人:CC阿爸
2014-3-14
l 近来在开发一winform程序时,发现在xp 系统访问注册表一切正常。可偏这个时候,微软又提醒大家。Xp今年的4月份会寿终正寝了。因此必需要考虑到对win7的兼容。
Win7在访问时,返回的注册表值,就是与实际看到的不一致。
经过在网上搜索部分解决方案,以下这位同学的解决方案才是正解,终于找到相关解决办法。
首先读取注册表要给用户管理员得权限。exe在Vista或Win7下不以管理员权限运行,会被UAC(用户帐户控制)阻止访问系统某些功能,如修改注册表操作等;如何让exe以管理员权限运行呢,方法有两种,一个是直接修改exe属性;另一个是在程序中加入MANIFEST资源,下面分别介绍。
1. 直接修改exe属性:
1) 右击“exe”,在弹出的菜单中选择“属性”,出现的界面如下图:
2) 选择“兼容性”项,并勾选“以管理员身份运行此程序”项即可。
2. 在C#程序中加入MANIFEST资源,
1) 打开vs2008工程,看在Properties下是否有app.manifest这个文件;如没有,右击工程在菜单中选择“属性”,出现界面如下:
2) 选中“安全性”,在界面中勾选“启用ClickOnce安全设置”后,在Properties下就有自动生成app.manifest文件。
3) 打开app.manifest文件,在<security>下加入
class="code_img_closed" id="code_img_closed_2592140d-eac2-4c89-9508-df6cd22f724c" style="font-family: 'Courier New'; font-size: 13px; line-height: 1.5;" alt="" />logs_code_collapse" style="font-family: 'Courier New'; font-size: 13px; line-height: 1.5;">View Code
4) 重新编译即可。全部代码如下:
<?xml version=
"1.0" encoding=
"utf-8"?>
6) <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">
7) <assemblyIdentity version=
"1.0.0.0" name=
"MyApplication.app" />
8) <trustInfo xmlns=
"urn:schemas-microsoft-com:asm.v2">
9) <security>
10) <
requestedPrivileges xmlns=
"urn:schemas-microsoft-com:asm.v3">
11) <!-- UAC 清单选项
12) 如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换
13) requestedExecutionLevel 节点。
14)
15) <requestedExecutionLevel level=
"asInvoker" uiAccess=
"false" />
16) <requestedExecutionLevel level=
"requireAdministrator" uiAccess=
"false" />
17) <requestedExecutionLevel level=
"highestAvailable" uiAccess=
"false" />
18)
19) 如果您希望利用文件和注册表虚拟化提供
20) 向后兼容性,请删除 requestedExecutionLevel 节点。
21) -->
22) <!--<requestedExecutionLevel level=
"asInvoker" uiAccess=
"false" />-->
23) <requestedPrivileges>
24) <requestedExecutionLevel level=
"requireAdministrator" cess=
"false"/>
25) </requestedPrivileges>
26)
27) </requestedPrivileges>
28) <applicationRequestMinimum>
29) <PermissionSet
class=
"System.Security.PermissionSet" version=
"1" Unrestricted=
"true" ID=
"Custom" SameSite=
"site" />
30) <defaultAssemblyRequest permissionSetReference=
"Custom" />
31) </applicationRequestMinimum>
32) </security>
33) </trustInfo>
34) </asmv1:assembly>
View Code