#include<GUIConstantsEx.au3>
#include<WindowsConstants.au3>
; AutoIt ScriptOMatic
; -------------------
;
; AutoIt's counterpart of Microsoft's Scriptomatic
;
; Author: SvenP
; Date/version: 2005-04-17
; See also: <a href='http://www.microsoft.com/technet/scriptcenter/tools/scripto2.mspx' class='bbc_url' title='External link' rel='nofollow external'>http://www.microsoft.com/technet/scriptcenter/tools/scripto2.mspx</a>
; Requires: AutoIt beta version 3.1.1.8 or higher (COM support!!)
;
; GUI generated by AutoBuilder 0.5 Prototype
;************************
;* Global State Variables
;************************
$g_strCurrentNamespace = "\root\CIMV2"
$g_iCurrentNamespaceIndex = 0
$g_strWMISource = "localhost"
$g_strOutputFormat = "Dialog"
;************************
;* Main GUI
;************************
GuiCreate("AutoIt Scriptomatic Tool", 684, 561,(@DesktopWidth-684)/2, (@DesktopHeight-561)/2 , $WS_OVERLAPPEDWINDOW + $WS_VISIBLE + $WS_CLIPSIBLINGS)
$GUI_AST_MainGroup = GuiCtrlCreateGroup("", 10, 10,660,530)
$GUI_WMI_NamespaceLabel = GuiCtrlCreateLabel("WMI Namespace", 20, 30,150, 20)
$GUI_WMI_Namespace = GuiCtrlCreateCombo("WMI_Namespaces", 20, 50,280, 80)
$GUI_WMI_ClassLabel = GuiCtrlCreateLabel("WMI Class", 320, 30,240, 20)
$GUI_WMI_Classes = GuiCtrlCreateCombo("WMI_Classes", 320, 50,340, 80)
$GUI_AST_ButtonGroup = GuiCtrlCreateGroup("", 10, 80,660, 50)
$GUI_AST_Run = GuiCtrlCreateButton("Run", 20,100, 50, 20)
$GUI_AST_CIMv2 = GuiCtrlCreateButton("CIMv2", 80,100, 50, 20)
$GUI_AST_WMISource = GuiCtrlCreateButton("WMISource", 140,100, 70, 20)
$GUI_AST_Open = GuiCtrlCreateButton("Open", 220,100, 60, 20)
$GUI_AST_Save = GuiCtrlCreateButton("Save", 290,100, 60, 20)
$GUI_AST_Quit = GuiCtrlCreateButton("Quit", 360,100, 60, 20)
$GUI_AST_OptionGroup = GuiCtrlCreateGroup("Output", 430, 80,240, 50)
$GUI_AST_RadioDialog = GuiCtrlCreateRadio("Dialog", 440,100, 50, 20)
$GUI_AST_RadioText = GuiCtrlCreateRadio("Text", 510,100, 50, 20)
$GUI_AST_RadioHTML = GuiCtrlCreateRadio("HTML", 570,100, 50, 20)
$GUI_AST_ScriptCode = GuiCtrlCreateEdit("One moment...", 20,140,640,390)
GuiSetState()
; Initial GUI Settings
GUICtrlSetState($GUI_AST_RUN, $GUI_DISABLE)
GUICtrlSetState($GUI_AST_SAVE, $GUI_DISABLE)
GUICtrlSetState($GUI_AST_RadioDialog,$GUI_CHECKED)
; Fill the WMI_Namespaces Combobox
LoadWMINamespaces()
; Fill the WMI_Classes Combobox
HandleNamespaceChange()
While 1
$msg = GuiGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $GUI_AST_QUIT
ExitLoop
Case $msg = $GUI_WMI_Namespace
HandleNameSpaceChange()
Case $msg = $GUI_WMI_Classes
ComposeCode()
Case $msg = $GUI_AST_Run
RunScript()
Case $msg = $GUI_AST_Save
SaveScript()
Case $msg = $GUI_AST_Open
OpenScript()
Case $msg = $GUI_AST_CIMv2
SetNamespaceToCIMV2()
Case $msg = $GUI_AST_WMISource
SetWMIRepository()
Case $msg = $GUI_AST_RadioDialog or _
$msg = $GUI_AST_RadioText or _
$msg = $GUI_AST_RadioHTML
HandleOutputChange()
EndSelect
WEnd
GUIDelete()
Exit
;********************************************************************
;* LoadWMINamespaces
;********************************************************************
Func LoadWMINamespaces()
$strCsvListOfNamespaces = ""
$strNameSpacesCombo=""
$strWaitNamespaces="Please wait, Loading WMI Namespaces"
GUICtrlSetData($GUI_WMI_Namespace,$strWaitNamespaces,$strWaitNamespaces)
EnumNameSpaces("root", $strCsvListOfNamespaces)
$arrNamespaces = StringSplit($strCsvListOfNamespaces, ",")
For $strNamespace in $arrNamespaces
$strNameSpacesCombo = $strNameSpacesCombo & "|" & $strNamespace
Next
GUICtrlSetData($GUI_WMI_Namespace,$strNameSpacesCombo,"ROOT\CIMV2")
EndFunc
;********************************************************************
;* EnumNamespaces
;********************************************************************
Func EnumNamespaces($strNamespace, ByRef $tmpCsvListOfNamespaces)
If $tmpCsvListOfNamespaces = "" Then
$tmpCsvListOfNamespaces = $strNamespace
Else
$tmpCsvListOfNamespaces = $tmpCsvListOfNamespaces & "," & $strNamespace
EndIf
$strComputer = $g_strWMISource
$objWMIService = ObjGet("winmgmts:\\" & $g_strWMISource & "\" & $strNameSpace)
If not @error Then
$colNameSpaces = $objWMIService.InstancesOf("__NAMESPACE")
For $objNameSpace In $colNameSpaces
EnumNamespaces($strNameSpace & "\" & $objNameSpace.Name, $tmpCsvListOfNamespaces)
Next
Else
$tmpCsvListOfNamespaces=""
EndIf
EndFunc
;********************************************************************
;* HandleNamespaceChange
;********************************************************************
Func HandleNamespaceChange()
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; Clear the WMI classes pulldown location.
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
$strSelectedNamespace = GUICtrlRead ( $GUI_WMI_Namespace )
; Disable the namespace combobox until class load has been completed
GUICtrlSetState($GUI_WMI_Namespace, $GUI_DISABLE)
$strWMIWaitMsg = "Please wait, trying to load WMI Classes in namespace " & $strSelectedNamespace
GUICtrlSetData($GUI_WMI_Classes, $strWMIWaitMsg, $strWMIWaitMsg)
GUICtrlSetData($GUI_AST_ScriptCode,"One moment...","")
LoadWMIClasses()
$g_strCurrentNamespace = "\" & $strSelectedNamespace
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; Clear the code textarea and disable run and save.
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
GUICtrlSetData($GUI_AST_ScriptCode,"","")
GUICtrlSetState($GUI_WMI_Namespace, $GUI_ENABLE)
GUICtrlSetState($GUI_AST_RUN, $GUI_DISABLE)
GUICtrlSetState($GUI_AST_SAVE, $GUI_DISABLE)
EndFunc
;********************************************************************
;* LoadWMIClasses
;*
;* Fetch all the classes in the currently selected namespace, and
;* populate the keys of a dictionary object with the names of all
;* dynamic (non-association) classes. Then we transfer the keys to
;* an array, sort the array, and finally use the sorted array to
;* populate the WMI classes pulldown.
;********************************************************************
Func LoadWMIClasses()
Const $SORT_KEYS = 1
Const $SORT_ITEMS = 2
$objClassDictionary = ObjCreate("Scripting.Dictionary")
$objQualifierDictionary = ObjCreate("Scripting.Dictionary")
$strComputer = "."
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & $g_strCurrentNamespace)
If not @error Then
For $objClass in $objWMIService.SubclassesOf()
For $objQualifier In $objClass.Qualifiers_() ; Dummy (), because it ends with an underscore !
$objQualifierDictionary.Add(StringLower($objQualifier.Name), "")
Next
If $objQualifierDictionary.Exists("dynamic") Then
;$TempVar = $objClass.Path_.Class
;$objClassDictionary.Add($TempVar, "") ; Can't use object in arguments ?!!
$objClassDictionary.Add($objClass.Path_.Class, "")
EndIf
$objQualifierDictionary.RemoveAll
Next
$objQualifierDictionary = ""
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; If the current namespace contains dynamic classes...
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
If $objClassDictionary.Count Then
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; Sort the dictionary.
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
SortDictionary($objClassDictionary, $SORT_KEYS)
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; Populate the WMI classes pulldown with the sorted dictionary.
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
$strClassesCombo="|Select a WMI class"
For $strWMIClass in $objClassDictionary ; method .Keys is not an object ??
$strClassesCombo = $strClassesCombo & "|" & $strWMIClass
Next
GUICtrlSetData($GUI_WMI_Classes,$strClassesCombo,"Select a WMI class")
EndIf
EndIf
If @error Or $objClassDictionary.Count = 0 Then
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; And if the current namespace doesn't contain dynamic classes.
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
GUICtrlSetData($GUI_WMI_Classes,"|No dynamic classes found in current namespace.|Select a different namespace","")
EndIf
$objClassDictionary = ""
EndFunc
;********************************************************************
;* SortDictionary
;*
;* Shell sort based on:
;* <a href='http://support.microsoft.com/support/kb/articles/q246/0/67.asp' class='bbc_url' title='External link' rel='nofollow external'>http://support.microsoft.com/support/kb/articles/q246/0/67.asp</a>
;********************************************************************
Func SortDictionary(ByRef $objDict, $intSort)
Const $dictKey = 1
Const $dictItem = 2
Dim $strDict[1][3]
$intCount = $objDict.Count
If $intCount > 1 Then
ReDim $strDict[$intCount][3]
$i = 0
For $objKey In $objDict
$strDict[$i][$dictKey] = String($objKey)
$strDict[$i][$dictItem] = String($objDict($objKey))
$i = $i + 1
Next
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; Perform a shell sort of the 2D string array
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
For $i = 0 To ($intCount - 2)
For $j = $i To ($intCount - 1)
If $strDict[$i][$intSort] > $strDict[$j][$intSort] Then
$strKey = $strDict[$i][$dictKey]
$strItem = $strDict[$i][$dictItem]
$strDict[$i][$dictKey] = $strDict[$j][$dictKey]
$strDict[$i][$dictItem] = $strDict[$j][$dictItem]
$strDict[$j][$dictKey] = $strKey
$strDict[$j][$dictItem] = $strItem
EndIf
Next
Next
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; Erase the contents of the dictionary object
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
$objDict.RemoveAll
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; Repopulate the dictionary with the sorted information
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
For $i = 0 To ($intCount - 1)
$objDict.Add($strDict[$i][$dictKey], $strDict[$i][$dictItem])
Next
EndIf
EndFunc
;********************************************************************
;* ComposeCode
;********************************************************************
Func ComposeCode()
$objClass=""
$strSelectedClass = GUICtrlRead ( $GUI_WMI_Classes )
; Check if a valid class has been selected
If $strSelectedClass <> "Select a WMI class" Then
$bHasDates = false ; Flag: output has date fields
$strHeaderStart=Chr(34)
$strRowStart=Chr(34)
$strColumnSeparator=": "
$strRowEnd=" & @CRLF"
$strComputerCommand = "$strComputer = " & Chr(34) & $g_strWMISource & Chr(34)
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & @COMPUTERNAME & $g_strCurrentNamespace)
$objClass = $objWMIService.Get($strSelectedClass)
If IsObj($objClass) Then
$strScriptCode = ""
$strScriptCode = $strScriptCode & "; Generated by AutoIt Scriptomatic" & @CRLF & @CRLF
$strScriptCode = $strScriptCode & "$wbemFlagReturnImmediately = 0x10" & @CRLF
$strScriptCode = $strScriptCode & "$wbemFlagForwardOnly = 0x20" & @CRLF
$strScriptCode = $strScriptCode & '$colItems = ""' & @CRLF
$strScriptCode = $strScriptCode & $strComputerCommand & @CRLF & @CRLF
$strScriptCode = $strScriptCode & '$Output=""' & @CRLF
If $g_strOutputFormat = "HTML" then
$strScriptCode = $strScriptCode & "$Output = $Output & '<html><head><title>Scriptomatic HTML Output</title></head><body> " & _
"<style>table {font-size: 10pt; font-family: arial;} th {background-color: buttonface; font-decoration: bold;} " & _
"</style><table BORDER=" & Chr(34) & "1" & Chr(34) & "><tr><th>Property</th><th>Value</th></tr>'" & @CRLF
$strRowStart = Chr(34) & "<tr><td>"
$strHeaderStart = "'<tr bgcolor=" & Chr(34) & "yellow" & Chr(34) & "><td>' & " & Chr(34)
$strColumnSeparator = "</td><td> "
$strRowEnd = " & " & Chr(34) & "</td></tr>" & Chr(34) & " & @CRLF"
EndIf
$strScriptCode = $strScriptCode & "$Output = $Output & " & $strHeaderStart & "Computer" & $strColumnSeparator & Chr(34) & " & $strComputer " & $strRowEnd & @CRLF
If $g_strOutputFormat = "Dialog" then
$strScriptCode = $strScriptCode & "$Output = $Output & " & Chr(34) & "==========================================" & Chr(34) & $strRowEnd & @CRLF
EndIf
$strScriptCode = $strScriptCode & "$objWMIService = ObjGet(" & Chr(34) & "winmgmts:\\" & Chr(34) & " & $strComputer & " & Chr(34) & $g_strCurrentNamespace & Chr(34) & ")" & @CRLF
$strScriptCode = $strScriptCode & "$colItems = $objWMIService.ExecQuery(" & Chr(34) & "SELECT * FROM " & $strSelectedClass & Chr(34) & ", " & Chr(34) & "WQL" & Chr(34) & ", _" & @CRLF
$strScriptCode = $strScriptCode & " $wbemFlagReturnImmediately + $wbemFlagForwardOnly)" & @CRLF & @CRLF
$strScriptCode = $strScriptCode & "If IsObj($colItems) then" & @CRLF
$strScriptCode = $strScriptCode & " For $objItem In $colItems" & @CRLF
For $objProperty in $objClass.Properties_() ; Must use (), because method ends with an underscore
If $objProperty.IsArray = True Then
$strScriptCode = $strScriptCode & " $str" & $objProperty.Name & " = $objItem." & $objProperty.Name & "(0)" & @CRLF
$strScriptCode = $strScriptCode & " $Output = $Output & " & $strRowStart & $objProperty.Name & $strColumnSeparator & Chr(34) & " & $str" & $objProperty.Name & $strRowEnd & @CRLF
ElseIf $objProperty.CIMTYPE = 101 Then
$bHasDates = True
$strScriptCode = $strScriptCode & " $Output = $Output & " & $strRowStart & $objProperty.Name & $strColumnSeparator & Chr(34) & " & WMIDateStringToDate($objItem." & $objProperty.Name & ")" & $strRowEnd & @CRLF
Else
$strScriptCode = $strScriptCode & " $Output = $Output & " & $strRowStart & $objProperty.Name & $strColumnSeparator & Chr(34) & " & $objItem." & $objProperty.Name & $strRowEnd & @CRLF
EndIf
Next
If $g_strOutputFormat = "Dialog" then
$strScriptCode = $strScriptCode & ' if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop' & @CRLF
$strScriptCode = $strScriptCode & ' $Output=""' & @CRLF
Endif
$strScriptCode = $strScriptCode & " Next" & @CRLF
if $g_strOutputFormat = "Text" then
$strScriptCode = $strScriptCode & ' ConsoleWrite($Output)' & @CRLF
$strScriptCode = $strScriptCode & ' FileWrite(@TempDir & "\' & $strSelectedClass & '.TXT", $Output )' & @CRLF
$strScriptCode = $strScriptCode & ' Run(@Comspec & " /c start " & @TempDir & "\' & $strSelectedClass & '.TXT" )' & @CRLF
Elseif $g_strOutputFormat = "HTML" then
$strScriptCode = $strScriptCode & ' FileWrite(@TempDir & "\' & $strSelectedClass & '.HTML", $Output )' & @CRLF
$strScriptCode = $strScriptCode & ' Run(@Comspec & " /c start " & @TempDir & "\' & $strSelectedClass & '.HTML" )' & @CRLF
Endif
$strScriptCode = $strScriptCode & "Else" & @CRLF
$strScriptCode = $strScriptCode & ' Msgbox(0,"WMI Output","No WMI Objects Found for class: " & ' & Chr(34) & $strSelectedClass & Chr(34) & ' )' & @CRLF
$strScriptCode = $strScriptCode & "Endif" & @CRLF
$strScriptCode = $strScriptCode & @CRLF & @CRLF
If $bHasDates Then
$strScriptCode = $strScriptCode & "Func WMIDateStringToDate($dtmDate)" & @CRLF
$strScriptCode = $strScriptCode & @CRLF
$strScriptCode = $strScriptCode & Chr(9) & "Return (StringMid($dtmDate, 5, 2) & ""/"" & _" & @CRLF
$strScriptCode = $strScriptCode & Chr(9) & "StringMid($dtmDate, 7, 2) & ""/"" & StringLeft($dtmDate, 4) _" & @CRLF
$strScriptCode = $strScriptCode & Chr(9) & "& "" "" & StringMid($dtmDate, 9, 2) & "":"" & StringMid($dtmDate, 11, 2) & "":"" & StringMid($dtmDate,13, 2))" & @CRLF
$strScriptCode = $strScriptCode & "EndFunc"
EndIf
Else
$strScriptCode = "Error: No Class properties found for " & $g_strCurrentNamespace & "\" & $strSelectedClass
EndIf
GUICtrlSetData($GUI_AST_ScriptCode,$strScriptCode)
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; Once the code is successfully composed and put into the
; textarea, ensure that the run and save buttons are enabled.
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
GUICtrlSetState($GUI_AST_RUN, $GUI_ENABLE)
GUICtrlSetState($GUI_AST_SAVE, $GUI_ENABLE)
Else
; Disable Run and Save buttons, because no valid code has been generated
GUICtrlSetState($GUI_AST_RUN, $GUI_DISABLE)
GUICtrlSetState($GUI_AST_SAVE, $GUI_DISABLE)
EndIf
EndFunc
;********************************************************************
;* RunScript
;********************************************************************
Func RunScript()
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; Create a temporary script file named "temp_script.au3".
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
$strTmpName = @TempDir & "\temp_script.au3"
if FileExists($strTmpName) then FileDelete($strTmpName)
FileWrite($strTmpName,GUICtrlRead($GUI_AST_Scriptcode))
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; Start constructing the command line that will run the script...
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
$strCmdLine = @AutoItExe & " " & $strTmpName
RunWait($strCmdLine)
FileDelete($strTmpName)
EndFunc
;********************************************************************
;* SaveScript
;********************************************************************
Func SaveScript()
$strTmpName=FileSaveDialog("Save Script",@DesktopDir,"AutoIt3 Scripts (*.au3)",16, GUICtrlRead ( $GUI_WMI_Classes ))
if not @error and $strTmpName <> "" then
if StringRight($strTmpName,4) <> ".AU3" then $strTmpName=$strTmpName & ".AU3"
if FileExists($strTmpName) then FileDelete($strTmpName)
FileWrite($strTmpName,GUICtrlRead($GUI_AST_Scriptcode))
EndIf
EndFunc
;********************************************************************
;* OpenScript
;********************************************************************
Func OpenScript()
$strTmpName=FileOpenDialog("Open Script",@DesktopDir,"AutoIt3 Scripts (*.au3)")
If not @error and $strTmpName <> "" then
If FileExists($strTmpName) then
GUICtrlSetData($GUI_AST_ScriptCode,FileRead($strTmpName,FileGetSize($strTmpName)))
EndIf
EndIf
EndFunc
;****************************************************************************
;* SetNamespaceToCIMV2
;****************************************************************************
Func SetNamespaceToCIMV2()
If StringUpper(GUICtrlRead($GUI_WMI_Namespace)) <> "ROOT\CIMV2" Then
GUICtrlSetData($GUI_WMI_Namespace,"ROOT\CIMV2","ROOT\CIMV2")
HandleNamespaceChange()
EndIf
EndFunc
;****************************************************************************
;* SetWMIRepository
;****************************************************************************
Func SetWMIRepository()
$strWMISourceName = InputBox("Set WMI Repository Source", _
"Please enter the computer whose WMI repository you want to read from: ", _
$g_strWMISource)
If $strWMISourceName <> "" Then
$g_strWMISource = StringStripWS($strWMISourceName,1+2)
;target_computers.Value = $g_strWMISource
LoadWMINamespaces()
Endif
EndFunc
;****************************************************************************
;* HandleOutputChange
;****************************************************************************
Func HandleOutputChange()
$ChosenFormat = $g_strOutputFormat
if GUICtrlRead($GUI_AST_RadioDialog)=$GUI_CHECKED then $ChosenFormat="Dialog"
if GUICtrlRead($GUI_AST_RadioText)=$GUI_CHECKED then $ChosenFormat="Text"
if GUICtrlRead($GUI_AST_RadioHTML)=$GUI_CHECKED then $ChosenFormat="HTML"
if $ChosenFormat <> $g_strOutputFormat Then
$g_strOutputFormat = $ChosenFormat
ComposeCode()
EndIf
EndFunc