Технология WMI (Windows Management Instrumentation) — это инструмент управления системой под Windows, предоставляемый Microsoft. С помощью этого инструмента почти всей информацией в клиентской системе можно управлять локально или в самой клиентской системе. Многие профессиональные инструменты управления сетью разработаны на основе WMI. Этот инструмент является стандартным инструментом для Win2000 и WinNT и расширенным вариантом установки для Win9X. В этой статье будет показано, как получить доступ к объектному программированию WMI через программирование VB.
Сначала давайте рассмотрим простой пример получения системной информации через WMI. В этом примере процессы, запущенные в системе, получаются через объекты WMI:
ФункцияEnum1()AsString
ДимWMI
SetWMI=GetObject(WinMgmts:)
Setobjs=WMI.InstancesOf(Win32_PROcess)
ForEachobjInobjs
Enum1=Объект Enum1.Описание Chr(13) Chr(10)
Следующий
Конечнаяфункция
В приведенном выше коде объект WMI сначала получается через GetObject(WinMgmts:). В объекте WMI имеется множество подэлементов. Здесь мы получаем все подэлементы списка процессов в системе через WMI.InstancesOf(Win32_Process).
Давайте рассмотрим полный пример доступа к объектам WMI. В этом примере происходит получение информации о компьютере.
Создайте новый проект, добавьте элемент управления TextBox и элемент управления CommandButton в форму Form1 и напишите следующий код в событии Click элемента управления CommandButton:
PrivateSubCommand1_Click()
Затемняет,Система,элемент
ДимиАсИнтегер
SetSystem=GetObject(winmgmts:).InstancesOf(Win32_ComputerSystem)
ForEachitemInSystem
'Список1.AddItemtem.cputype
s=ComputerInfo&vbCrLf
s=s&******************************&vbCrLf
s=s&имя компьютера:&item.name&vbCrLf
s=s&Status:&item.Status&vbCrLf
s=s&type:&item.SystemType&vbCrLf
s=s&Производитель:&item.Производитель&vbCrLf
s=s&model:&item.Model&vbCrLf
s=s&memory:~&item.totalPhysicalMemory/1024000&mb&vbCrLf
s=s&домен:&item.domain&vbCrLf
Параметр 's=s&Workgroup&item.Workgroup&vbCrLf' для получения рабочей группы и домена не может использоваться одновременно.
s=s&текущий пользователь:&item.имя_пользователя&vbCrLf
s=s&состояние загрузки&item.BootupState&vbCrLf
s=s&Этот компьютер принадлежит&item.PrimaryOwnerName&vbCrLf
s=s&тип системы&item.CreationClassName&vbCrLf
s=s&Тип компьютера&элемент.Описание&vbCrLf
Fori=0To1' Здесь предполагается, что установлены две системы
s=s&Chr(5)&Параметры запуска&i&:&item.SystemStartupOptions(i)_
&vbCrLf
Nexti
Следующий
Text1.Text=s
EndSub
Запустите программу, нажмите Command1, и информация о компьютере отобразится в текстовом поле.
В приведенном выше коде программа получает объект WMI через GetObject(winmgmts:), затем получает следующий подраздел Win32_ComputerSystem и получает информацию в системе, обращаясь к подэлементам объекта Win32_ComputerSystem.
Следует отметить, что не все системы поддерживают WMI, а в некоторых системах не может отображаться такая информация, как производитель.
Сегодняшние компьютеры и сети очень сложны. Например, что касается системного оборудования, то это материнские платы, жесткие диски, сетевые карты...
Что касается программного обеспечения, то это операционные системы, программное обеспечение, установленное в системе, запущенные процессы и т. д. Сетевые аспекты включают домены, рабочие группы и т. д. Вы можете использовать WMI для доступа ко всей вышеперечисленной информации, но получить к ней доступ с помощью тех же элементов, что и выше, будет очень затруднительно. С этой целью WMI предоставляет оператор запроса, аналогичный оператору SQL, с помощью которого можно получить подэлементы объекта WMI.
Вот код, который проходит через сетевые карты, установленные в системе, и возвращает MAC-адрес сетевой карты:
PrivateFunctionMACAddress()AsString
Setobjs=GetObject(winmgmts:).ExecQuery(_
ВЫБРАТЬMACАдрес&_
FROMWin32_NetworkAdapter&_
ГДЕ&_
((MACAddressIsNotNULL)&_
И(Производитель<>&_
"Майкрософт")))
ForEachobjInobjs
MACAddress=obj.MACAddress
ВыходДля
Следующийобъект
Конечнаяфункция
Приведенный выше код получает объект WMI, а затем запускает ExecQuery для выполнения оператора запроса WMI, чтобы получить установленную сетевую карту и вернуть MAC-адрес сетевой карты.
WMI также поддерживает обработку событий, позволяя программам обрабатывать системные события, такие как запуск и закрытие программы, вставка и удаление съемных дисков и т. д. Ниже представлена программа, которая может отслеживать программы, работающие в системе.
Сначала создайте новый проект, затем щелкните элемент «Ссылки на проект» в меню, выберите MicrosoftWMIScriptingLibrary в списке ссылок и добавьте в проект библиотеку объектов WMI. Затем добавьте элемент управления ListBox в форму Form1, а затем добавьте в форму Form1 следующий код:
OptionExplicit
DimLocatorAsSWbemLocator
DimServicesAsSWbemServices
DimWithEventsStatusSinkAsSWbemSink
ПриватСубКиллЕвентс()
СтатусСинк.Отмена
SetStatusSink=Ничего
EndSub
PrivateSubForm_Load()
Димкуериеасстринг
SetStatusSink=NewSWbemSink
SetLocator=CreateObject(WbemScripting.SWbemLocator)
SetServices=Локатор.ConnectServer()
Query=SELECT*FROM__InstanceCreationEvent
Запрос=Запрос ВНУТРИ1
Запрос = Запрос WHERETargetInstanceISA'Win32_Process'
Services.ExecNotificationQueryAsyncStatusSink,Query
EndSub
PrivateSubStatusSink_OnObjectReady(ByValStatusEventAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
Димарр
DimstrQueAsString
ДимиАсИнтегер
Список1.Очистить
arr=Split(StatusEvent.GetObjectText_,Chr(10))
Fori=LBound(обр)ToUBound(обр)
List1.AddItemarr(i)
Nexti
EndSub
PrivateSubStatusSink_OnCompleted(ByValHResultAsWbemErrorEnum,_
ByValErrorObjectAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
IfHResult<>wbemErrCallCancelledThen
'Обработка ошибок
КонецЕсли
EndSub
В приведенной выше программе определяется объект StatusSink SWbemSink, затем создается объект Server SWbemServices, и StatusSink подключается к объекту Сервер. Таким образом, работу программы можно отслеживать через StatusSink.
Запустите программу, а затем запустите любую программу, и информация о запущенной программе может быть указана в списке ListBox формы Form1.
Самым мощным аспектом приложения WMI является то, что оно может осуществлять удаленное управление через WEB-страницу. Далее давайте создадим HTML-страницу, которая сможет динамически отслеживать программы, работающие в системе, например программу VB, приведенную выше. HTML-код программы, работающей в системе мониторинга, следующий:
<html>
<голова>
<objectID=mysinkCLASSID=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></object>
</голова>
<СКРИПТ>
функцияwindow.onload()
{
varlocator = newActiveXObject(WbemScripting.SWbemLocator);
varservice=locator.ConnectServer();
szQuery=SELECT*FROM__InstanceCreationEvent;
szQuery = ВНУТРИ1;
szQuery = WHERETargetInstanceISA'Win32_Process';
service.ExecNotificationQueryAsync(mysink,szQuery);
}
</СКРИПТ>
<scriptFOR=mysinkEVENT=OnObjectReady(obj,objAsyncContext)>
document.all.info.innerHTML =obj.TargetInstance.Name <br>;
</скрипт>
<тело>
<spanID=информация></диапазон>
</тело>
</html>
Сохраните файл подкачки с кодом как суффикс Htm. Дважды щелкните, чтобы открыть веб-страницу, а затем запустите программу. Имена файлов запущенных программ могут быть перечислены на веб-странице.
Вышеупомянутое кратко описывает применение WMI. На самом деле работа с объектами WMI очень сложна, а функции также очень мощны. Например, вы можете использовать WMI для мониторинга компьютеров во всей локальной сети на сервере и установки программного обеспечения. пакеты на компьютеры в локальной сети (например, антивирусное программное обеспечение). Доступ к серверу удаленно через страницу, управление сервером для запуска программ, добавление пользователей и т. д. Чтобы узнать больше о приложениях WMI, читатели могут посетить домашнюю страницу разработки WMI в MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmistart_5kth.asp
Получите больше информации.
->