Есть такой код на VBScript
Set WMIService = GetObject("winmgmts:\\localhost\root\cimv2")
Set WbemObjectSet = WMIService.ExecQuery("SELECT SID FROM Win32_Account Where SIDType=1", "WQL", 32)
For Each WbemObject in WbemObjectSet
WScript.Echo(WbemObject.Name)
Next
Как его перенести на JScript?
Проблема с циклом For Each.
Если я пишу так
var WMIService = GetObject("winmgmts:\\\\localhost\\root\\cimv2")
var WbemObjectSet = WMIService.ExecQuery('SELECT SID FROM Win32_Account Where SIDType=1', 'WQL', 32);
for (var WbemObject in WbemObjectSet) {
WScript.Echo(WbemObject.SID);
}
цикл не выполняется.
MSDN говорит, что у объекта WbemObjectSet есть свойство Count и методы Item, ItemIndex. Однако при обращении к ним я получаю ошибки
WScript.Echo(WbemObjectSet.Count); // Неопознанная ошибка
WScript.Echo(WbemObjectSet.ItemIndex(0).SID); // Invalid operation
Объект WbemObjectSet поддерживает интерфейс IEnumVariant с методом Next. Однако второй и третий параметр этого метода передаются по ссылке. Можно ли его вызвать из JScript?
Update
Предложенный в ответе метод работает только начиная с Windows Vista. Тогда как в Windows XP у объекта SWbemObjectSet нет метода ItemIndex(), а метод Item() в качестве аргумента принимает не индекс, а path-строку
Проблема решена. Я в метод WMIService.ExecQuery третьим параметром передавал флаг wbemFlagForwardOnly (32 (0x20)), что отключало навигацию по коллекции по произвольным индексам.
Если же передать флаг wbemFlagBidirectional (0 (0x0)) (или не передавать третий параметр вообще), то начинают работать Count и ItemIndex()
var WMIService = GetObject("winmgmts:\\\\localhost\\root\\cimv2");
var WbemObjectSet = WMIService.ExecQuery('SELECT SID FROM Win32_Account Where SIDType=1', 'WQL');
for (var i = 0; i < WbemObjectSet.Count; i++) {
WScript.Echo(WbemObjectSet.ItemIndex(i).SID);
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости