您的位置:首页 > 编程语言 > C#

c# win7注册表【Registry】 操作

2011-12-12 13:40 246 查看
2009年的在上海参加了win7的产品兼容性问题活动。在win7系统注册表信息的操作就比较麻烦...不像xp系统那样简单,win7安全性比较高点。
所以,在操作win7注册表是必须要有管理员身份才能操作注册表信息,这样不会被UAC(用户帐户控制)阻止访问操作注册表信息。

这里讲一 C# 小列子(高手请绕过此地!), 我们平时都是在xp开发比较多...不过现在很多开发人员也在win7下开发了。

下面是在 LocalMachine下的 一下注册表操作 ,就不详说了private
static
void DeleteRegistry(string name)

{

string[] aimnames;

RegistryKey hkml = Registry.LocalMachine;

RegistryKey software = hkml.OpenSubKey("SOFTWARE",
true);

RegistryKey aimdir = software.OpenSubKey("Microsoftss",
true);

aimnames = aimdir.GetSubKeyNames();

foreach (string aimKey
in aimnames)

{

if (aimKey
== name)

aimdir.DeleteSubKeyTree(name);

}

}

private
static string GetData(string name)

{

string registData;

RegistryKey hkml = Registry.LocalMachine;

RegistryKey software = hkml.OpenSubKey("SOFTWARE",
true);

RegistryKey aimdir = software.OpenSubKey("Microsoftss",
true);

registData = aimdir.GetValue(name).ToString();

return registData;

}

private
static void WriteValue(string name,
string tovalue)

{

RegistryKey hklm = Registry.LocalMachine;

RegistryKey software = hklm.OpenSubKey("SOFTWARE",
true);

RegistryKey aimdir = software.CreateSubKey("Microsoftss");

aimdir.SetValue(name, tovalue);

}

private
static bool IsExit(string name)

{

bool _exit
= false;

string[] subkeyNames;

RegistryKey hkml = Registry.LocalMachine;

RegistryKey software = hkml.OpenSubKey("SOFTWARE",
true);

RegistryKey aimdir = software.OpenSubKey("Microsoftss",
true);

subkeyNames = aimdir.GetValueNames();

foreach (string keyName
in subkeyNames)

{

if (keyName
== name)

{

_exit =
true;

return _exit;

}

}

return _exit;

}

比如,当我们在xp系统下 软件执行Writevalue("版本号","v1.0.0.1"),一切都ok! 然后乐的就抛给了客户...没有思考。

一天客户换了win7系统 ,运了软件了。客户拉着42号鞋子的脸说,怎么软件在win7不能运行了....。问题就是上面开头说的了。

解决方法是有地....

这里列举几种.

第一种、教教客户、或者技术服务人员就好了。这个方法不需要修改我们的代码这是好处之一。只要, 点击.exe 右键

,在弹出的菜单中选择【属性】, 选择【兼容性】项,并勾选【以管理员身份运行此程序】就ok了。简单吧

第二种、也算简单,不过我们就要重新生成软件了。首先、在程序中加入MANIFEST资源,右击工程在菜单->【属性】->【安全性】,在界面中勾选【启用ClickOnce安全设置】,在项目的Properties下就有自动生成app.manifest文件。

文件内容如下:

<?xml version="1.0" encoding="utf-8"?>

<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">

<assemblyIdentity version="1.0.0.0"
name="MyApplication.app"
/>

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">

<security>

<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">

<!-- UAC 清单选项

如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换

requestedExecutionLevel 节点。

<requestedExecutionLevel level="asInvoker"
uiAccess="false"
/>

<requestedExecutionLevel level="requireAdministrator"
uiAccess="false"
/>

<requestedExecutionLevel level="highestAvailable"
uiAccess="false"
/>

如果您希望利用文件和注册表虚拟化提供

向后兼容性,请删除 requestedExecutionLevel 节点。

-->

<requestedExecutionLevel level="asInvoker"
uiAccess="false"
/>

</requestedPrivileges>

<applicationRequestMinimum>

<defaultAssemblyRequest permissionSetReference="Custom"
/>

<PermissionSet
class="System.Security.PermissionSet" version="1"
Unrestricted="true" ID="Custom"
SameSite="site"
/>

</applicationRequestMinimum>

</security>

</trustInfo>

</asmv1:assembly>

把 <requestedExecutionLevel level="asInvoker" uiAccess="false"
/> 的 asInvoker 改为"requireAdministrator"。重新编译一下就ok了。

看到这个了吧!

这就是UAC(用户帐户控制)了

<!-- UAC 清单选项 如果希望更改 Windows 用户帐户控制级别,请用以下节点之一替换 requestedExecutionLevel 节点。 <requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> 如果您希望利用文件和注册表虚拟化提供 向后兼容性,请删除 requestedExecutionLevel
节点。 -->

还有其他的方法。不过上面两种比较简单...。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: