2012-05-24 17 views
1

人們聲稱以下VB腳本適用於更改網絡適配器名稱。不過,我正在嘗試將此轉換爲可以執行相同操作的c#應用程序,這段時間確實很困難。我似乎面臨的問題是撥打NetworkInterface.Name是隻讀的。如何更改c#中的NetworkAdapter的名稱?

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#中做這樣的事情呢?

回答

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用戶界面不會允許重複的NIC名稱。但是,您可以通過註冊表強制重複的NIC名稱。我們已經完成了測試,似乎沒有重名的重名。 Windows似乎仍然正常運行。如果您沒有合併防重複的名稱邏輯,您只需要謹慎對待NIC名稱的腳本。

要創建唯一性,您可以使用與WMI查詢關聯的適配器索引屬性。

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 

它打印出:

本地連接

網絡