Пример использования WMI

Возможности (кратко) 1) Получение списков запущеных процессов 2) Получение данных по оборудованию (sn model ...) 3) Получение данных об установленном SoftWare + много чего еще + возможность получения данных с удаленного компьютера сети.

Пример использования WMI

Здравствуйте все.

Захотелось добавить в решения очень полезную вещь - WMI. Странно почему-то ее мло кто использовал из тех кто на этом сайте бывает на форуме. Может это решение изменит положение 🙂

Возможности (кратко)
1) Получение списков запущеных процессов
2) Получение данных по оборудованию (sn model ...)
3) Получение данных об установленном SoftWare
+ много чего еще
+ возможность получения данных с удаленного компьютера сети.

Более подробно:
1) Спсобы работы
Я видел 2 - один из них работает мягко говоря странно. Вот он:

1.1)Коннектимся к объекту winmgmts с параметрами. Я если честно вижу такое применение GETObject впервые.

strComputer = "."
objWMIService = GETOBJECT("winmgmts:{impersonationLevel=impersonate}!"+strComputer+"rootcimv2")

Где strComputer - имя сетевого компьютера. "." - означает текущий компьютер.

Далее идет рабоита с objWMIService. Язык WMI очень похож на SQL (скорее всего это он и есть) поэтому не пугайтесь.

colSettings = objWMIService.ExecQuery("Select * from Win32_Processor",,48)

Здесь colsettings - объект с набором информации и методами !!! Короче то что нам и нужно
Самое важное здесь Win32_Processor - данные о процессоре(ах). Вся соль заключается именно в этом слове! Суть в том что данным на компьютере соответствует свое название Win32_XXX

Например :
Данные о работающих процессах Win32_Process
Данные о винчестере Win32_DiskDrive
и т.д.

К концу решения Вы сами сможете определить что чему соответствует.

Ну и вытягивание данных из colSettings

colItems = objWMIService.ExecQuery("Select * from Win32_VideoController",,48)
For Each objItem in colItems
? "VideoMfr: ", objItem.AdapterCompatibility
? "VideoRAM: ", objItem.AdapterRAM
? "VideoAdapter: ", objItem.Name
? "VideoProcessor: ", objItem.VideoProcessor
Next

Как я уже писал выше colSettings - набор объектов со свойствами. Здась представлены некоторые свойства объекта Win32_VideoController

Вот и все. Просто и красиво.

1.2) Второй способ отличается только подключением. Его мне подсказал Vit*.

m.strcomputer='.'
loSWbemLocator = CREATEOBJECT("WbemScripting.SWbemLocator")
loSWbemService = loSWbemLocator.ConnectServer(strcomputer)
colSettings = loSWbemService.ExecQuery("Select * From Win32_DiskDrive Where InterfaceType='IDE'",,48)
FOR EACH ObjItem IN colSettings
? ObjItem.PNPDeviceID
? get_sn(ObjItem.PNPDeviceID)
NEXT

Короче суть таже самая что и в первом варианте. Но этот вариант работает практически всегда в отличие от первого. Т.е. у меня были глюки с переносом программы с одного компьютера на другой На одном все работает а на другом не хочет - выдет ошибку. А второй вариант работал у меня всегда.

2) Об описании WMI
Все описание идет в поставке с Windows - как я понял. Т.е. если у Вас русский Windows то и описание на русском. СУПЕР!!!

Чтобы определить что чему соответствует скачайте WMITools и запустите WMI Object Browser. Он сначала представит
Вам номера версий каких-то.
Далее выдастся строчка connect to Namespace (rootcimv2) Здесь можно поставить имя компьютера с которого хотим получить данные
Например work6rootcimv2
Жмем OK
Получаем окошко с заданием имени пользователя и пароля. Жмем OK. Если Вы получили окошко "Отказано в доступе" - Вы не администратор и НЕКОТОРЫЕ данные Вам не доступны. Но не все...
Получаем окошко в IE написанное на VBScript, помоему.

