Hallo Leute!
Update 18.10.2011
Komplet überarbeitet, 8 Funktionen hinzu gefügt die WMI.au3 umfasst aufrufe von Namespace, Class, Property, Qualifiers usw.
WMI-Display auch umgeschrieben.
Durch ein Tipp von BugFix bin ich auf Scriptomatic gekommen das die WMI
abfragen super erleichtert das was mich aber immer gestört hat sind die ewigen
MsgBox gut man kann sich die Skripte abspeichern und bearbeiten so wie man es gerade brauchet aber ich will
mit allen Individuell arbeiten und darum habe ich angefangen die WMI.au3 zu schrieben.
WMI.au3
Spoiler anzeigen
#include-once
;########################################
; 18.10.2011 12:00 Kleiner AutoIt.de
;########################################
Global $save_wmi
;===================================================================================================================================#
;Function Name....: WMI_EnumNamespaces($ComputerName = @ComputerName)
;
;Description......: Auflistung der Ebenen
;Return Value(s)..: Array
; @error.: -1 Ebene o. ComputerName = Leer
;
;Author(s)........: Kleiner (http://www.autoit.de)
;===================================================================================================================================#
Func WMI_EnumNamespaces($ComputerName = @ComputerName)
If Not $ComputerName Then Return SetError(1, 0, -1)
$save_wmi = ''
EnumNamespaces_R('root', $ComputerName)
If @error Then Return SetError(1, 0, -2)
Return StringSplit(StringTrimLeft($save_wmi, 1), '|', 2)
EndFunc ;==>WMI_EnumNamespaces
Func EnumNamespaces_R($strNamespace, $ComputerName)
Local $objWMIService = ObjGet('winmgmts:\\' & $ComputerName & '\' & $strNamespace)
If Not IsObj($objWMIService) Then Return SetError(1, 0, -1)
Local $colNameSpaces = $objWMIService.InstancesOf('__NAMESPACE')
For $objNameSpace In $colNameSpaces
$save_wmi &= '|' & ($strNamespace & '\' & $objNameSpace.Name)
EnumNamespaces_R(($strNamespace & '\' & $objNameSpace.Name), $ComputerName)
Next
EndFunc ;==>EnumNamespaces_R
;===================================================================================================================================#
;Function Name....: WMI_EnumClass($ComputerName = @ComputerName, $Namespaces = 'root', $Filter = 'dynamic')
;
;Description......: Classen auflisten
;$ComputerName....: Computer Name Übegeben [localhost Standart]
;$Namespaces......: Ebene übergeben [root Standart]
;$Filter..........: Filter übergeben [dynamic Standart]
;Return Value(s)..: Array
; @error.: -1 Ebene o. Computer Name = Leer
; -2 Kein Objekt
;
;Author(s)........: Kleiner (http://www.autoit.de)
;===================================================================================================================================#
Func WMI_EnumClass($Namespaces = 'root\CIMV2', $ComputerName = @ComputerName, $Filter = 'dynamic')
If $ComputerName And $Namespaces And $Filter Then
Local $objWMIService = ObjGet('winmgmts:\\' & $ComputerName & '\' & $Namespaces)
If Not IsObj($objWMIService) Then Return SetError(1, 1, -2)
Local $Return_Array
For $objClass In $objWMIService.SubclassesOf()
For $objClassQualifier In $objClass.Qualifiers_
If Not $Filter Then
$Return_Array &= '|' & $objClass.Path_.Class
Else
If $objClassQualifier.Name = $Filter Then $Return_Array &= '|' & $objClass.Path_.Class
EndIf
Next
Next
If $Filter Then Return StringSplit(StringTrimLeft($Return_Array, 1), '|', 2)
$Return_Array = StringSplit(StringTrimLeft($Return_Array, 1), '|', 2)
If IsArray($Return_Array) Then Return ___ArrayUnique($Return_Array)
Return SetError(1, 0, -3)
EndIf
Return SetError(1, 0, -1)
EndFunc ;==>WMI_EnumClass
;===================================================================================================================================#
;Function Name....: WMI_Get($Namespaces, $sClass, $ComputerName = @ComputerName)
;
;Description......: WMI abfrage [einfache Read Funktionen]
;$Namespaces......: Ebene übergeben
;$sClass..........: Class übergeben
;$ComputerName....: Computer Name Übegeben [localhost Standart]
;Return Value(s)..: Array
; @error.: -1 Ebene o. Class o. Computer Name = Leer
; -2 Kein Objekt
; -3 Keine Eigenschalften gefunden
;
;Author(s)........: Kleiner (http://www.autoit.de)
;====================================================================================================================================#
Func WMI_Get($Namespaces, $sClass, $ComputerName = @ComputerName)
If Not $Namespaces Or Not $sClass Or Not $ComputerName Then Return SetError(1, 0, -1)
Local $objWMIService = ObjGet('winmgmts:\\' & $ComputerName & '\' & $Namespaces)
Local $objClass = $objWMIService.Get($sClass)
If Not IsObj($objClass) Then SetError(1, 0, -2)
[/autoit] [autoit][/autoit] [autoit]Local $Row = 0
Local $aReturn[2][250]
Local $aProperty[250][2]
For $objProperty In $objClass.Properties_()
If $objProperty.IsArray = True Then
$aProperty[$Row][0] = '$objItem.' & $objProperty.Name & '(0)'
$aReturn[0][$Row] = $objProperty.Name
ElseIf $objProperty.CIMTYPE = 101 Then
$aProperty[$Row][0] = '$objItem.' & $objProperty.Name
$aReturn[0][$Row] = $objProperty.Name
$aProperty[$Row][1] = 'Time'
Else
$aProperty[$Row][0] = '$objItem.' & $objProperty.Name
$aReturn[0][$Row] = $objProperty.Name
EndIf
$Row += 1
Next
If Not $Row Then Return SetError(1, 0, -3)
ReDim $aProperty[$Row][2]
$Row = 1
Local $UB = UBound($aProperty)
ReDim $aReturn[Int(15999999 / $UB)][$UB]
For $objItem In $objWMIService.ExecQuery('SELECT * FROM ' & $sClass)
For $i = 0 To $UB - 1
$aReturn[$Row][$i] = IIF(Not $aProperty[$i][1], Execute($aProperty[$i][0]), StringToDate(Execute($aProperty[$i][0])))
Next
$Row += 1
Next
ReDim $aReturn[$Row][$UB]
Return $aReturn
EndFunc ;==>WMI_Get
;===================================================================================================================================#
;Function Name....: WMI_PropertyZWBS($Namespaces, $sClass, $ComputerName = @ComputerName)
;
;Description......: Zur weiterbesrbetung Speichern - Classen eigenschaften auflisten
;$Namespaces......: Ebene übergeben [root Standart]
;$sClass..........: Class übergeben
;$ComputerName....: Computer Name Übegeben [localhost Standart]
;Return Value(s)..: 2D Array[Property][Datum o. nicht wird mit Time gekenzeichnet]
; @error.: -1 Ebene o. Computer Name = Leer
; -2 Kein Objekt
;
;Author(s)........: Kleiner (http://www.autoit.de)
;===================================================================================================================================#
Func WMI_PropertyZWBS($Namespaces, $sClass, $ComputerName = @ComputerName)
If Not $Namespaces Or Not $sClass Or Not $ComputerName Then Return SetError(1, 0, -1)
Local $objWMIService = ObjGet('winmgmts:\\' & $ComputerName & '\' & $Namespaces)
Local $objClass = $objWMIService.Get($sClass)
If Not IsObj($objClass) Then SetError(1, 0, -2)
[/autoit] [autoit][/autoit] [autoit]Local $Row = 0
Local $aReturn[2][250]
Local $aProperty[250][2]
For $objProperty In $objClass.Properties_()
[/autoit] [autoit][/autoit] [autoit]If $objProperty.IsArray = True Then
$aProperty[$Row][0] = '$objItem.' & $objProperty.Name & '(0)'
$aReturn[0][$Row] = $objProperty.Name
ElseIf $objProperty.CIMTYPE = 101 Then
$aProperty[$Row][0] = '$objItem.' & $objProperty.Name
$aReturn[0][$Row] = $objProperty.Name
$aProperty[$Row][1] = 'Time'
Else
$aProperty[$Row][0] = '$objItem.' & $objProperty.Name
$aReturn[0][$Row] = $objProperty.Name
EndIf
$Row += 1
Next
If Not $Row Then Return SetError(1, 0, -3)
ReDim $aProperty[$Row][2]
Return $aProperty
EndFunc ;==>WMI_PropertyZWBS
;===================================================================================================================================#
;Function Name....: WMI_ClassProperty($Namespaces, $sClass, $ComputerName = @ComputerName)
;
;Description......: Classen eigenschaften auflisten
;$Namespaces......: Ebene übergeben [root Standart]
;$sClass..........: Class übergeben
;$ComputerName....: Computer Name Übegeben [localhost Standart]
;Return Value(s)..: Array[Property]
; @error.: -1 Ebene, Classe o. Computer Name = Leer
; -2 Kein Objekt
;
;Author(s)........: Kleiner (http://www.autoit.de)
;===================================================================================================================================#
Func WMI_ClassProperty($Namespaces, $sClass, $ComputerName = @ComputerName)
If $ComputerName And $Namespaces And $sClass Then
Local $objClass = ObjGet('winmgmts:\\' & $ComputerName & _
'\' & $Namespaces & ':' & $sClass)
If Not IsObj($objClass) Then Return SetError(1, 0, -2)
Local $Save_Property
For $objClassProperty In $objClass.Properties_
$Save_Property &= '|' & $objClassProperty.Name
Next
Return StringSplit(StringTrimLeft($Save_Property, 1), '|', 2)
EndIf
Return SetError(1, 0, -1)
EndFunc ;==>WMI_ClassProperty
;===================================================================================================================================#
;Function Name....: WMI_ClassMethods($Namespaces, $sClass, $ComputerName = @ComputerName)
;
;Description......: Classen Methoden auflisten
;$Namespaces......: Ebene übergeben [root Standart]
;$sClass..........: Class übergeben
;$ComputerName....: Computer Name Übegeben [localhost Standart]
;Return Value(s)..: Array[Property]
; @error.: -1 Ebene, Classe o. Computer Name = Leer
; -2 Kein Objekt
;
;Author(s)........: Kleiner (http://www.autoit.de)
;===================================================================================================================================#
Func WMI_ClassMethods($Namespaces, $sClass, $ComputerName = @ComputerName)
If $ComputerName And $Namespaces And $sClass Then
Local $objClass = ObjGet('winmgmts:\\' & $ComputerName & _
'\' & $Namespaces & ':' & $sClass)
If Not IsObj($objClass) Then Return SetError(1, 0, -2)
Local $Save_Klass
For $objClassMethod In $objClass.Methods_
$Save_Klass &= '|' & $objClassMethod.Name
Next
Return StringSplit(StringTrimLeft($Save_Klass, 1), '|', 2)
EndIf
Return SetError(1, 0, -1)
EndFunc ;==>WMI_ClassMethods
;===================================================================================================================================#
;Function Name....: WMI_ClassQualifiers($Namespaces, $sClass, $ComputerName = @ComputerName)
;
;Description......: Classen Qualifiers auflisten
;$Namespaces......: Ebene übergeben [root Standart]
;$sClass..........: Class übergeben
;$ComputerName....: Computer Name Übegeben [localhost Standart]
;Return Value(s)..: Array[Property]
; @error.: -1 Ebene, Classe o. Computer Name = Leer
; -2 Kein Objekt
;
;Author(s)........: Kleiner (http://www.autoit.de)
;===================================================================================================================================#
Func WMI_ClassQualifiers($Namespaces, $sClass, $ComputerName = @ComputerName)
If $ComputerName And $Namespaces And $sClass Then
Local $objClass = ObjGet('winmgmts:\\' & $ComputerName & _
'\' & $Namespaces & ':' & $sClass)
If Not IsObj($objClass) Then Return SetError(1, 0, -2)
Local $strQualifier
For $objClassQualifier In $objClass.Qualifiers_
If IsArray($objClassQualifier.Value) Then
$strQualifier &= '|' & $objClassQualifier.Name & ' = ' & _
$objClassQualifier.Value(0)
Else
$strQualifier &= '|' & $objClassQualifier.Name & ' = ' & _
$objClassQualifier.Value
EndIf
Next
Return StringSplit(StringTrimLeft($strQualifier, 1), '|', 2)
EndIf
Return SetError(1, 0, -1)
EndFunc ;==>WMI_ClassQualifiers
;===================================================================================================================================#
;Function Name....: WMI_ClassDescription($Namespaces, $sClass, $ComputerName = @ComputerName, $Flag = False)
;
;Description......: Classen Beschreibung auflisten
;$Namespaces......: Ebene übergeben [root Standart]
;$sClass..........: Class übergeben
;$ComputerName....: Computer Name Übegeben [localhost Standart]
;$Flag............: True vollständige anzeige - False teilanzeige
;Return Value(s)..: String
; @error.: -1 Ebene, Classe o. Computer Name = Leer
; -2 Kein Objekt
;
;Author(s)........: Kleiner (http://www.autoit.de)
;===================================================================================================================================#
Func WMI_ClassDescription($Namespaces, $sClass, $ComputerName = @ComputerName, $Flag = False)
If $ComputerName And $Namespaces And $sClass Then
Local $objClass = ObjGet('winmgmts:\\' & $ComputerName & '\' & $Namespaces)
If Not IsObj($objClass) Then Return SetError(1, 0, -2)
If IsBool($Flag) And $Flag Or Not IsBool($Flag) And $Flag Then
$Flag = 0x020000
ElseIf Not IsBool($Flag) Or Not $Flag Then
$Flag = 0
EndIf
Return $objClass.Get($sClass, $Flag).GetObjectText_
EndIf
Return SetError(1, 0, -1)
EndFunc ;==>WMI_ClassDescription
;####### Hilfe Funktionen ##############################################################################
[/autoit] [autoit][/autoit] [autoit]Func ___ArrayUnique(Const ByRef $aArray)
Local $sHold, $vDelim = '|'
For $i = 0 To UBound($aArray) - 1
If Not _StringCount($sHold, $aArray[$i]) Then $sHold &= $vDelim & $aArray[$i]
Next
If $sHold Then Return StringSplit(StringTrimLeft($sHold, StringLen($vDelim)), $vDelim, 2)
Return SetError(2, 0, 0)
EndFunc ;==>___ArrayUnique
Func _StringCount($sText, $sFind, $sense = 1)
StringReplace($sText, $sFind, '', 0, $sense)
Return @extended
EndFunc ;==>_StringCount
Func IIF($V_Expr, $F_True = True, $F_False = False)
If $V_Expr Then Return $F_True
Return $F_False
EndFunc ;==>IIF
Func StringToDate($Date)
Return (StringMid($Date, 5, 2) & '/' & StringMid($Date, 7, 2) & '/' & StringLeft($Date, 4) & ' ' & StringMid($Date, 9, 2) & ':' & StringMid($Date, 11, 2) & ':' & StringMid($Date, 13, 2))
EndFunc ;==>StringToDate
;########################################################################################################
[/autoit]WMI-Display
Spoiler anzeigen
; Beispiel .... Kleiner Explorer
;########################################
; 18.10.2011 12:00 Kleiner AutoIt.de
;########################################
#include 'Array.au3'
#include 'WMI.au3'
Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit]Global $Form
Local $Comm[2], $Button[7]
Local $Old = '', $SetComm0, $SetComm1, $aReturn
$Form = GUICreate('WMI-Explorer', 650, 80, -1, -1)
GUISetOnEvent(-3, 'E')
$Comm[0] = GUICtrlCreateCombo('', 5, 10, 300, 25)
GUICtrlSetTip(-1, 'Namespaces')
$Comm[1] = GUICtrlCreateCombo('', 5, 50, 300, 25)
GUICtrlSetTip(-1, 'Klassen')
$Button[0] = GUICtrlCreateButton('Class List', 305, 50, 80, 25)
GUICtrlSetOnEvent(-1, 'Menu')
$Button[1] = GUICtrlCreateButton('WMI_Get', 400, 0, 80, 25)
GUICtrlSetOnEvent(-1, 'Menu')
$Button[2] = GUICtrlCreateButton('WMI_PropertyZWBS', 520, 00, 120, 25)
GUICtrlSetOnEvent(-1, 'Menu')
$Button[3] = GUICtrlCreateButton('WMI_ClassProperty', 520, 25, 120, 25)
GUICtrlSetOnEvent(-1, 'Menu')
$Button[4] = GUICtrlCreateButton('WMI_ClassMethods', 520, 50, 120, 25)
GUICtrlSetOnEvent(-1, 'Menu')
$Button[5] = GUICtrlCreateButton('WMI_ClassQualifiers', 400, 25, 120, 25)
GUICtrlSetOnEvent(-1, 'Menu')
$Button[6] = GUICtrlCreateButton('WMI_ClassDescription', 400, 50, 120, 25)
GUICtrlSetOnEvent(-1, 'Menu')
GUISetState()
SplashTextOn('Bitte warten!', 'WMI Namespaces werden geladen Bitte warten ....!', 200, 100, -1, -1)
$SetComm0 = WMI_EnumNamespaces()
GUICtrlSetData($Comm[0], _ArrayToString($SetComm0))
SplashOff()
Func Menu()
Switch @GUI_CtrlId
Case $Button[0]
If GUICtrlRead($Comm[0]) <> $Old Then
GUICtrlSetData($Comm[1], '')
SplashTextOn('Bitte warten!', 'WMI Classen werden geladen Bitte warten ....!', 200, 100, -1, -1)
$Old = GUICtrlRead($Comm[0])
$SetComm1 = WMI_EnumClass($Old)
GUICtrlSetData($Comm[1], _ArrayToString($SetComm1))
SplashOff()
EndIf
Case $Button[1]
Menu_Execute(@GUI_CtrlId)
Case $Button[2]
Menu_Execute(@GUI_CtrlId)
Case $Button[3]
Menu_Execute(@GUI_CtrlId)
Case $Button[4]
Menu_Execute(@GUI_CtrlId)
Case $Button[5]
Menu_Execute(@GUI_CtrlId)
Case $Button[6]
If Not GUICtrlRead($Comm[0]) Or Not GUICtrlRead($Comm[1]) Then Return MsgBox(0, 0, 'Einer der Comboboxen ist leer!')
MsgBox(0, 'Info', WMI_ClassDescription(GUICtrlRead($Comm[0]), GUICtrlRead($Comm[1])))
EndSwitch
EndFunc ;==>Menu
Func Menu_Execute($iD)
If Not GUICtrlRead($Comm[0]) Or Not GUICtrlRead($Comm[1]) Then Return MsgBox(0, 0, 'Einer der Comboboxen ist leer!')
If GUICtrlRead($Comm[0]) <> $Old Then Return MsgBox(0, 0, 'Bitte neue Klasse wählen!')
Local $Contro_Name = GUICtrlRead($iD, 1)
SplashTextOn('Bitte warten!', $Contro_Name & ' wird ausgeführt Bitte warten ....!', 200, 100, -1, -1)
$aReturn = Call($Contro_Name, GUICtrlRead($Comm[0]), GUICtrlRead($Comm[1]))
SplashOff()
If Not IsArray($aReturn) Then Return MsgBox(0, 0, ' Keine Info´s gefunden!')
_ArrayDisplay($aReturn)
EndFunc ;==>Menu_Execute
Func E()
Exit
EndFunc ;==>E
While 1 * Sleep(10)
WEnd
Erst mal !
LG Kleiner