2013-04-26 122 views
1

我想读取和修改我的NetworkAddress的注册表项值。它在注册表路径是:如何设置或从注册表中获取NetworkAddress密钥

HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \控制\ {类4D36E972-E325-11CE-BFC1-08002BE10318} \ 0011

那个路径里面有一个名为NetworkAddress的关键。我如何阅读和修改此密钥?

这是我曾尝试:

RegistryKey myKey = Registry.LocalMachine.OpenSubKey(@"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0011",true); 
     MessageBox.Show((string) myKey.GetValue("NetworkAddress")); 
     myKey.SetValue("NetworkAddress", "002408B2A2D2", RegistryValueKind.String); 

我曾尝试此代码,它给我这个异常:未设置为一个对象的实例对象引用。我该如何解决这个问题?请帮助我,谢谢。

+1

因为工厂方法找不到指定位置的键并返回'null',所以您正在接收异常。 – 2013-04-26 17:13:55

+0

是的我知道,但关键是现有的位置,并确保我在正确的路径我从注册表直接复制目的地 我认为这是一个权限问题? – Yasser 2013-04-26 17:24:06

+0

如果您没有足够的权限访问注册表项,则会抛出System.Security.Security异常。我认为你需要提升特权才能写入LOCAL_MACHINE关键配置单元。 – 2013-04-26 17:26:35

回答

2

由于工厂方法找不到指定位置的子密钥并返回null,您将收到异常。

尽管您的子密钥地址是完全有效的,因为您使用的是Registry.LocalMachine.OpenSubKey您实际上在子密钥地址中指定HKEY_LOCAL_MACHINE两次。解决的办法是改变你的子项路径:

SYSTEM \ ControlSet001 \控制\ {类4D36E972-E325-11CE-BFC1-08002BE10318} \ 0011

您可能还需要考虑一个更可靠的方法:

using (RegistryKey myKey = 
    Registry.LocalMachine.OpenSubKey(
     @"SYSTEM\ControlSet001\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0011", true)) 
{ 
    if (myKey != null) 
    { 
     Console.WriteLine((string) myKey.GetValue("NetworkAddress")); 
     myKey.SetValue("NetworkAddress", "002408B2A2D2", RegistryValueKind.String); 
    } 
} 
+0

非常感谢你的工作 – Yasser 2013-04-26 17:26:45

1

C#是一个相当丰富的语言,所以这是一个更容易做,而不注册表

using System.Net.NetworkInformation; 

var local = NetworkInterface.GetAllNetworkInterfaces().Where(i => i.Name == "Local Area Connection").FirstOrDefault(); 
var stringAddress = local.GetIPProperties().UnicastAddresses[0].Address.ToString(); 
var ipAddress = IPAddress.Parse(address);