Почему удаленный WMI-вызов Win32_Printer возвращается с пустым набором для некоторых машин? - PullRequest
2 голосов
/ 21 октября 2011

Я использую WMI (сначала создаю прототипы всего в VBScript, так как примеров больше, и он устраняет непостоянство VBScript / Python) для удаленного подключения к свежему ПК (назовем это PC2).Большинство Win32_* классов могут быть прочитаны удаленно, но Win32_Printer возвращает пустой набор при запросе, но только при удаленном запросе.В результате SWbemObjectSet всегда имеет .Count нуля.Нет ошибок.Я могу подключиться к ПК1 и получить SWbemObjectSet с ненулевым .Count, перебрать его и т. Д. Если я запускаю скрипт локально (после удаления имени пользователя и пароля суперпользователя из метода .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.

Похоже, что это не проблема с именем пользователя и паролем.

  • Причина 1: я могу получить информацию из Win32_ComputerSystem.
  • Причина 2: Я должен получить ошибку.

Не появляетсяпроблема с версией ОС:

  • Причина: ПК2 и ПК1 работают под управлением Windows 7 Professional.ПК1 работает под управлением 64-разрядной версии, ПК2 - 32-разрядной.

Хотя я начал пытаться подключиться к 32-разрядной машине с 64-разрядного сервера, она не выглядит как 32-разрядная.64-битная проблема.

  • Причина 1: я добавил значение 32 для __ProviderArchitecture в SWbemNamedValueSet до моей попытки .ConnectServer (с этим SWbemNamedValueSet в аргументах безрезультатно),хотя позже я не смог добавить этот же контекст в метод .ExecQuery подключенного сервера без оператора несоответствия типов.
  • Причина 2: позже я запустил скрипт с 32-разрядного сервера с тем же результатом.

Кажется, это не является поврежденной проблемой WMI.

  • Причина: как только я перестаю использовать учетные данные, я могу запустить скрипт с самого компьютера и получитьрезультирующий набор, содержащий более нуля элементов и может выполнять его итерацию.

В моем скрипте это не является ошибкой учетных данных / пространства имен.

  • Причина: использованиеWBemTest.exe с того же исходного компьютера и с использованием идентичного имени пользователя, пароля, уровня аутентификации, уровня олицетворения, пространства имен и т. Д. Я получаю тот же нулевой набор для ответа.

Не отображаетсябыть проблемой of Безопасность пространства имен WMI на целевом компьютере.

  • Причина 1: вход в систему на целевом компьютере с теми же учетными данными, что и сценарий, генерирует результаты.
  • Причина 2: Win32_Printerнаходится в том же пространстве имен, что и Win32_ComputerSystem.Win32_ComputerSystem работает.
  • Причина 3: После использования Wmimgmt.msc Microsoft Management Console (MMC), чтобы дать суперпользователю полные права, начиная с корневого пространства имен, передавая "Это пространство имен и подпространства имен", перезагрузкаи проверяя снова, я все еще получаю тот же пустой набор.

Похоже, что это не соответствующие OU ПК2 и ПК1, которые являются проблемой.

  • Причина: я поменял OU на каждой машине и перезагрузил.Без изменений.

Кажется, это не локальные группы компьютеров:

  • Причина: Я сделал членство в группах на ПК2 похожим на ПК1 и перезагрузился.Без изменений.

Похоже, что-то не магическое в Win32_Printer в том, что удаленный доступ не работает.

  • Причина: я могу читать ПК1 Win32_Printerкласс.

Не похоже, что мой WQL необычен.

  • Причина: "SELECT * FROM Win32_Printer" - это мой тестовый пример.

Не похоже, что мои настройки DCOM выключены.

  • Причина: они выглядят одинаково, когда я прохожу ПК1 и ПК2.

Я даже зашел так далеко, что нажал на журналы трассировки в WMI-Activity, распечатал их для ПК1 и ПК2затем выполните сортировку по GroupOperationID, OperationID (TimeCreated SystemTime недостаточно детализирован и EventID кажется ... не в порядке. Я вижу события из следующих действий:

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

в обоих наборах журналов, и если я сортирую по GroupOperationID, OperationID, они, кажется, происходят в одинаковом порядке. Сортировка по EventID показывает несколько другой порядок. Это наиболее близко я вижу разницу.в этот момент озадачен.

Я знаю, что эти грани опасно близки к проблеме системного администрирования.

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Нашел эту ссылку в win32_printer на странице спецификаций , ссылаясь на эту проблему http://www.lansweeper.com/forum/yaf_postsm18178_WMI-Security-PowershellLansweeper.aspx#post18178 Похоже, возвращаются только установки принтеров для этого пользователя, а не все принтеры в системе. Поэтому, если вы никогда не входили в удаленную систему под учетными данными пользователя, которого вы используете для перечисления принтеров, вы получите пустой результат.

0 голосов
/ 01 ноября 2011

Похоже, вы хорошо на нем стреляли. ServerFault может дать что-то большее ...

Это длинный путь, но я однажды слышал, что отключенные службы терминалов явно вызывали проблемы при отправке запросов WMI ...

Edit:

Это может не относиться, но может стоить посмотреть: Делегирование AD

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...