Далее один (или 2) элемент класса Win32_ComputerSystem
Раскрываем его и ищем Win32_SystemDevices - это список всего оборудования компа.
Раскрываем его и ищем например Win32_DiskDrive - это список всех жестких дисков со свойствами...

3) Помощь

Выбираем нужный объект и щелкаем на вопросительный знак в правом верхнем углу. А вот и описание всех свойств на РУССКОМ.

4) Немного об своих нароботках
4.1) SN винчестера
Меня тут запрегли на военной кафедре написать прогу по учету компов. К ним приезжает ФСБ и устанавливает норму секретности. Но за эту норму надо бабок выложить. Чтобы этого не делать надо представить список компов с описанием...
В описании надо указывать SN Model и т.д. всего к чему можно прицепить жучек.

Ну так вот, о чем это я. А да проблема в том что серийники просто так не найдешь даже через WMI.
Можно найти на
Память (только он практически всегда не задан)
Процессор (расшифрованная информация ASM -> CPUID)
И чего - то там еще.

Я накопал что можно найти и SN винчестера. Т.к. больше я нигде не нашел этой информации в Inet то раньше думал что можно это сделать только при помощи обращений к портам винчестера. Кстати привожу в архиве пример на Pascal-е
Задавал вопросы на форуме но увы.

Ну так вот все оказалось тупо до безобразия. SN хранится в свойстве PNPDeviceID класса Win32_DiskDrtive

Привожу функцию его получения которую использовал выше в примере

FUNCTION get_sn
LPARAMETERS str
PRIVATE x,k
m.x=RAT('',m.str)
m.k=''
IF m.x#0
m.str=SUBSTR(m.str,m.x+1)
if at('&',m.str)=0
DO WHILE !EMPTY(m.str)
m.k=m.k+CHR(hextobyte(SUBSTR(m.str,3,2)))+CHR(hextobyte(SUBSTR(m.str,1,2)))
m.str=SUBSTR(m.str,5)
ENDDO
RETURN ALLTRIM(m.k)
endif
ENDIF
RETURN ''

FUNCTION hextobyte
LPARAMETERS str
PRIVATE a,k,r
m.str=UPPER(m.str)
m.a=SUBSTR(m.str,1,1)
m.k=ASC(m.a)-IIF(m.a<='9',ASC('0'),ASC('A')-10)
m.a=SUBSTR(m.str,2,1)
RETURN m.k*16+ASC(m.a)-IIF(m.a<='9',ASC('0'),ASC('A')-10) Вот и все. Круто. 4.2) О свойствах.
В большинстве объектов с которыми я работал из win32_systemdevices есть одинаковвые свойства

Availability
Name
Caption
DeviceID
PNPdeviceID
status

О них можно почитать в свойствах объектов.

5) Благодарности

Спасибо Vit* что помог разобраться с глюками объектов соединения!

6) Необходимо для работы

Да совсем забыл сказать что WMI работает только начиная с Windows 2000 помоему

Для работы с другими Windows есть файл wmicore.exe

Скачать WMITools и WMICore можно с Microsoft. Ну и в крайнем случае пишите скину. Но они большие !!!
WMITools ~ 5 MB

7) Для чего это надо вообще 🙂
Мне нужно было для проекта по сбору информации о компах + печать карточек на комп с информацией
А еще для привязки проги к железу. Чтоб не утащили на другой комп.

Спасибо. Надеюсь я внушил Вам чувство уверенности в WMI. Всем удачи.

Автор: Петров Андрей
0

Автор публикации

не в сети 20 лет

Петров Андрей

0
Комментарии: 0Публикации: 14Регистрация: 17-04-2002
Вложенные файлы
#
Тип файла
Размер
Название
1 .zip 356ID_HDD
Оставить комментарий
Авторизация
*
*
Генерация пароля