2

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

4

3 回答 3

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 查询关联的适配器索引属性。

于 2012-05-30T18:40:28.530 回答
0

您可以使用System.Management程序集并使用此类

按照此处的示例 - http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/727c8766-8189-4ad6-956d-958e52b97c05/

于 2012-05-24T21:12:29.957 回答
0

您还可以创建具有您需要和引用的功能的 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

它打印出来:

本地连接

网络

于 2012-05-24T21:31:49.467 回答