Я использую 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
показывает несколько другой порядок. Это наиболее близко я вижу разницу.в этот момент озадачен.
Я знаю, что эти грани опасно близки к проблеме системного администрирования.