<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; LangMF 9.0: просмотр классов WMI]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=2946&amp;type=atom" />
	<updated>2009-03-19T19:51:26Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=2946</id>
		<entry>
			<title type="html"><![CDATA[LangMF 9.0: просмотр классов WMI]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=20837#p20837" />
			<content type="html"><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Скрипт-утилита [WMIViewer2.mf] предназначена для просмотра классов WMI находящихся в заданном пространстве имен, просмотра свойств и методов выбранного класса. Также позволяет просматривать значение заданного свойства для всех экземпляров выбранного класса.&nbsp; </p><p>Потребуется установленный <a href="http://langmf.ru/ftp/archive/LangMF_9.0.exe">LangMF 9.0</a><br />OC WinXP</p><p>По мотивам статьи <a href="http://www.script-coding.com/WMI.html">[Введение в Windows Management Instrumentation (WMI)]</a>.</p><div class="codebox"><pre><code>
&lt;#Module=WMILocator&gt;

	Public ObjServices	&#039;Корневой объект пространства имен
	Public ISWbemObject	&#039;Объект класса

	Public IsRetreived
	Public StopList
	Public DataArrSort
	Public hWnd
	Public sBarhWnd
	Public ConnectSpace
	Public SubSpaceStr

	Const VK_ESCAPE = &amp;H1B
	Const LB_FINDSTRING = &amp;H18F
	Const SB_SETTEXT = &amp;H401

	Const WS_BORDER = &amp;H00800000
	Const WS_CHILD = &amp;H40000000
	Const WS_OVERLAPPED = 0
	Const WS_OVERLAPPEDWINDOW = &amp;H00CF0000
	Const WS_VISIBLE = &amp;H10000000

&#039;-----------------------------------------------------------------------------------------
Sub Load(cmdstr)

	Dim RootSpace
	
	On Error Resume Next

	&#039;[Запрос корневого пространства имен]
	&#039;---------------------------------------------------------------------------------
	RootSpace = InputBox( &quot;Укажите корневое пространство имен:&quot;, &quot;Подключение к пространству имен&quot;, &quot;winmgmts:\\.\root&quot;)
	If Len(RootSpace) = 0 Then 
		EndMF
		Exit Sub
	End If

	&#039;[Установка параметров формы]
	&#039;---------------------------------------------------------------------------------				
	With InitForm

		.Caption = &quot;Выбор пространства подключения&quot;
		.Width = 400*vbPx
		.Height = 150*vbPy
		.Style.ToolWindow = True
		.Style.CloseButton = False
		&#039;-------------------------------------------------------------------------
		.Add &quot;Label&quot;, 1, &quot;Left=5&quot;,&quot;Top=5&quot;,&quot;Width=380&quot;,&quot;Height=20&quot;, _
					&quot;Alignment=2&quot;,&quot;Caption=&quot;&quot;Подпространства имен WMI&quot;&quot;&quot;
		.Add &quot;Combo&quot;, 1,  &quot;Left=5&quot;,&quot;Top=30&quot;,&quot;Width=380&quot;,&quot;Height=30&quot;, _
					&quot;Alignment=2&quot;,&quot;Text= &quot;
		.Add &quot;Command&quot;, 10, &quot;Left=5&quot;,&quot;Top=75&quot;,&quot;Width=180&quot;,&quot;Height=30&quot;, _
					&quot;Caption=&quot;&quot;Подключить&quot;&quot;&quot;
		.Add &quot;Command&quot;, 20, &quot;Left=205&quot;,&quot;Top=75&quot;,&quot;Width=180&quot;,&quot;Height=30&quot;, _
					&quot;Caption=&quot;&quot;Закрыть&quot;&quot;&quot;,&quot;Cancel=True&quot;

		&#039;[Параметры оформления]
		&#039;------------------------------------------------------------------------
		For Each Control In .Controls
			On Error Resume Next
			With Control
				.FontName = &quot;Verdana&quot;
				.FontSize = 10
			End With
		Next

		&#039;[Заполнение раскрывающегося списка]
		&#039;------------------------------------------------------------------------
		WalkNamespace(RootSpace)
		.Combo(1).ListIndex = 0
		.Combo(1).SelLength = 0
		&#039;-------------------------------------------------------------------------
		.Visible=True
		DoEvents
	End With	
End Sub


&#039;---------------[Вывод возможных подпространств для корневого пространства имен]----------
&#039;-----------------------------------------------------------------------------------------
Sub WalkNamespace(NameSpaceStr)

	Dim ObjNameSpace
	Dim ColNamespaces

	On Error Resume Next
	&#039;--------------------------------------------------------------------------------
	Set ObjNameSpace = GetObject(NameSpaceStr)

		If Not IsObject(ObjNameSpace) Then 
			MsgBox &quot;Невозможно подключится к заданному пространству.&quot;,vbSystemModal + vbExclamation, &quot;Ошибка подключения&quot;
			EndMF
			Exit Sub
		End If
		
	Set ColNamespaces = ObjNameSpace.InstancesOf(&quot;__NAMESPACE&quot;)
		
	&#039;--------------------------------------------------------------------------------
	If ColNamespaces.count &gt; 0 Then
		For Each Obj In ColNamespaces
			Initform.Combo(1).AddItem NameSpaceStr &amp; &quot;\&quot; &amp; Obj.Name 
			DoEvents
			WalkNamespace NameSpaceStr &amp; &quot;\&quot; &amp; Obj.Name
		Next
	End If

End Sub

&#039;------------[Подключение к пространству имен и оформление формы]-------------------------
&#039;-----------------------------------------------------------------------------------------
Sub CreateWMIForm()

	On Error Resume Next

	&#039;[Установка параметров формы]
	&#039;----------------------------------------------------------------------------------	
	With WMIForm
		.Caption = &quot;WMI Class Viewer&quot;
		.Width = 780*vbPx
		.Height = 450*vbPy
		&#039;------------------------------------------------------------------------
		.Add &quot;Label&quot;, 1, &quot;Left=5&quot;,&quot;Top=5&quot;,&quot;Width=300&quot;,&quot;Height=20&quot;, _
					&quot;Alignment=2&quot;,&quot;Caption=&quot;&quot;Классы WBEM&quot;&quot;&quot;
		.Add &quot;List&quot;, 1,  &quot;Left=5&quot;,&quot;Top=25&quot;,&quot;Width=300&quot;,&quot;Height=300&quot;, _
					&quot;ToolTipText=&quot;&quot;Список классов&quot;&quot;&quot;
		&#039;------------------------------------------------------------------------
		.Add &quot;COption&quot;, 1, &quot;Left=5&quot;,  &quot;Top=310&quot;,&quot;Width=90&quot;,&quot;Height=30&quot;, _
					&quot;Caption=&quot;&quot;Системные Классы&quot;&quot;&quot;
		.Add &quot;COption&quot;, 2, &quot;Left=105&quot;,&quot;Top=310&quot;,&quot;Width=90&quot;,&quot;Height=30&quot;, _
					&quot;Caption=&quot;&quot;Классы CIM&quot;&quot;&quot;
		.Add &quot;COption&quot;, 3, &quot;Left=200&quot;,&quot;Top=310&quot;,&quot;Width=90&quot;,&quot;Height=30&quot;, _
					&quot;Caption=&quot;&quot;Классы Win32&quot;&quot;&quot;
		&#039;------------------------------------------------------------------------
		.Add &quot;Label&quot;, 2, &quot;Left=315&quot;,&quot;Top=5&quot;,&quot;Width=450&quot;,&quot;Height=20&quot;, _
					&quot;Alignment=2&quot;,&quot;Caption=&quot;&quot;Свойства класса&quot;&quot;&quot;
		.Add &quot;List&quot;, 2, &quot;Left=315&quot;,&quot;Top=25&quot;,&quot;Width=450&quot;,&quot;Height=100&quot;, _
					&quot;ToolTipText=&quot;&quot;Список свойств класса&quot;&quot;&quot;
		&#039;------------------------------------------------------------------------
		.Add &quot;Label&quot;, 3, &quot;Left=315&quot;,&quot;Top=115&quot;,&quot;Width=450&quot;,&quot;Height=20&quot;, _
					&quot;Alignment=2&quot;,&quot;Caption=&quot;&quot;Значение свойств[двойной щелчок чтобы скопировать в буфер]&quot;&quot;&quot;
		.Add &quot;List&quot;, 3, &quot;Left=315&quot;,&quot;Top=135&quot;,&quot;Width=450&quot;,&quot;Height=100&quot;, _
					&quot;ToolTipText=&quot;&quot;Список значений свойств для всех экземпляров класса&quot;&quot;&quot;
		&#039;------------------------------------------------------------------------
		.Add &quot;Label&quot;, 4, &quot;Left=315&quot;,&quot;Top=225&quot;,&quot;Width=450&quot;,&quot;Height=20&quot;, _
					&quot;Alignment=2&quot;,&quot;Caption=&quot;&quot;Методы класса&quot;&quot;&quot;
		.Add &quot;List&quot;, 4, &quot;Left=315&quot;,&quot;Top=245&quot;,&quot;Width=450&quot;,&quot;Height=100&quot;, _
					&quot;ToolTipText=&quot;&quot;Список методов класса&quot;&quot;&quot;
		&#039;------------------------------------------------------------------------
		.Add &quot;MText&quot;, 1, &quot;Left=5&quot;,&quot;Top=350&quot;,&quot;Width=300&quot;,&quot;Height=20&quot;, _
					&quot;ToolTipText=&quot;&quot;Поле ввода поиска класса&quot;&quot;&quot;

		&#039;------------------------------------------------------------------------
		.Add &quot;Command&quot;, 1, &quot;Left=315&quot;,&quot;Top=350&quot;,&quot;Width=200&quot;,&quot;Height=30&quot;, _
					&quot;Caption=&quot;&quot;Информация&quot;&quot;&quot;
		&#039;------------------------------------------------------------------------
		.Add &quot;Command&quot;, 2, &quot;Left=530&quot;,&quot;Top=350&quot;,&quot;Width=200&quot;,&quot;Height=30&quot;, _
					&quot;Caption=&quot;&quot;Выход&quot;&quot;&quot;
		
		&#039;[Параметры оформления]
		&#039;------------------------------------------------------------------------
		For Each Control In .Controls
			On Error Resume Next
			With Control
				.FontName = &quot;Verdana&quot;
				.FontSize = 10
			End With
		Next
		&#039;------------------------------------------------------------------------
		hWnd = .List(1).hWnd
		
	End With
	sBarhWnd = CreateStatusBar()

End Sub

&#039;---------------------[Получение массива имен классов WMI]--------------------------------
&#039;-----------------------------------------------------------------------------------------
Sub GetClassList()

	Dim DataArr()
	Dim ISWbemObjectSet

	On Error Resume Next	
	&#039;---------------------------------------------------------------------------------
	SendMsg sBarhWnd,SB_SETTEXT,0,&quot;Подождите...&quot;	


	Set ISWbemObjectSet = ObjServices.SubclassesOf() 
	&#039;---------------------------------------------------------------------------------
	i = 1
	For Each ISWbemObject In ISWbemObjectSet
		ReDim Preserve DataArr(i)
		DataArr(i-1) = ISWbemObject.Path_.Class
		i = i + 1
	
	Next
	&#039;---------------------------------------------------------------------------------
	IsRetreived = True
	DataArrSort = Sys.Sort(DataArr)

	SendMsg sBarhWnd,SB_SETTEXT,0,&quot;Готово&quot;

End Sub

&#039;-------------[Вывод списка классов WMI с учетом фильтра префикса класса]-----------------
&#039;-----------------------------------------------------------------------------------------
Sub FillClassList(Prefix)

	On Error Resume Next	

	WMIForm.List(1).Clear	
	StopList = True

	Set ISWbemObject = Nothing
	&#039;--------------------------------------------------------------------------------
	WMIForm.List(2).Clear	
	WMIForm.List(3).Clear
	WMIForm.List(4).Clear	
	&#039;--------------------------------------------------------------------------------
	SendMsg sBarhWnd, SB_SETTEXT, 0, &quot;Подождите...&quot;	

	WMIForm.Mtext(1).Text = Prefix
	&#039;--------------------------------------------------------------------------------	
	For Each ClsName In DataArrSort
		If InStr(1,ClsName,Prefix,1) Then WMIForm.List(1).AddItem ClsName 
		&#039;DoEvents
	Next
	&#039;--------------------------------------------------------------------------------
	SendMsg sBarhWnd,SB_SETTEXT,0,&quot;Готово&quot;


End Sub
&#039;-----------------------------------------------------------------------------------------


&#039;--------------[Вывод доступных свойств и методов заданного класса]-----------------------
&#039;-----------------------------------------------------------------------------------------
Sub FillAvailablePropsAndMethods()

	Dim ISWbemPropertySet, ISWbemMethodSet
	
	On Error Resume Next
	
	WMIForm.List(2).Clear	
	WMIForm.List(3).Clear
	WMIForm.List(4).Clear	
	&#039;--------------------------------------------------------------------------------
	Set ISWbemObject = Nothing	

	Set ISWbemObject = ObjServices.Get(WMIForm.List(1).Text)
	Set ISWbemPropertySet = Eval(&quot;ISWbemObject.Properties_&quot;)
	Set ISWbemMethodSet = Eval(&quot;ISWbemObject.Methods_&quot;)	
	Sys.Sleep(100)

	&#039;--------------------------------------------------------------------------------
	For Each ISWbemProperty In ISWbemPropertySet
		WMIForm.List(2).AddItem ISWbemProperty.Name
		DoEvents
	Next
	&#039;--------------------------------------------------------------------------------
	Sys.Sleep(100)

	For Each ISWbemMethod In ISWbemMethodSet
		WMIForm.List(4).AddItem ISWbemMethod.Name
		DoEvents
	Next
End Sub

&#039;---------[Вывод списка значений свойств для всех экземпляров выбранного класса]----------
&#039;-----------------------------------------------------------------------------------------
Sub ShowPropertySet()

	Dim ISWbemInstanceSet

	On Error Resume Next

	StopList = False
	WMIForm.List(3).Clear
	
	SendMsg sBarhWnd, SB_SETTEXT, 0, &quot;Подождите...[ESC чтобы остановить]&quot;
	&#039;--------------------------------------------------------------------------------
	Set ISWbemInstanceSet = Eval(&quot;ObjServices.Get(WMIForm.List(1).Text).Instances_(16+32)&quot;)

	For Each ISWbemInstance In ISWbemInstanceSet
		WMIForm.List(3).AddItem ISWbemInstance.Properties_.Item(WMIForm.List(2).Text).Value
		DoEvents
		Sys.Sleep(10)

		&#039; Остановить по нажатию ESC
		If CheckKeyState()&lt;&gt;0 Or StopList Then 
			StopList = False
			Exit Sub
		End If
	Next

	SendMsg sBarhWnd,SB_SETTEXT,0,&quot;Готово&quot;

End Sub

&#039;---------------------------[Проверка состояния клавиши ESC]------------------------------
&#039;-----------------------------------------------------------------------------------------
Function CheckKeyState()

	CheckKeyState = Sys.DynApi.CallFunction( _
					&quot;USER32.DLL&quot;, _
					&quot;GetAsyncKeyState&quot;, _
					VK_ESCAPE)
End Function

&#039;---------------------------[Посылка сообщения дочернему окну]----------------------------
&#039;-----------------------------------------------------------------------------------------
Function SendMsg(hWnd,MsgID,LParam,WParam)

	SendMsg = Sys.DynApi.CallFunction( _
					&quot;USER32.DLL&quot;, _
					&quot;SendMessageA&quot;, _
					hWnd, _
					MsgID, _
					LParam, _
					WParam)
	DoEvents
	
End Function

&#039;---------------------------[Создание строки состояния]----------------------------------
&#039;-----------------------------------------------------------------------------------------
Function CreateStatusBar()

	CreateStatusBar = Sys.DynApi.CallFunction( _
					&quot;COMCTL32.DLL&quot;, _
					&quot;CreateStatusWindowA&quot;, _
					WS_OVERLAPPEDWINDOW Or WS_VISIBLE Or WS_CHILD, _
					&quot;WBEM Class Viewer&quot;, _
					WMIForm.hWnd, _
					0)
	DoEvents	
End Function
&lt;#Module&gt;


&#039;-------------------------[Обработка событий окна управления]-----------------------------
&#039;-----------------------------------------------------------------------------------------
&lt;#Form=WMIForm&gt;
	&#039;---------------------------------------------------------------------------------
	Sub COption1_Click()
		FillClassList(&quot;__&quot;)
	End Sub
	&#039;---------------------------------------------------------------------------------
	Sub COption2_Click()
		FillClassList(&quot;CIM_&quot;)
	End Sub
	&#039;---------------------------------------------------------------------------------
	Sub COption3_Click()
		FillClassList(&quot;Win32_&quot;)
	End Sub
	&#039;---------------------------------------------------------------------------------
	Sub List1_Click()
		StopList = True	&#039;Для остановки вывода списка значений свойств
		SendMsg sBarhWnd,SB_SETTEXT,0,&quot;Класс: &quot; &amp; WMIForm.List(1).Text
		FillAvailablePropsAndMethods()
	End Sub
	&#039;---------------------------------------------------------------------------------
	Sub List2_Click()
		ShowPropertySet()
		SendMsg sBarhWnd,SB_SETTEXT,0,&quot;Свойство: &quot; &amp; WMIForm.List(2).Text
     	End Sub
	&#039;---------------------------------------------------------------------------------
	Sub List3_Click()
		SendMsg sBarhWnd,SB_SETTEXT,0,&quot;Значение: &quot; &amp; WMIForm.List(3).Text
	End Sub
	&#039;---------------------------------------------------------------------------------
	Sub List3_DblClick()

		Dim sTxt
		sTxt = CStr(WMIForm.List(3).Text)
		Sys.Clipboard.Clear 
		Sys.ClipBoard.SetText sTxt

		MsgBox sTxt &amp; vbCRLF &amp; &quot;[Скопировано в буфер обмена]&quot;, vbSystemModal + vbExclamation, &quot;Значение свойства.&quot;
	
	End Sub
	&#039;---------------------------------------------------------------------------------


	&#039;----------------------[Поиск по списку классов]---------------------------------
	&#039;---------------------------------------------------------------------------------
	Sub MText1_KeyUp(KeyCode,Shift) 

		Dim Data, Index

		On Error Resume Next

		Data = CStr(WMIForm.MText(1).Text)
		Index = SendMsg(hWnd,LB_FINDSTRING,-1,Data)
		WMIForm.List(1).Selected(Index) = True
		DoEvents
	End Sub

	&#039;------------------[Вывод описания входных параметров метода]---------------------
	&#039;---------------------------------------------------------------------------------
	Sub List4_Click()

		On Error Resume Next

		SendMsg sBarhWnd,SB_SETTEXT,0,&quot;Метод: &quot; &amp; WMIForm.List(4).Text

		MsgBox _
		&quot;Метод:&quot; &amp; WMIForm.List(4).Text &amp; vbCR &amp; vbCR &amp; vbCR &amp; _
		Eval(&quot;ISWbemObject.Methods_(WMIForm.List(4).Text).InParameters.GetObjectText_&quot;), _
		vbSystemModal + vbExclamation,&quot;Описание входных параметров&quot;
	End Sub

	&#039;--------------------------[Вывод описания класса]--------------------------------
	&#039;---------------------------------------------------------------------------------
	Sub Command1_Click()

		Dim ObjPath
		Dim ObjText, Brd, FilePath
	
		On Error Resume Next
		
		If Not IsObject(ISWbemObject) Or WMIForm.List(1).ListIndex=-1 Then Exit Sub
		&#039;-------------------------------------------------------------------------
		Set ObjPath = Eval(&quot;ISWbemObject.Path_&quot;)
			ObjText = Replace(Eval(&quot;ISWbemObject.GetObjectText_&quot;),vbLF,vbCRLF,1)
			Brd = String(64,&quot;-&quot;)
		&#039;-------------------------------------------------------------------------
		StrInfo = Brd		&amp; vbCRLF &amp; _
			&quot;//Описание класса WMI//&quot;	&amp; vbCRLF &amp; _
			ObjText			&amp; vbCRLF &amp; _
			Brd			&amp; vbCRLF &amp; _
			&quot;//Пространство имен//&quot;	&amp; vbCRLF &amp; _
			ObjPath.NameSpace	&amp; vbCRLF &amp; _
			Brd			&amp; vbCRLF &amp; _
			&quot;//Сервер//&quot;		&amp; vbCRLF &amp; _
			ObjPath.Server		&amp; vbCRLF &amp; _				
			Brd			&amp; vbCRLF &amp; _
			&quot;//Строка подключения//&quot;	&amp; vbCRLF &amp; _
			ObjPath.DisplayName	&amp; vbCRLF &amp; _
			Brd	
			
		FilePath = Sys.WinInfo(&quot;temp&quot;) &amp; &quot;\cls_info.txt&quot;
		&#039;-------------------------------------------------------------------------
		Sys.Conv.Str2File StrInfo, FilePath
		Sys.Shell &quot;notepad.exe &quot; &amp; FilePath
		DoEvents
	End Sub
	&#039;---------------------------------------------------------------------------------
	Sub Command2_Click()
		WMIForm.UnloadForm
		InitForm.UnloadForm
		
	End Sub
	&#039;---------------------------------------------------------------------------------
	Sub Form_Unload()
		InitForm.UnloadForm
		
	End Sub
&lt;#Form&gt;


&#039;-----------------------------------------------------------------------------------------
&lt;#Form=InitForm&gt;

	&#039;[Подключение к заданному пространству имен с выводом данных]
	&#039;---------------------------------------------------------------------------------
	Sub Command10_Click()

		On Error Resume Next
		&#039;-------------------------------------------------------------------------
		Set ObjServices = Nothing
		Set ObjServices = GetObject(CStr(InitForm.Combo(1).Text))

		Sys.Sleep(100)
		&#039;-------------------------------------------------------------------------
		If Not IsObject(ObjServices) Then 
			MsgBox &quot;Невозможно подключится к заданному пространству.&quot;,vbSystemModal + vbExclamation, &quot;Ошибка подключения&quot;
			Exit Sub
		End If

		&#039;[Создание формы(в случае необходимости) и установка её параметров]
		&#039;--------------------------------------------------------------------------
		If Not WMIForm.Visible Then CreateWMIForm()

		IsRetreived = False
		StopList = False
		&#039;------------------------------------------------------------------------
			Sys.Sleep(200)
			GetClassList()
			WMIForm.Caption = &quot;WMI Class Viewer [&quot; &amp; CStr(InitForm.Combo(1).Text) &amp; &quot;]&quot;
			WMIForm.Style.ToolWindow = True
			WMIForm.COption(1).Value = True
			WMIForm.Visible = True
			DoEvents
			
			WMIForm.Left = 10*vbPx
			WMIForm.Top = 10*vbPy
			DoEvents

	End Sub
	&#039;---------------------------------------------------------------------------------
	Sub Command20_Click()
		InitForm.UnloadForm
		
	End Sub
	&#039;---------------------------------------------------------------------------------
	Sub Form_Unload()

		Set ObjServices	= Nothing
		Set ISWbemObject = Nothing
		Sys.Sleep(200)	

		EndMF
		DoEvents
	End Sub
&lt;#Form&gt;  
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2009-03-19T19:51:26Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=20837#p20837</id>
		</entry>
</feed>
