【问题标题】:Why is a Remote WMI call to Win32_Printer Coming Back With An Empty Set For Some Machines?为什么对某些机器的 Win32_Printer 的远程 WMI 调用返回一个空集?
【发布时间】:2011-10-21 19:02:11
【问题描述】:

我正在使用 WMI(首先在 VBScript 中对所有内容进行原型设计,因为示例更加丰富,并且它消除了 VBScript/Python 的障碍)远程连接到新的 PC(我们将其称为 PC2)。大多数Win32_* 类可以远程读取,但Win32_Printer 在查询时返回一个空集,但仅在我远程查询时。结果 SWbemObjectSet.Count 始终为零。没有错误。我可以连接到 PC1 并接收带有非零 .CountSWbemObjectSet,可以遍历它等等。如果我在本地运行脚本(在从 .ConnectServer 方法中删除超级用户用户名和密码之后,自然) ,我得到一个非零的.Count 并可以遍历它。即使我愚蠢地使用自己的域管理员帐户,问题仍然存在。脚本:

strComputer = "nnn.nnn.nnn.nnn" 
username = "DOMAIN\superuser"
password = "thisisaverygoodpassword"

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
objSWbemLocator.Security_.ImpersonationLevel = 3
objSWbemLocator.Security_.AuthenticationLevel = 6
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, "root\cimv2", username, password)
Set colSWBemObjectSet = objSWbemServices.ExecQuery("Select * From Win32_Printer")
WScript.Echo colSWBemObjectSet.Count & " Found."
For Each objPrinter in colSWBemObjectSet
    For Each Property in objPrinter.Properties_
        If TypeName(Property.Value) = "Variant()" Then
            Wscript.Echo """" & Property.Name & """, """ & TypeName(Property.Value) & """, ""Skipping ...""" 
        Else
            Wscript.Echo """" & Property.Name & """, """ & TypeName(Property.Value) & """, """ & Property.Value & """" 
        End If
    Next
Next

为简洁起见,省略了注释和错误检查。

这似乎不是防火墙问题。

  • 原因 1:存在防火墙阻塞时,我收到错误消息 从SWbemLocator 返回,“RPC 服务器不可用。”
  • 原因2:我可以访问和运行WMI类Win32_ComputerSystem 轻松。

这似乎不是用户名/密码问题。

  • 原因一:我可以从Win32_ComputerSystem检索信息。
  • 原因 2:我应该得到一个错误。

这似乎不是操作系统版本问题:

  • 原因:PC2 和 PC1 都运行 Windows 7 Professional。 PC1 运行 64 位版本,PC2 运行 32 位版本。

虽然我开始尝试从 64 位服务器访问 32 位机器,但这似乎不是 32 位与 64 位的问题。

  • 原因 1:我在尝试 .ConnectServer 之前在 SWbemNamedValueSet 中为 __ProviderArchitecture 添加了 32 的值(在参数中使用 SWbemNamedValueSet 无济于事),尽管我后来无法做到将相同的上下文添加到已连接服务器的 .ExecQuery 方法中,而不使用类型不匹配运算符。
  • 原因 2:我后来从 32 位服务器运行脚本,结果相同。

这似乎不是 WMI 损坏问题。

  • 原因:一旦我停止使用凭据,我就可以从目标计算机本身运行脚本并接收包含多个项目的结果集,并且可以对其进行迭代。

这似乎不是我的脚本中的凭据/命名空间错误。

  • 原因:使用来自同一源计算机的 WBemTest.exe 并使用相同的用户名、密码、身份验证级别、模拟级别、命名空间等,我收到相同的 null 集作为答案。

这似乎不是目标机器上的 WMI 命名空间安全问题。

  • 原因 1:使用与脚本使用的凭据相同的凭据登录目标计算机会生成结果。
  • 原因 2:Win32_PrinterWin32_ComputerSystem 在同一个命名空间中。 Win32_ComputerSystem 有效。
  • 原因 3:使用Wmimgmt.msc Microsoft 管理控制台 (MMC) 授予超级用户完全权限后,从根命名空间开始,传播到“此命名空间和子命名空间”,重新启动并再次检查,我仍然收到相同的空集。

问题似乎不是 PC2 和 PC1 各自的 OU。

  • 原因:我交换了每台机器所在的 OU 并重新启动。没有变化。

它似乎不是本地计算机组:

  • 原因:我使 PC2 中的组成员身份看起来像 PC1 并重新启动。没有变化。

Win32_Printer 似乎没有什么神奇之处,因为远程访问不起作用。

  • 原因:我可以阅读PC1的Win32_Printer类。

我的 WQL 似乎没有异常。

  • 原因:“SELECT * FROM Win32_Printer”是我的测试用例。

我的 DCOM 设置似乎没有关闭。

  • 原因:当我通过 PC1 和 PC2 时,它们看起来相同。

我什至甚至在 WMI-Activity 中点击 Trace 日志,为 PC1 和 PC2 打印它们,然后按GroupOperationIDOperationID 排序(TimeCreated SystemTime 不够精细,@ 987654350@ 似乎...出现故障。我可以从以下操作中看到事件:

IWbemServices::Connect
Start IWbemServices::ExecQuery - Select * from __ClassProviderRegistration
Start IWbemServices::GetObject - __Win32Provider.Name="WmiPerfClass"
Start IWbemServices::ExecQuery - references of {__Win32Provider.Name="WmiPerfClass"}
Start IWbemServices::GetObject - Win32_Printer
Start IWbemServices::ExecQuery - Select * From Win32_Printer
Provider::CreateInstanceEnum - Win32_Printer

在两组日志中,如果我按GroupOperationIDOperationID 排序,它们似乎以相同的顺序发生。按EventID 排序显示出一些不同的顺序。这是我能看到的最接近差异的地方。在这一点上我很难过。

我知道这非常接近系统管理问题。

【问题讨论】:

    标签: wmi


    【解决方案1】:

    在 win32_printer spec page 中找到此链接,指的是此问题 http://www.lansweeper.com/forum/yaf_postsm18178_WMI-Security-PowershellLansweeper.aspx#post18178 似乎只返回了为此用户安装的打印机,而不是系统上的所有打印机。因此,如果您从未使用用于枚举打印机的用户的凭据登录到远程系统,那么您将得到一个空结果。

    【讨论】:

    • 这是正确的,WMI 只返回系统定义的打印机和为当前用户安装的打印机。
    【解决方案2】:

    看起来你已经做得很好了。 ServerFault 可能会产生更多...

    这是一个长镜头,但我曾经听说终端服务被禁用显然会在发出 WMI 查询时引起问题......

    编辑:

    这可能不适用,但值得一看:AD Delegation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      相关资源
      最近更新 更多