WMI(Windows Management Instrumentation) 기술은 Microsoft에서 제공하는 Windows 기반 시스템 관리 도구입니다. 이 도구를 통해 클라이언트 시스템의 거의 모든 정보를 로컬로 또는 클라이언트 시스템에서 관리할 수 있습니다. 많은 전문 네트워크 관리 도구가 WMI를 기반으로 개발되었습니다. 이 도구는 Win2000 및 WinNT에서는 표준 도구이고 Win9X에서는 확장 설치 옵션입니다. 이 기사에서는 VB 프로그래밍을 통해 WMI 개체 프로그래밍에 액세스하는 방법을 소개합니다.
먼저 WMI를 통해 시스템 정보를 얻는 간단한 예를 살펴보겠습니다. 이 예에서는 WMI 개체를 통해 시스템에서 실행 중인 프로세스를 얻습니다.
함수Enum1()AsString
DimWMI
SetWMI=GetObject(WinMgmts:)
Setobjs=WMI.InstancesOf(Win32_PROcess)
ForEachobjInobjs
Enum1=Enum1 obj.설명 Chr(13) Chr(10)
다음
EndFunction
위 코드에서 WMI 개체는 먼저 GetObject(WinMgmts:)를 통해 획득됩니다. WMI 개체 아래에는 많은 하위 항목이 있습니다. 여기서는 WMI.InstancesOf(Win32_Process)를 통해 시스템의 모든 프로세스 목록 하위 항목을 얻습니다.
WMI 개체에 액세스하는 전체 예를 살펴보겠습니다. 이 예에서는 컴퓨터 정보를 얻습니다.
새 프로젝트를 만들고 TextBox 컨트롤과 CommandButton 컨트롤을 Form1에 추가한 후 CommandButton의 Click 이벤트에 다음 코드를 작성합니다.
PrivateSubCommand1_Click()
밝기, 시스템, 아이템
DimiAsInteger
SetSystem=GetObject(winmgmts:).InstancesOf(Win32_ComputerSystem)
각 항목InSystem의 경우
'List1.AddItemitem.cputype
s=컴퓨터정보&vbCrLf
s=s&****************************&vbCrLf
s=s&컴퓨터 이름:&item.name&vbCrLf
s=s&상태:&item.Status&vbCrLf
s=s&유형:&item.SystemType&vbCrLf
s=s제조업체:&item.제조업체&vbCrLf
s=s&모델:&item.Model&vbCrLf
s=s&메모리:~&item.totalPhysicalMemory/1024000&mb&vbCrLf
s=s&도메인:&item.domain&vbCrLf
작업그룹과 도메인을 얻기 위한 's=s&Workgroup&item.Workgroup&vbCrLf' 옵션은 동시에 사용할 수 없습니다.
s=s&현재 사용자:&item.username&vbCrLf
s=s&부팅 상태&item.BootupState&vbCrLf
s=s&이 컴퓨터는&item.PrimaryOwnerName&vbCrLf에 속합니다.
s=s&시스템 유형&item.CreationClassName&vbCrLf
s=s&컴퓨터 유형&item.Description&vbCrLf
Fori=0To1'여기서는 2개의 시스템이 설치되어 있다고 가정합니다.
s=s&Chr(5)&시작 옵션&i&:&item.SystemStartupOptions(i)_
&vbCrLf
넥스티
다음
Text1.Text=s
EndSub
프로그램을 실행하고 Command1을 클릭하면 컴퓨터 정보가 textBox에 표시됩니다.
위 코드에서 프로그램은 GetObject(winmgmts:)를 통해 WMI 개체를 얻은 후 다음 Win32_ComputerSystem 하위 키를 얻고 Win32_ComputerSystem 개체의 하위 항목에 액세스하여 시스템의 정보를 얻습니다.
모든 시스템이 WMI를 지원하는 것은 아니며 일부 시스템에서는 제조업체와 같은 정보를 표시할 수 없습니다.
오늘날의 컴퓨터와 네트워크는 매우 복잡합니다. 예를 들어 시스템 하드웨어로는 마더보드, 하드 드라이브, 네트워크 카드 등이 있습니다.
소프트웨어 측면에서는 운영 체제, 시스템에 설치된 소프트웨어, 실행 중인 프로세스 등이 있습니다. 네트워크 측면에는 도메인, 작업 그룹 등이 포함됩니다. WMI를 사용하면 위의 모든 정보에 접근할 수 있지만, 위와 같은 항목을 사용하여 접근하려면 매우 번거로울 것입니다. 이를 위해 WMI는 SQL 문과 유사한 쿼리 문을 제공하며 이를 통해 WMI 개체 아래의 하위 항목을 얻을 수 있습니다.
다음은 시스템에 설치된 네트워크 카드를 순환하고 네트워크 카드의 MAC 주소를 반환하는 코드입니다.
PrivateFunctionMACAddress()AsString
Setobjs=GetObject(winmgmts:).ExecQuery(_
SELECTMACA주소&_
FROMWin32_NetworkAdapter&_
어디&_
((MACAddressIsNotNULL)&_
AND(제조업체<>&_
'마이크로소프트')))
ForEachobjInobjs
MACAddress=obj.MACAddress
종료 대상
Nextobj
EndFunction
위 코드는 WMI 개체를 얻은 다음 ExecQuery를 실행하여 WMI 쿼리 문을 실행하여 설치된 네트워크 카드를 얻고 네트워크 카드의 MAC 주소를 반환합니다.
WMI는 또한 이벤트 처리를 지원하므로 프로그램이 프로그램 실행 및 닫기, 이동식 드라이브 삽입 및 제거 등과 같은 시스템 이벤트를 처리할 수 있습니다. 다음은 시스템에서 실행되는 프로그램을 모니터링할 수 있는 프로그램입니다.
먼저 새 프로젝트를 만든 다음 메뉴에서 프로젝트 참조 항목을 클릭하고 참조 목록에서 MicrosoftWMIScriptingLibrary를 선택한 다음 WMI 개체 라이브러리를 프로젝트에 추가합니다. 그런 다음 Form1에 ListBox 컨트롤을 추가하고 Form1에 다음 코드를 추가합니다.
OptionExplicit
DimLocatorAsSWbemLocator
DimServicesAsSWbemServices
DimWithEventsStatusSinkAsSWbemSink
PrivateSubKillEvents()
상태싱크.취소
SetStatusSink=아무것도 없음
EndSub
PrivateSubForm_Load()
DimQueryAsString
SetStatusSink=NewSWbemSink
SetLocator=CreateObject(WbemScripting.SWbemLocator)
SetServices=Locator.ConnectServer()
쿼리=SELECT*FROM__InstanceCreationEvent
쿼리=WITHIN1 쿼리
쿼리=WHERETargetInstanceISA'Win32_Process' 쿼리
Services.ExecNotificationQueryAsyncStatusSink,쿼리
EndSub
PrivateSubStatusSink_OnObjectReady(ByValStatusEventAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
디마르
DimstrQueAsString
DimiAsInteger
목록1.지우기
arr=Split(StatusEvent.GetObjectText_,Chr(10))
Fori=LBound(arr)ToUBound(arr)
List1.AddItemarr(i)
넥스티
EndSub
PrivateSubStatusSink_OnCompleted(ByValHResultAsWbemErrorEnum,_
ByValErrorObjectAsSWbemObject,_
ByValEventContextAsSWbemNamedValueSet)
IfHResult<>wbemErrCallCancelledThen
'오류 처리
종료
EndSub
위 프로그램에서는 SWbemSink 개체 StatusSink가 정의된 다음 SWbemServices 개체 Server가 생성되고 StatusSink가 Server 개체에 연결됩니다. 이런 방식으로 StatusSink를 통해 프로그램 실행을 모니터링할 수 있습니다.
프로그램을 실행한 후 임의의 프로그램을 실행하면 실행 중인 프로그램의 정보가 Form1의 ListBox에 나열됩니다.
WMI 애플리케이션의 가장 강력한 측면은 웹 페이지를 통해 원격 관리를 실현할 수 있다는 것입니다. 다음으로, 위의 VB 프로그램처럼 시스템에서 실행되는 프로그램을 동적으로 모니터링할 수 있는 HTML 페이지를 만들어 보겠습니다. 모니터링 시스템에서 실행되는 프로그램의 HTML 코드는 다음과 같습니다.
<html>
<머리>
<objectID=mysinkCLASSID=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></object>
</머리>
<스크립트>
functionwindow.onload()
{
varlocator=newActiveXObject(WbemScripting.SWbemLocator);
varservice=locator.ConnectServer();
szQuery=SELECT*FROM__InstanceCreationEvent;
szQuery =WITHIN1;
szQuery =WHERETargetInstanceISA'Win32_Process';
service.ExecNotificationQueryAsync(mysink,szQuery);
}
</스크립트>
<scriptFOR=mysinkEVENT=OnObjectReady(obj,objAsyncContext)>
document.all.info.innerHTML =obj.TargetInstance.Name <br>;
</스크립트>
<본문>
<스팬ID=정보></스팬>
</본문>
</html>
코드가 포함된 페이지 파일을 Htm 접미사로 저장합니다. 두 번 클릭하여 웹 페이지를 연 다음, 프로그램을 실행합니다. 실행 중인 프로그램의 파일 이름이 웹 페이지에 나열됩니다.
위 내용은 WMI의 응용 프로그램을 간략하게 소개한 것입니다. 실제로 WMI 개체의 작동은 매우 복잡하고 기능도 매우 강력합니다. 예를 들어 WMI를 사용하면 서버의 전체 LAN에 있는 컴퓨터를 모니터링하고 소프트웨어를 설치할 수 있습니다. LAN에 있는 컴퓨터에 일괄 처리합니다(예: 바이러스 백신 소프트웨어). 페이지를 통해 원격으로 서버에 접속하고, 서버를 제어하여 프로그램 실행, 사용자 추가 등을 할 수 있습니다. 더 많은 WMI 애플리케이션을 보려면 MSDN의 WMI 개발 홈페이지를 방문하세요.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmistart_5kth.asp
더 많은 정보를 얻으세요.
->