如何在c#中更改NetworkAdapter的名称?

如何在c#中更改NetworkAdapter的名称?,c#,networking,adapter,C#,Networking,Adapter,人们声称下面的VB脚本用于更改网络适配器名称。然而,我很难将它转换成一个可以做同样事情的c#application。我似乎面临的问题是对NetworkInterface.Name的调用是只读的 Option Explicit Const NETWORK_CONNECTIONS = &H31& Dim sOldName= WScript.Arguments(0) Dim sNewName= WScript.Arguments(1) Dim objShell, objFolde

人们声称下面的VB脚本用于更改网络适配器名称。然而,我很难将它转换成一个可以做同样事情的c#application。我似乎面临的问题是对
NetworkInterface.Name
的调用是只读的

Option Explicit

Const NETWORK_CONNECTIONS = &H31&

Dim sOldName= WScript.Arguments(0)
Dim sNewName= WScript.Arguments(1)

Dim objShell, objFolder, colItems, objItem 

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(NETWORK_CONNECTIONS)

Set colItems = objFolder.Items
For Each objItem in colItems
    If objItem.Name = sOldName Then
        objItem.Name =sNewName 
    End If
Next
我发现了这一点,这更能解释这一点:

好的,有一些特殊的文件夹存储NIC名称,您可以通过SHELL绑定到这些文件夹来访问它们。那么如何在c#中执行类似的操作?

您可以使用assembly和use类


按照这里的示例操作-

您还可以创建一个具有所需功能的VB.NET dll,并从C#代码中引用和调用它

下面是一个控制台应用程序,演示了代码(我测试过,它可以工作:)

它打印出:

局部区域连接


网络

如果您知道注册表结构的工作原理,您可以通过注册表轻松更改NIC的名称

您需要NetworkAdapters GUID才能找到要打开的路径。要获取网络适配器GUID,建议首先查询WMI“Win32\U NetworkAdapter”类。有一个GUID属性以及标识特定适配器所需的所有其他属性

您将在注册表路径中注意到此GUID:{4D36E972-E325-11CE-BFC1-08002BE10318}
有关此GUID的信息,请访问链接:

string fRegistryKey=string.Format(@“SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}{0}\Connection”,NIC\U GUID);
RegistryKey RegistryKey=RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine,@“\\”+Server.Name);
RegistryKey=RegistryKey.OpenSubKey(fRegistryKey,true)//true表示可写。
RegistryKey.SetValue(“名称”,“值”);
根据设计,windows UI不允许重复NIC名称。但是,您可以通过注册表强制使用重复的NIC名称。我们已经做了测试,重复的名字似乎没有什么严重的影响。Windows似乎仍能正常工作。如果您没有加入防重复的名称逻辑,您只想对针对NIC名称编写脚本保持警惕

要创建唯一性,可以使用与WMI查询关联的适配器索引属性

Option Explicit On
Module Module1
    Sub Main()

        Const NETWORK_CONNECTIONS = &H31&

        Dim sOldName = "Local Area Connection"
        Dim sNewName = "Network"

        Dim objShell, objFolder, colItems, objItem
        objShell = CreateObject("Shell.Application")
        objFolder = objShell.Namespace(NETWORK_CONNECTIONS)

        colItems = objFolder.Items
        For Each objItem In colItems
            Console.WriteLine(objItem.Name)
            If objItem.Name = sOldName Then
                objItem.Name = sNewName
            End If
            Console.WriteLine(objItem.Name)
        Next
    End Sub

End Module
string fRegistryKey = string.Format(@"SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{0}\Connection", NIC_GUID);

RegistryKey RegistryKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, @"\\" + Server.Name);

RegistryKey = RegistryKey.OpenSubKey(fRegistryKey, true); //true is for WriteAble.

RegistryKey.SetValue("Name", "<DesiredAdapterName>");