如何从注册表设置或获取NetworkAddress项

时间:2013-04-26 17:08:01

标签: c# registrykey

我想阅读并修改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);

我已经尝试过这段代码并且它给了我这个例外:对象引用未设置为对象的实例。如何解决此问题?请帮助我,谢谢你。

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分: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);