【问题标题】:How to change the name of a NetworkAdapter in c#?如何在 C# 中更改 NetworkAdapter 的名称?
【发布时间】:2012-05-24 20:29:59
【问题描述】:

人们声称以下 VB 脚本可用于更改网络适配器名称。但是,我很难将其转换为可以做同样事情的 c# 应用程序。我似乎面临的问题是对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

我发现这可以解释更多:http://blogs.technet.com/b/heyscriptingguy/archive/2005/05/11/how-can-i-rename-a-local-area-connection.aspx

好的,所以有一些特殊的文件夹用于存储 NIC 名称,您可以通过 SHELL 绑定到这些文件夹来访问这些文件夹。那么你如何在 c# 中做这样的事情呢?

【问题讨论】:

    标签: c# networking adapter


    【解决方案1】:

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

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

    您会在注册表路径中注意到此 GUID:{4D36E972-E325-11CE-BFC1-08002BE10318}
    有关它的信息,请访问链接: http://technet.microsoft.com/en-us/library/cc780532(v=ws.10).aspx

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

    根据设计,Windows UI 不允许重复的 NIC 名称。但是,您可以通过注册表强制重复 NIC 名称。我们已经进行了测试,似乎没有受到重名的严重影响。 Windows 似乎仍然可以正常工作。如果您不包含反重复名称逻辑,您只想对针对 NIC 名称的脚本保持警惕。

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

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

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

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

        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
        

        打印出来:

        本地连接

        网络

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-24
          • 2017-09-09
          • 2023-02-06
          • 1970-01-01
          • 2011-08-31
          • 2015-03-24
          • 2015-07-24
          • 2020-12-20
          相关资源
          最近更新 更多