Пример использования 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. Всем удачи.
Вложенные файлы
# |
Название |
Тип файла |
Размер |
---|---|---|---|
1 | 356ID_HDD | .zip | 2,28 КБ |