В данной статье я немного расскажу о такой полезной штуке как WMI и дам инструмент для исследования его классов.
Windows Managment Instruments (WMI) — инструментарий управления Windows, технология в основе которой лежит т.н. Общая Информационная Модель, реализующая одинаковый централизованный объектно-ориентированны подход к компонентам системы. Это очень удобно и нет нужды всякий раз вникать в особенности того или иного компонента системы (виртуального или физического).
Подключаться к WMI можно из любого языка программирования, поддерживающего технологию
COM (Component Object Model).
С WMI мы можем писать разнообразные мониторы ресурсов системы, вытворять вещи которые сложно реализовать даже на winapi и многое другое.
Так вот, репозиторий подсистемы WMI представляет из себя огромное количество классов (для XP ~3500, w2k3 — ~5000, win7 ипатче — не юзал) реализующих те или иные возможности со своими свойствами и методами.
И можете себе представить, всё это множество классов является
самодокументированным на языке локализации ОС, т.е.по-русски!
А такое даже в MSDN тяжело встретить.
Для целей всестороннего исследования отдельных классов я создал инструмент для
автоматизированного создания рускоязычной HTML-документации по WMI-классам.
MSDN по-русски не отходя от кассы! :)
Его код привожу ниже.
[code]
'*******************************************************************************************
'* Имя: WmiClass_Explorer.vbs
'* Язык: VBscript
'* CommandLine: WmiClass_Explorer.vbs [[\\computername]\NameSpace:]wmi_class]
'* Описание: Получение описания WMI-класса, его свойств и методов.
'* Автор: Kiber_punk
'*******************************************************************************************
DIM WMI
DIM TEXT
DIM P,M '// ФЛАГИ ПРИСУТСТВИЯ СВОЙСТВ И МЕТОДОВ
DIM fn
Set WshShell = WScript.CreateObject(«Wscript.Shell»)
if Wscript.Arguments.Count=0 then
classname = InputBox («Задайте имя WMI-класса:»,«WMI-класс»,LOADSETTINGS)
' СОХРАНЕНИЕ НАСТРОЕК
SAVESETTINGS (classname)
else
classname = Wscript.Arguments.Item(0)
End if
IF classname="" then
WScript.Quit
ELSE
GETINFO(CLASSNAME)
GetDescription()
GetMethods()
GEtProps()
GetMethodsDesc()
GEtPropsDesc()
Record()
Open()
End IF
'*************** [Class description] *******************
Sub GETINFO(CLASSNAME_)
ON ERROR RESUME NEXT
'подключение к WMI
set WMI = GetObject («winmgmts:» & classname)
if err.number <>0 then
msgbox «Незвестный класс:»& vbcr &" """& classname &"""",16,«Error»
WScript.quit
End if
TEXT = «Описание класса
[» & WMI.path_.Namespace& ":" & WMI.path_.class &"]:"& vbcrlf
End Sub
'*************** [Enum properties] *******************
function GetMethods ()
'ON ERROR RESUME NEXT
M=FALSE
TEMP = TEMP + "----------------------------" &vblf;& "
Methods [" & WMI.path_.class &"]:"&vblf;
for each method in wmi.Methods_
if method.name<>"" Then
M=TRUE
TEMP = TEMP + vbTab & "
"& method.name & "" & vbcrlf
End if
next
if (M) then TEXT = TEXT & TEMP
End function
'*************** [Enum methods] *******************
function GetProps ()
F=FALSE
'ON ERROR RESUME NEXT
TEMP = TEMP + "----------------------------" &vblf;& "
Properties [" & WMI.path_.class &"]:"&vblf;
for each Prop in wmi.Properties_
if Prop.name<>"" Then
P=TRUE
TEMP = TEMP + vbTab & "
" & Prop.name &""& vbcrlf
End if
next
if (P) then TEXT = TEXT & TEMP
End function
'---------- [GET DESCRIPTION OF METHODS] — Sub GetMethodsDesc ()
ON ERROR RESUME NEXT
IF (M) THEN
TEXT = TEXT + "
" &vblf;& "
Описание Методов [" & WMI.path_.class &"]:"&vblf;&vblf;
for each method in wmi.Methods_
TEMP = (GetObject («winmgmts:»).Get (classname,131072).METHODS_(method.Name).Qualifiers_(«DESCRIPTION»))
IF TEMP<>"" THEN TEXT = TEXT + vbTab & "
[" & method.name & "]"& " — " & TEMP & vbcrlf
next
End IF
End Sub
'---------- [GET DESCRIPTION OF PROPERTIES] — Sub GEtPropsDesc ()
ON ERROR RESUME NEXT
IF (P) THEN
TEXT = TEXT + "----------------------------" &vblf;& "
Описание Свойств [" & WMI.path_.class &"]:"&vblf;&vblf;
for each Prop in wmi.Properties_
TEMP = (GetObject («winmgmts:»).Get (classname,131072).properties_(Prop.Name).Qualifiers_(«DESCRIPTION»))
IF TEMP<>"" THEN
TEXT = TEXT + vbTab & "
[" & Prop.name &"]"& " — " & TEMP & vbcrlf
End IF
next
End IF
End Sub
'*************** [Get Description of class] *******************
Sub GetDescription ()
ON ERROR RESUME NEXT
TEXT = TEXT & vbcrlf& GetObject(«winmgmts:»).Get (classname,131072).Qualifiers_(«Description») & vbcrlf
End Sub
'______________________________________________________________________________
'---------- СОХРАНЕНИЕ НАСТРОЕК ПОИСКА — Sub SAVESETTINGS (KEY_)
ON ERROR RESUME NEXT
CreateObject («wscript.shell»).RegWrite «HKCU\SOFTWARE\True-Script LAB\WMI-soft\WMI-Class Explorer\KEY»,KEY_
End Sub
'---------- ЧТЕНИЕ НАСТРОЕК ПОИСКА — function LOADSETTINGS
on error resume next
LOADSETTINGS = CreateObject («wscript.shell»).RegRead («HKCU\SOFTWARE\True-Script LAB\WMI-soft\WMI-Class Explorer\KEY»)
if LOADSETTINGS="" then LOADSETTINGS="\\.\root\cimv2:win32_process"
End function
'---------- ЗАПИСЬ В ФАЙЛ — Sub Record
fn = ".\CLASSES-Explore & WMI.path_.class &".htm"
Set File = CreateObject («Scripting.FileSystemObject»).OpenTextFile (fn ,2, True)
File.WriteLine "
" &TEXT;
File.Close()
End Sub
'---------- ОТКРЫТИЕ СОЗДАННОГО СПИСКА -------
Sub Open
CreateObject ("wscript.shell").run "hh.exe -800 " & fn
'CreateObject ("Wscript.Shell").run "notepad " & fn
End Sub
[/code]
Конечно, чтобы им пользоваться надо знать имя и адрес класса, их можно посмотреть в MSDN.
Для их получения непосредственно из репозитория у меня есть другой инструмент, но об этом в следующий раз.