2009-04-07 60 views
1

我遇到了一個奇怪的問題,檢索打印機的端口地址。 當我得到Win32_TCPIPPrinterPort中的所有條目時,HostAddress字段(應具有IP地址)通常爲空白/空白,只有端口名稱具有值。爲了讓它有點陌生,如果某個特定的端口沒有被任何打印機使用,那麼HostAddress將具有適當的值。從Win32_TCPIPPrinterPort檢索主機地址問題

C#代碼很簡單,結果如下所示; IP_192.168.1.100, printerportxyz,

richTextBox1.Clear(); 
ManagementObjectSearcher portSearcher = new ManagementObjectSearcher("root\\CIMV2", 
    "SELECT * FROM Win32_TCPIPPrinterPort"); 
foreach (ManagementObject port in portSearcher.Get()) 
{ 
    richTextBox1.AppendText(
     String.Format("Name: {0} HostAddress: {1}", 
      port["Name"], 
      port["HostAddress"]) 
     ); 
} 

我也試過在WSH/VBS一樣的東西,看到了相同的行爲。

回答

3

我最終不得不重新訪問這個,並進行了另一次嘗試。我發現內置的prnport.vbs管理腳本沒有問題 - 查看它我看到,雖然建立它的WMI連接,它有oService.Security_.Priveleges.AddAsString「SeLoadDriverPrivilege」

C#中的解決方案最終指定WMI ConnectionOptions並將EnablePrivileges設置爲true。然後,HostAdress對於未使用或正在使用的端口不再爲空。

ConnectionOptions connOptions = new ConnectionOptions(); 
connOptions.EnablePrivileges = true; 

ManagementScope mgmtScope = new ManagementScope("root\\CIMV2", connOptions); 
mgmtScope.Connect(); 

ObjectQuery objQuery = new ObjectQuery("SELECT * FROM Win32_TCPIPPrinterPort"); 
ManagementObjectSearcher moSearcher = new ManagementObjectSearcher(mgmtScope, objQuery); 

foreach (ManagementObject mo in moSearcher.Get()) 
{ 
    Console.WriteLine(String.Format("PortName={0} HostAddress={1}", mo["Name"], mo["HostAddress"])); 
}