#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_outfile=scriptomatic.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
; AutoIt ScriptOMatic
; -------------------
;
; AutoIt's counterpart of Microsoft's Scriptomatic
;
; Author:		SvenP
; Date/version:	2005-04-17
; See also:		http://www.microsoft.com/technet/scriptcenter/tools/scripto2.mspx
; 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"
Global $objClassDictionary
;************************
;* 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,80, 20)
$GUI_WMI_Classes         = GuiCtrlCreateCombo("WMI_Classes",   320, 50,340, 80)
$GUI_WMI_Filter			 = GUICtrlCreateButton("Filter",450,25,70,20)

$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)

GUICtrlSetState($GUI_WMI_Filter, 		$GUI_DISABLE)



; Fill the WMI_Namespaces Combobox
LoadWMINamespaces()

; Fill the WMI_Classes Combobox
HandleNamespaceChange()
GUICtrlSetState($GUI_WMI_Filter, 		$GUI_ENABLE)

While 1
	$msg = GuiGetMsg()
	Select
	Case $msg = $GUI_EVENT_CLOSE
		ExitLoop
	Case $msg = $GUI_AST_QUIT
		ExitLoop
	Case $msg = $GUI_WMI_Filter
		filter()
	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:
;* http://support.microsoft.com/support/kb/articles/q246/0/67.asp
;********************************************************************
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 stringinstr($strSelectedClass,"Select a WMI class")=0 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>&nbsp;"
				$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 = "c:\programme\autoit3\autoit3.exe" & " " & $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

Func Filter()
	$filter =InputBox("Class Filter","","","",200,50)
	if @error then
		msgbox(0,"Error","Filter Error",2)
	else
		$strClassesCombo="|Select a WMI class filtered with "&$filter
		For $strWMIClass in $objClassDictionary  ;  method .Keys is not an object ??
			if $filter="" or stringinstr($strWMIClass,$filter) then
				$strClassesCombo = $strClassesCombo & "|" & $strWMIClass
			EndIf
		Next
	endif
	if $filter="" then
		GUICtrlSetData($GUI_WMI_Classes,$strClassesCombo,"Select a WMI class")
	Else
		GUICtrlSetData($GUI_WMI_Classes,$strClassesCombo,"Select a WMI class filtered with "&$filter)
	endif
endfunc
