WMI.au3 - WMI-Display.au3

  • 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
    [autoit]

    #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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ;===================================================================================================================================#
    ;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

    [/autoit] [autoit][/autoit] [autoit]

    ;===================================================================================================================================#
    ;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)

    [/autoit] [autoit][/autoit] [autoit]

    Local $objWMIService = ObjGet('winmgmts:\\' & $ComputerName & '\' & $Namespaces)
    Local $objClass = $objWMIService.Get($sClass)

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsObj($objClass) Then SetError(1, 0, -2)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Row = 0
    Local $aReturn[2][250]
    Local $aProperty[250][2]

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    If Not $Row Then Return SetError(1, 0, -3)
    ReDim $aProperty[$Row][2]

    [/autoit] [autoit][/autoit] [autoit]

    $Row = 1
    Local $UB = UBound($aProperty)
    ReDim $aReturn[Int(15999999 / $UB)][$UB]

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ;===================================================================================================================================#
    ;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)

    [/autoit] [autoit][/autoit] [autoit]

    Local $objWMIService = ObjGet('winmgmts:\\' & $ComputerName & '\' & $Namespaces)
    Local $objClass = $objWMIService.Get($sClass)

    [/autoit] [autoit][/autoit] [autoit]

    If Not IsObj($objClass) Then SetError(1, 0, -2)

    [/autoit] [autoit][/autoit] [autoit]

    Local $Row = 0
    Local $aReturn[2][250]
    Local $aProperty[250][2]

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    $Row += 1
    Next

    [/autoit] [autoit][/autoit] [autoit]

    If Not $Row Then Return SetError(1, 0, -3)
    ReDim $aProperty[$Row][2]

    [/autoit] [autoit][/autoit] [autoit]

    Return $aProperty
    EndFunc ;==>WMI_PropertyZWBS

    [/autoit] [autoit][/autoit] [autoit]

    ;===================================================================================================================================#
    ;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

    [/autoit] [autoit][/autoit] [autoit]

    ;===================================================================================================================================#
    ;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

    [/autoit] [autoit][/autoit] [autoit]

    ;===================================================================================================================================#
    ;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

    [/autoit] [autoit][/autoit] [autoit]

    ;===================================================================================================================================#
    ;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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;####### 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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _StringCount($sText, $sFind, $sense = 1)
    StringReplace($sText, $sFind, '', 0, $sense)
    Return @extended
    EndFunc ;==>_StringCount

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func IIF($V_Expr, $F_True = True, $F_False = False)
    If $V_Expr Then Return $F_True
    Return $F_False
    EndFunc ;==>IIF

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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] [autoit][/autoit] [autoit]

    ;########################################################################################################

    [/autoit]

    WMI-Display

    Spoiler anzeigen
    [autoit]

    ; Beispiel .... Kleiner Explorer
    ;########################################
    ; 18.10.2011 12:00 Kleiner AutoIt.de
    ;########################################

    [/autoit] [autoit][/autoit] [autoit]

    #include 'Array.au3'
    #include 'WMI.au3'

    [/autoit] [autoit][/autoit] [autoit]

    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()

    [/autoit] [autoit][/autoit] [autoit]

    SplashTextOn('Bitte warten!', 'WMI Namespaces werden geladen Bitte warten ....!', 200, 100, -1, -1)
    $SetComm0 = WMI_EnumNamespaces()
    GUICtrlSetData($Comm[0], _ArrayToString($SetComm0))
    SplashOff()

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Func E()
    Exit
    EndFunc ;==>E

    [/autoit] [autoit][/autoit] [autoit]

    While 1 * Sleep(10)
    WEnd

    [/autoit]


    Erst mal !
    LG Kleiner

  • Hallo Kleiner27,

    ich habe mir dein Tool kurz angeschaut, gelungen :thumbup: .
    Du könntest aber die Func WMI_Display wie folgt ändern:

    [autoit]

    Func WMI_Display()
    If $b <> 0 Then
    _GUICtrlListView_DeleteAllItems($hLVHandle)
    For $i = $b To 0 Step -1
    _GUICtrlListView_DeleteColumn($hLVHandle, $i)
    Next
    EndIf
    $a = WMI_Comand(GUICtrlRead($comB))
    $b = UBound($a, 2)
    For $i = 0 To UBound($a, 2) - 1
    _GUICtrlListView_AddColumn($hLVHandle, $a[0][$i], 100)
    Next
    _ArrayDelete($a, 0)
    _GUICtrlListView_AddArray($SYS, $a)
    For $i = 0 To UBound($a, 2) - 1 ;<=== ab hier
    _GUICtrlListView_SetColumnWidth($SYS, $i, $LVSCW_AUTOSIZE)
    Next ;<=== bis hier eingefügt
    EndFunc ;==>WMI_Display

    [/autoit]

    mfg (Auto)Bert