代码之家  ›  专栏  ›  技术社区  ›  Anthony

从win32_tcpipprinterport检索主机地址时出现问题

  •  1
  • Anthony  · 技术社区  · 16 年前

    我在检索打印机端口地址时遇到了一个奇怪的问题。 当我获取win32_tcpipprinterport中的所有条目时,hostAddress字段(应该有IP地址)通常为空/空,只有端口名有一个值。让它有点奇怪,如果某个特定的端口没有被任何打印机使用,那么主机地址将具有适当的值。

    C代码很简单,结果是这样的; IP U 192.168.1.100, 普林特

    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中尝试了同样的方法,并看到了同样的行为。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Anthony    15 年前

    最后我不得不再次访问这个网站,并再次尝试。我发现内置prnport.vbs管理脚本没有问题-通过查看它,我发现在建立其wmi连接时,它具有oseservice.security_u.priveleges.addasstring“seloaddriverprivilege”

    C中的解决方案最终指定了wmi connectionoptions并将enableprivileges设置为true。然后主机地址对于未使用或正在使用的端口不再为空。

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