RemoteWmiInfo: Difference between revisions
m (Removed reference to internal AD stuff in a comment.) |
(No difference)
|
Revision as of 18:54, 26 September 2009
Script: remoteWMIInfo
Author: Jon Dunham
Description: Mostly-functioning example script for how to retrieve WMI information, as well as working with GUI controls. I currently use it a lot in my job, and works quite well at this point. It's commented sparingly thus far, but I'll try and and comment more of it for educational purposes. Please don't hesitate to contact me if you find problems with it or have ideas on improving its efficiency.
Notes: The Remote and Logoff buttons are disabled by default, as they're dependent on whether you have access to an internal LANDesk management suite URL (which is what I use specifically, it could also easily be changed to use WinVNC and the like), as well as the psShutdown tool. Also, bear this in mind:
"my code is a dog's code" - R. Beef Kazenzakis
; UDF
#include <date.au3>
#include <ie.au3>
#include <array.au3>
#include <misc.au3>
#include <guiStatusBar.au3>
; Standard
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <Constants.au3>
; -( remoteWmiInfo )--------------------
;
; © Jon Dunham 2009
;
; displays WMI and AD info including;
; 0: Computer model
; 1: Serial Number & Asset (if found)
; 2: BIOS Version
; 3: total RAM
; 4: Operating system & service pack
; 5: MAC Address
; 6; private IP
; 7: current domain/user, including display name and SID (in a tooltip)
; 8: DefaultUserName, including display name and SID (in a tooltip)
; 9: time to connect in ms & ping
; 10: Bottom-level OU
; 11; IP address
; 12; wireless info from wirelessInfo.au3
; 13; active monitor model
; 14; active monitor serial (to some extent)
; BLAH BLAH I'M NOT UPDATING THIS ANY MORE
;
; also uses psShutdown and LANDesk
; for remoting convenience
;
; ======================================
Dim $compName, $go, $done
Global Const $version = "0.4.10"
Global $debug = 0
Global $pathSave = @MyDocumentsDir & "\remoteWmiInfo Queries\"
AutoItSetOption("TrayAutoPause", 0)
AutoItSetOption("GUICloseOnESC", 1)
;HotKeySet( "{ENTER}", "hotkey_enter" )
;HotKeySet( "{F1}", "aboutDiag" )
; make sure icons exist
DirCreate("Icons")
If Not FileExists("Icons\Dialog-Apply.ico") Then _
FileInstall("Icons\Dialog-Apply.ico", "Icons\Dialog-Apply.ico")
If Not FileExists("Icons\Gnome-Document-Save.ico") Then _
FileInstall("Icons\Gnome-Document-Save.ico", "Icons\Gnome-Document-Save.ico")
If Not FileExists("Icons\Gnome-Preferences-Desktop-Remote-Desktop.ico") Then _
FileInstall("Icons\Gnome-Preferences-Desktop-Remote-Desktop.ico", "Icons\Gnome-Preferences-Desktop-Remote-Desktop.ico")
If Not FileExists("Icons\Gnome-Application-Exit.ico") Then _
FileInstall("Icons\Gnome-Application-Exit.ico", "Icons\Gnome-Application-Exit.ico")
#Region ### START Koda GUI section ### Form=
$frmInfo = GUICreate("remoteWmiInfo " & $version, 337, 377, @DesktopWidth / 2, @DesktopHeight * 0.3)
$winSize = WinGetClientSize($frmInfo)
GUISetBkColor(0xEEEEEE)
GUISetIcon("Icons\Gnome-System-Search.ico")
; Top Controls
$editComp = GUICtrlCreateInput(@ComputerName, 4, 30, 329, 21, $ES_UPPERCASE)
GUICtrlCreateIcon("Icons\Dialog-Apply.ico", -1, 4, 4, 21, 21)
$btnGo = GUICtrlCreateButton("Query", 27, 4, 45, 21, $BS_DEFPUSHBUTTON)
GUICtrlCreateIcon("Icons\Gnome-Document-Save.ico", -1, 74, 4, 21, 21)
$btnSave = GUICtrlCreateButton("Save", 97, 4, 45, 21)
GUICtrlCreateIcon("Icons\Gnome-Preferences-Desktop-Remote-Desktop.ico", -1, 144, 4, 21, 21)
$btnRC = GUICtrlCreateButton("Remote", 167, 4, 45, 21)
GUICtrlCreateIcon("Icons\Gnome-Application-Exit.ico", -1, 214, 4, 21, 21)
GUICtrlSetState($btnRC, $GUI_DISABLE)
$btnLO = GUICtrlCreateButton("Logoff", 237, 4, 45, 21)
GUICtrlSetState($btnLO, $GUI_DISABLE)
;$btnADQ = GUICtrlCreateButton( "dsQuery", 102, 29, 45, 21 )
$Tab1 = GUICtrlCreateTab(4, 56, 330, 297)
GUICtrlSetResizing($Tab1, $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT)
$TabSheet1 = GUICtrlCreateTabItem("General")
; Labels
GUICtrlCreateLabel("Model:", 12, 81, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Serial / Asset:", 12, 105, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("BIOS Version:", 12, 129, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Total RAM:", 12, 153, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("OS:", 12, 177, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("MAC:", 12, 201, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("IP:", 12, 225, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("OU:", 12, 249, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Current User:", 12, 273, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Default User:", 12, 297, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Ping:", 12, 321, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
; Edit controls
$editModel = GUICtrlCreateInput("", 96, 81, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editSerial = GUICtrlCreateInput("", 96, 105, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editBIOS = GUICtrlCreateInput("", 96, 129, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editRAM = GUICtrlCreateInput("", 96, 153, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editOS = GUICtrlCreateInput("", 96, 177, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editMAC = GUICtrlCreateInput("", 96, 201, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editIP = GUICtrlCreateInput("", 96, 225, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editDN = GUICtrlCreateInput("", 96, 249, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editUser = GUICtrlCreateInput("", 96, 273, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editDefaultUser = GUICtrlCreateInput("", 96, 297, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editPing = GUICtrlCreateInput("", 96, 321, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
; Wireless info
$TabSheet2 = GUICtrlCreateTabItem("Wireless")
GUICtrlCreateLabel("SSID:", 12, 81, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("BSSID:", 12, 105, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Signal:", 12, 129, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Noise:", 12, 153, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Channel:", 12, 177, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
; Edits
$editSSID = GUICtrlCreateInput("", 96, 81, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editBSSID = GUICtrlCreateInput("", 96, 105, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editSignal = GUICtrlCreateInput("", 96, 129, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editNoise = GUICtrlCreateInput("", 96, 153, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editChannel = GUICtrlCreateInput("", 96, 177, 228, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
; Misc info (incl. monitor)
$TabSheet3 = GUICtrlCreateTabItem("Misc")
$Group1 = GUICtrlCreateGroup("Monitor", 12, 86, 313, 102)
GUICtrlCreateLabel("Model:", 20, 106, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Serial:", 20, 130, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Description:", 20, 154, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$editDmName = GUICtrlCreateInput("", 96, 106, 212, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editDmSerial = GUICtrlCreateInput("", 96, 130, 212, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editDmDesc = GUICtrlCreateInput("", 96, 154, 212, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$Group2 = GUICtrlCreateGroup("Software", 12, 190, 313, 102)
GUICtrlCreateLabel("IE:", 20, 210, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("Java RE:", 20, 234, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlCreateLabel("LANDesk:", 20, 258, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$editVerIE = GUICtrlCreateInput("", 96, 210, 212, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editVerJava = GUICtrlCreateInput("", 96, 234, 212, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
$editLD = GUICtrlCreateInput("", 96, 258, 212, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
; default printer
GUICtrlCreateLabel("Printer:", 20, 300, 70, 17)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$editPrinter = GUICtrlCreateInput("", 96, 300, 212, 22, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
; End tab section
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
;$background = GUICtrlCreatePic( "c:\temp\osxclonebg.jpg", 0, 0, 350, 274)
GUICtrlSetTip($btnGo, "Attempt to query the specified computer.")
GUICtrlSetTip($btnSave, "Save all fields to " & $pathSave & "COMPUTERNAME-" & @YEAR & @MON & @MDAY & ".txt")
GUICtrlSetTip($btnRC, "Start a remote control session with the specified computer.")
GUICtrlSetTip($btnLO, "Logoff the current user (please make sure nobody is using it before doing this!!!).")
$statusBar = _GUICtrlStatusBar_Create($frmInfo)
; try to make a dynamically-sized status size
Dim $StatusBar1_PartsWidth[2] = [StringLen(_NowTime(5) & " >") * 6.5, -1]
_GUICtrlStatusBar_SetParts($statusBar, $StatusBar1_PartsWidth)
_GUICtrlStatusBar_SetText($statusBar, _NowTime(5) & " >", 0)
_GUICtrlStatusBar_SetText($statusBar, "", 1)
_GUICtrlStatusBar_SetMinHeight($statusBar, 20)
#EndRegion ### END Koda GUI section ###
Dim $goState, $logoffCheck
While 1 ; main loop
$guiMsg = GUIGetMsg()
Select
; Close window
Case $guiMsg = $GUI_EVENT_CLOSE
GUIDelete()
Exit
; Save info
Case $guiMsg = $btnSave
; Check that model field isn't blank
If GUICtrlRead($editModel) <> "" Then
Dim $stateWrite, $file
If Not FileExists($pathSave) Then
DirCreate($pathSave)
EndIf
; this needs to be updated for all fields
$stateWrite = FileWrite($pathSave & GUICtrlRead($editComp) & "-" & @YEAR & @MON & @MDAY & ".txt", _
"-( General )------------------------------" & @CRLF & _
GUICtrlRead($editModel) & @CRLF & _
GUICtrlRead($editSerial) & @CRLF & _
GUICtrlRead($editBIOS) & @CRLF & _
GUICtrlRead($editRAM) & @CRLF & _
GUICtrlRead($editOS) & @CRLF & _
GUICtrlRead($editMAC) & @CRLF & _
GUICtrlRead($editIP) & @CRLF & _
GUICtrlRead($editDN) & @CRLF & _
GUICtrlRead($editUser) & @CRLF & _
GUICtrlRead($editDefaultUser) & @CRLF & _
GUICtrlRead($editPing) & @CRLF & _
"-( Wireless )-----------------------------" & @CRLF & _
GUICtrlRead($editSSID) & @CRLF & _
GUICtrlRead($editBSSID) & @CRLF & _
GUICtrlRead($editSignal) & @CRLF & _
GUICtrlRead($editNoise) & @CRLF & _
GUICtrlRead($editChannel) & @CRLF & _
"-( Monitor )------------------------------" & @CRLF & _
GUICtrlRead($editDmName) & @CRLF & _
GUICtrlRead($editDmSerial) & @CRLF & _
GUICtrlRead($editDmDesc))
If $stateWrite Then
upStatus("Info saved to [ " & $pathSave & GUICtrlRead($editComp) & "-" & @YEAR & @MON & @MDAY & ".txt ]")
Else
upStatus("Could not write file to [ " & $pathSave & GUICtrlRead($editComp) & "-" & @YEAR & @MON & @MDAY & ".txt ]", 1)
EndIf
Else
upStatus("No data to write!", 1)
EndIf
; Start the WMI query
Case $guiMsg = $btnGo
GUISetState(@SW_DISABLE)
$goState = _go()
GUISetState(@SW_ENABLE)
WinActivate($frmInfo)
; Start a LANDesk remote session
Case $guiMsg = $btnRC
If GUICtrlRead($editComp) <> "" Then
Select
Case $goState = 1
Dim $rcWin = _IECreate("http://landesk/RemoteSession.aspx?machine=" & _
GUICtrlRead($editComp) & "&operation=rc", 0, 0)
_IEQuit($rcWin)
$goState = 0
Case $goState = 2
upStatus("Computer was not contactable.", 1)
Case $goState = 0
upStatus("Please query the computer first.", 1)
EndSelect
Else
upStatus("Please enter a computer name.", 1)
EndIf
; Run the logoff process if user clicks 'Yes' to the msgbox
Case $guiMsg = $btnLO
If GUICtrlRead($editComp) <> "" And GUICtrlRead($editUser) <> "" Then
$logoffCheck = MsgBox(51, "Remote WMI Info", "This will log off the current user: " & _
_currentUser(GUICtrlRead($editComp)) & "." & @CRLF & @CRLF & "Have you checked " & _
"that the computer is not in use?")
If $logoffCheck = 6 Then
ShellExecute("psTools\psshutdown.exe", "-o \\" & GUICtrlRead($editComp))
EndIf
Else
MsgBox(0, "", "No computer entered or no user currently logged on.")
EndIf
#cs
Case $guiMsg = $btnADQ
if GUICtrlRead($editComp) <> "" Then
ShellExecute( "rundll32", "dsquery,OpenQueryWindow" )
WinWaitActive( "Find Users" )
ControlCommand( "Find Users", "", 16897, "SelectString", 'Computers' )
Sleep(2000)
WinWait( "Find Computers" )
ControlSetText( "Find Computers", "", 1224, GUICtrlRead($editComp) )
ControlClick( "Find Computers", "", 16901 )
EndIf
#ce
EndSelect
Sleep(10)
WEnd ; <== main loop
Func _go()
$compName = GUICtrlRead($editComp)
; Populate the array with WMI info, if possible
$info = _wmiInfo($compName)
Select
; Ping failed
Case @error = 7
upStatus($info, 1)
guiFlash($editComp, 0xFF0000, 200)
Return 2
; Computername contained illegal characters
Case @error = 8
upStatus("Please enter a valid name.", 1)
guiFlash($editComp, 0xFF0000, 200)
Return 2
; Unable to get WMI info from computer after successful ping (this shouldn't really happen ever)
Case @error = 9
upStatus("Unable to retrieve computer info after " & Round(@extended / 1000, 1) & "s.", 1)
guiFlash($editComp, 0xFF0000, 200)
Return 2
; Everything OK? DISPLAY THE INFO THEN DAMN
Case Not @error
upStatus($compName & " queried in " & $info[5])
If Not WinActive($frmInfo) Then
WinFlash($frmInfo, "", 4, 250)
Else
guiFlash($editComp, 0x00FF00, 200)
EndIf
; general info
GUICtrlSetData($editModel, $info[0])
GUICtrlSetData($editSerial, $info[1] & " / " & $info[10])
GUICtrlSetData($editBIOS, $info[2])
GUICtrlSetData($editRAM, $info[3] & " GB")
; Set field BkColor to red if below 1 GB
If $info[3] < 0.98 Then
GUICtrlSetBkColor($editRAM, 0xEECCCC)
Else
GUICtrlSetBkColor($editRAM, Default)
EndIf
GUICtrlSetData($editOS, $info[4])
; Set field BkColor to red if not Windows XP
If Not StringInStr($info[4], "XP") Then
GUICtrlSetBkColor($editOS, 0xEECCCC)
Else
GUICtrlSetBkColor($editOS, Default)
EndIf
GUICtrlSetData($editMAC, $info[9])
GUICtrlSetData($editDN, $info[8])
GUICtrlSetData($editUser, $info[6]); & " (" & _ADDNToDisplayName($info[6]) & ")" )
GUICtrlSetData($editDefaultUser, $info[7]); & " (" & _ADDNToDisplayName($info[7]) & ")" )
GUICtrlSetData($editPing, $info[17])
GUICtrlSetData($editIP, $info[11])
; wireless
GUICtrlSetData($editSSID, $info[12])
GUICtrlSetData($editSignal, $info[13])
GUICtrlSetData($editNoise, $info[14])
GUICtrlSetData($editChannel, $info[15])
GUICtrlSetData($editBSSID, $info[18])
; misc
GUICtrlSetData($editDmName, $info[19])
GUICtrlSetData($editDmSerial, $info[20])
GUICtrlSetData($editDmDesc, $info[21])
GUICtrlSetData($editVerIE, $info[26])
; Set field BkColor to red if below v7
If StringLeft($info[26], 1) < 7 Then
GUICtrlSetBkColor($editVerIE, 0xEECCCC)
Else
GUICtrlSetBkColor($editVerIE, Default)
EndIf
GUICtrlSetData($editVerJava, $info[27])
; Set field BkColor to red if below v1.4
If $info[27] < 1.4 Or $info[27] = "" Then
GUICtrlSetBkColor($editVerJava, 0xEECCCC)
Else
GUICtrlSetBkColor($editVerJava, Default)
EndIf
GUICtrlSetData($editLD, $info[28])
; Set field BkColor to red if below v1.4
If $info[28] = "Not running." Then
GUICtrlSetBkColor($editLD, 0xEECCCC)
Else
GUICtrlSetBkColor($editLD, Default)
EndIf
; printer
GUICtrlSetData($editPrinter, $info[29])
GUICtrlSetTip($editUser, $info[24], $info[22], 1)
GUICtrlSetTip($editDefaultUser, $info[25], $info[23], 1)
EndSelect
Return 1
EndFunc ;==>_go
Exit
Func _wmiInfo($compName)
; seterror if the computername string contains illegal characters
If Not _computerNameLegal($compName) Then
SetError(8)
Return
EndIf
; init object variables
Dim $objWMIService, $objAccount
Dim $colBios, $colCSP, $colLMC, $colOS, $colNic, $colSysEnc, $colDM
Dim $dmEDID, $dmPNPDID, $dmName
Dim $arrCU
Dim $ping = Ping($compName, 1000)
If @error Then
Select
Case @error = 1
SetError(7)
Return "Computer is offline."
Case @error = 2
SetError(7)
Return "Computer is unreachable."
Case @error = 3
SetError(7)
Return "Bad destination, please check the name."
Case @error = 4
SetError(7)
Return "Problem contacting address."
EndSelect
EndIf
; init arrays we'll return
Dim $info[31], $mInfo, $infoW, $SID
; get IP for no good damn reason
TCPStartup()
$info[11] = TCPNameToIP($compName)
TCPShutdown()
; start the response timer
Dim $timer = TimerInit()
; get the WIM object
$objWMIService = ObjGet("winmgmts:\\" & $compName & "\root\cimv2")
;$objRegistry = ObjGet("winmgmts:\\" & $compName & "\root\default:StdRegProv")
If $debug Then ConsoleWrite("Time after WMI connection: " & TimerDiff($timer) & @CRLF)
; get defaultusername & software versions from the registry
$info[7] = RegRead("\\" & $compName & "\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon", "DefaultUserName")
$info[30] = RegRead("\\" & $compName & "\HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon", "DefaultDomainName")
$info[26] = RegRead("\\" & $compName & "\HKLM\SOFTWARE\Microsoft\Internet Explorer", "Version")
$info[27] = RegRead("\\" & $compName & "\HKLM\SOFTWARE\JavaSoft\Java Runtime Environment", "CurrentVersion")
If $debug Then ConsoleWrite("Time after registry: " & TimerDiff($timer) & @CRLF)
; check to see if the WMI object exists; if not, seterror and return
; this check should now be deprecated due to the use of ping()
If Not IsObj($objWMIService) Then
SetError(9, TimerDiff($timer))
Return
EndIf
$info[17] = Round($ping, -1) & "ms"
; check if LD remote agent (issuser) is running
$info[28] = _processExists("issuser.exe", $compName)
If Not $info[28] Then
$info[28] = "Not running."
Else
$info[28] = "Running (PID: " & $info[28] & ")"
EndIf
; execquery on all the info groups we'll need
$colBios = $objWMIService.execquery("Select * From Win32_BIOS")
$colSysEnc = $objWMIService.execquery("Select * From Win32_SystemEnclosure")
$colCSP = $objWMIService.execquery("Select * from Win32_ComputerSystem")
$colLMC = $objWMIService.execquery("Select * from Win32_LogicalMemoryConfiguration")
$colOS = $objWMIService.execquery("Select * from Win32_OperatingSystem")
$colNic = $objWMIService.execquery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
If $debug Then ConsoleWrite("Time after queries: " & TimerDiff($timer) & @CRLF)
$info[8] = _extractOU(_getDN($compName))
If $debug Then ConsoleWrite("Time after DN: " & TimerDiff($timer) & @CRLF)
; get monitor info
$mInfo = monitorInfo($compName)
If $debug Then ConsoleWrite("Time after monitorInfo: " & TimerDiff($timer) & @CRLF)
If IsArray($mInfo) Then
$info[19] = $mInfo[0] ; model
$info[20] = $mInfo[1] ; serial
$info[21] = $mInfo[2] ; name
Else
$info[19] = "No valid EDID found."
EndIf
; grab computer model & current user
For $objCSP In $colCSP
$info[0] = StringStripWS($objCSP.Manufacturer, 2) & " " & $objCSP.Model
$info[6] = $objCSP.UserName
Next
; get current user full name and description
If $info[6] <> "" Then
$arrCU = StringSplit($info[6], "\", 2)
$objAccount = $objWMIService.Get('Win32_UserAccount.Name="' & $arrCU[1] & '",Domain="' & $arrCU[0] & '"')
If IsObj($objAccount) Then
$info[22] = $objAccount.FullName
$info[24] = $objAccount.Description
$SID = $objAccount.SID
EndIf
EndIf
;if $debug Then ConsoleWrite( $arrCU[1] & " SID: " & $SID & @CRLF )
; get default user full name and description
$objAccount = $objWMIService.Get("Win32_UserAccount.Name='" & $info[7] & "',Domain='" & $info[30] & "'")
If IsObj($objAccount) Then
$info[23] = $objAccount.FullName
$info[25] = $objAccount.Description
EndIf
; grab the serial and BIOS version
For $objBios In $colBios
$info[1] = $objBios.SerialNumber
$info[2] = $objBios.SMBIOSBIOSVersion
Next
; grab the asset tag, if available (it will be on HP dc7900s and possibly others)
For $objSysEnc In $colSysEnc
$info[10] = $objSysEnc.SMBIOSAssetTag
Next
; set to N/A if it didn't exist for returning purposes
If StringIsSpace($info[10]) Then $info[10] = "Asset tag not set"
; grab RAM, convert to GB ('cause who the fuck has less than 1GB nowadays)
For $objLMC In $colLMC
$info[3] = Round($objLMC.TotalPhysicalMemory / 1048576, 2)
Next
; grab OS
For $objOS In $colOS
$info[4] = $objOS.Caption & " " & $objOS.CSDVersion
Next
; grab MAC
For $objNic In $colNic
$info[9] = $objNic.MACAddress
; check if static IP or not, indicating QS or otherwise special-purpose machine
$info[16] = $objNic.DHCPEnabled
If $debug Then ConsoleWrite("DHCPEnabled: " & VarGetType($info[16]) & " | Length: " & StringLen($info[16]) & @LF)
Next
If $debug Then ConsoleWrite("Time after objWMI grabbing: " & TimerDiff($timer) & @CRLF)
; get wireless info if available
$infoW = wirelessInfo($compName)
If $debug Then ConsoleWrite("Time after wireless stats: " & TimerDiff($timer) & @CRLF)
; ssid
$info[12] = $infoW[0]
; signal
$info[13] = $infoW[1]
; noise
$info[14] = $infoW[2]
; channel
$info[15] = $infoW[3]
; BSSID
$info[18] = $infoW[4]
; Strip whitespace from end of model string, 'cause there's usually a lot
$info[0] = StringStripWS($info[0], 2)
; get the TOTAL query time now
$info[5] = Round(TimerDiff($timer), -1) & "ms"
If $SID Then _
$info[29] = defPrinterInfo($SID, $compName)
Return $info
EndFunc ;==>_wmiInfo
Func _currentUser($compName)
Dim $objWMIService
Dim $colCSP
Dim $user
$objWMIService = ObjGet("winmgmts:\\" & $compName & "\root\cimv2")
If Not IsObj($objWMIService) Then Return
$colCSP = $objWMIService.execquery("Select * from Win32_ComputerSystem")
For $objCSP In $colCSP
$user = $objCSP.UserName
Next
Return $user
EndFunc ;==>_currentUser
Func _getDN($compName)
Dim $objTrans, $objDomain
Const $ADS_NAME_TYPE_1779 = 1
Const $ADS_NAME_INITTYPE_GC = 3
Const $ADS_NAME_TYPE_NT4 = 3
$objTranslate = ObjCreate("NameTranslate")
$objDomain = ObjGet("LDAP://rootDse")
If @error Then
Return "Could not contact domain controller."
EndIf
$objTranslate.Init($ADS_NAME_INITTYPE_GC, "")
$objTranslate.Set($ADS_NAME_TYPE_NT4, @LogonDomain & "\" & $compName & "$")
$compDN = $objTranslate.Get($ADS_NAME_TYPE_1779)
;Set DN to upper Case
$compDN = StringUpper($compDN)
Return $compDN
EndFunc ;==>_getDN
Func upStatus($msg, $flash = 0, $color = 0x88DDCC)
_GUICtrlStatusBar_SetText($statusBar, _NowTime(5) & " >", 0)
_GUICtrlStatusBar_SetText($statusBar, $msg, 1)
If $flash Then
;for $i=0 to 3
; _GUICtrlStatusBar_SetBkColor($statusBar, $color)
; Sleep(500)
; _GUICtrlStatusBar_SetBkColor($statusBar, $CLR_DEFAULT)
; Sleep(500)
;Next
Else
_GUICtrlStatusBar_SetBkColor($statusBar, $CLR_MONEYGREEN)
Sleep(250)
_GUICtrlStatusBar_SetBkColor($statusBar, $CLR_DEFAULT)
EndIf
EndFunc ;==>upStatus
Func _extractOU($DN)
; We want to turn this
; CN=compName,OU=Group3,OU=Group2,OU=Group1,DC=site,DC=com
; into this
; Group3
;
; HAHA THIS WAS SO EASY, THANKS StringSplit()
If $DN = "Could not contact domain controller." Then Return $DN
Dim $OU, $arrDN
$arrDN = StringSplit($DN, ",", 2)
$OU = StringTrimLeft($arrDN[1], 3)
Return $OU
EndFunc ;==>_extractOU
Func _displayName($logon)
$objDomain = ObjGet("LDAP://rootDse")
;$objDomain.
EndFunc ;==>_displayName
Func _computerNameLegal($compName)
Dim $i
Const $illegalChars = StringToASCIIArray("`~!@#$ ^&*()=+[]{}\|;:',<>/?""")
For $i = 0 To UBound($illegalChars) - 1
If StringInStr($compName, Chr($illegalChars[$i])) Then
; return 0 if computer name contains bad characters
Return 0
EndIf
Next
; return 1 if computer name is OK, in keeping with 1=success/0=failure autoit function return codes
Return 1
EndFunc ;==>_computerNameLegal
Func aboutDiag()
GUISetState(@SW_DISABLE)
MsgBox(64, "About", "remoteWmiInfo " & $version & @CR & _
"© Jon Dunham 2009" & @CR & _
"dunham.jon@gmail.com" & @CR & @CR)
GUISetState(@SW_ENABLE)
WinActivate($frmInfo)
EndFunc ;==>aboutDiag
Func monitorInfo($compName = ".")
; Dell serial - 78 characters in (without MX0 or CN0 prefix)
; HP serial - 114 characters in
; both models - 96 (192 hex) characters in
;
; this function runs assuming the computer has already been contacted,
; otherwise it will hang for ~82 seconds trying to contact the WMI service
;
Dim $colDM, $PNPDID, $EDID, $Name
Dim $objWMIService = ObjGet("winmgmts:\\" & $compName & "\root\cimv2")
$colDM = $objWMIService.execquery('SELECT * FROM Win32_DesktopMonitor WHERE PNPDeviceID IS NOT NULL')
For $objDM In $colDM
; this is the best scenario we want (powered on/connected).
; Generally all other DesktopMonitor.Availability = 8 (off-line)
If $objDM.Availability = 3 Then
$PNPDID = $objDM.PNPDeviceID
$Name = $objDM.Name
$EDID = RegRead("\\" & $compName & "\HKLM\SYSTEM\CurrentControlSet\Enum\" & $PNPDID & "\Device Parameters", "EDID")
If Not @error Then
ExitLoop
;if there isn't an EDID for this, continueloop and get it from the next monitor with a PNPDeviceID
Else
ContinueLoop
EndIf
; this may or may not indicate the currently connected display device.
; Display status reporting seems to be sketchy at best with WMI
Else
$PNPDID = $objDM.PNPDeviceID
$Name = $objDM.Name
$EDID = RegRead("\\" & $compName & "\HKLM\SYSTEM\CurrentControlSet\Enum\" & $PNPDID & "\Device Parameters", "EDID")
If Not @error Then
ExitLoop
Else
ContinueLoop
EndIf
EndIf
Next
If $debug Then ConsoleWrite($Name & ": " & $objDM.Availability & " \ " & $PNPDID & @LF & @LF & $EDID & @LF)
If Not IsBinary($EDID) Then
SetError(1)
Return @error
EndIf
Dim $info[3], $serial, $model
$model = StringStripWS(StringMid(BinaryToString($EDID), 96, 12), 2)
If $debug Then ConsoleWrite("Model: " & $model & @CRLF)
Select
Case StringLeft($model, 2) = "HP"
If $debug Then ConsoleWrite("HP found" & @CRLF)
$serial = StringMid(BinaryToString($EDID), 114, 10)
Case StringLeft($model, 2) = "DE"
If $debug Then ConsoleWrite("Dell found" & @CRLF)
$serial = StringMid(BinaryToString($EDID), 78, 12)
$serial = "[ MX0 | CN0 ]" & StringLeft($serial, 5) & "XXXXX" & StringRight($serial, 7)
Case StringLeft($model, 2) = "LG"
If $debug Then ConsoleWrite("LG found" & @CRLF)
$serial = StringMid(BinaryToString($EDID), 114, 12) & " (may be the model)"
EndSelect
If $debug Then ConsoleWrite("Serial: " & $serial & @CRLF)
$info[0] = $model
$info[1] = $serial
$info[2] = $Name
Return $info
EndFunc ;==>monitorInfo
Func _processExists($procName, $compName = ".")
$oWMIService = ObjGet("winmgmts:\\" & $compName & "\root\CIMV2")
If Not IsObj($oWMIService) Then
SetError(1)
Return
EndIf
Dim $handle, $colProc
$cProc = $oWMIService.ExecQuery('SELECT * FROM Win32_Process WHERE Name = "' & $procName & '"')
For $oProc In $cProc
$handle = $oProc.Handle
Next
If $handle Then
Return $handle
Else
Return 0
EndIf
EndFunc ;==>_processExists
Func guiFlash(ByRef $control, $color, $duration = 200, $times = 2, $tween = 0.4)
$sleep1 = ($duration / $times) * $tween
$sleep2 = ($duration / $times) * (1 - $tween)
If $control <> "" Then
If IsHWnd($control) Then
For $i = 1 To $times
GUISetBkColor($control, $color)
Sleep($sleep1)
GUISetBkColor($control, Default)
Sleep($sleep2)
Next
Else
For $i = 1 To $times
GUICtrlSetBkColor($control, $color)
Sleep($sleep1)
GUICtrlSetBkColor($control, Default)
Sleep($sleep2)
Next
EndIf
Else
Return 0
EndIf
Return 1
EndFunc ;==>guiFlash
Func defPrinterInfo($SID, $compName = ".")
$defPrintString = RegRead("\\" & $compName & "\HKU\" & $SID & "\Software\Microsoft\Windows NT\CurrentVersion\Windows", "Device")
$info = StringSplit($defPrintString, ",", 2)
$defPrinter = $info[0]
Return $defPrinter
EndFunc ;==>defPrinterInfo
Func wirelessInfo($strComputer = ".")
Dim $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\WMI")
; Was the computer contactable?
If Not IsObj($objWMIService) Then
Return 2
EndIf
Dim $SSID, $BSSID, $signal, $noise, $channel, $info[5]
Dim $raw
Const $channels[24] = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "40", "36", "44", "48", "52", _
"56", "60", "64", "149", "153", "157", "161", "165"]
Const $frequencies[24] = ["2412000", "2417000", "2422000", "2427000", "2432000", "2437000", "2442000", "2447000", _
"2452000", "2457000", "2462000", "5200000", "5180000", "5220000", "5240000", "5260000", "5280000", "5300000", "5320000", _
"5745000", "5765000", "5785000", "5805000", "5825000"]
; Signal
$colWifi = $objWMIService.ExecQuery("Select * From MSNdis_80211_ReceivedSignalStrength where Active = True")
For $objWifi In $colWifi
$signal = $objWifi.NDIS80211ReceivedSignalStrength & " dBm"
Next
; Noise
$colWifi = $objWMIService.ExecQuery("SELECT * FROM Atheros5000_NoiseFloor where Active = True")
For $objWifi In $colWifi
$noise = -$objWifi.Value & " dBm"
Next
; SSID
$colWifi = $objWMIService.ExecQuery("Select * From MSNdis_80211_ServiceSetIdentifier")
For $objWifi In $colWifi
$SSID = $objWifi.NDIS80211SSID
Next
For $i = 0 To UBound($SSID) - 1
If $SSID[$i] < 32 Or $SSID[$i] > 127 Then
$SSID[$i] = ""
Else
$SSID[$i] = Chr($SSID[$i])
EndIf
Next
$SSID = _ArrayToString($SSID, "")
; AP MAC
$colWifi = $objWMIService.ExecQuery("Select * From MSNdis_80211_BaseServiceSetIdentifier WHERE Active = True")
For $objWifi In $colWifi
$BSSID = $objWifi.NDIS80211MacAddress
Next
For $i = 0 To UBound($BSSID) - 1
$BSSID[$i] = Hex($BSSID[$i], 2)
Next
; Channel
$colWifi = $objWMIService.ExecQuery("Select * From MSNdis_80211_Configuration WHERE Active = True")
For $objWifi In $colWifi
$raw = $objWifi.Ndis80211Config.DSConfig
For $i = 0 To UBound($frequencies) - 1
If $raw = $frequencies[$i] Then
$channel = $channels[$i]
EndIf
Next
Next
; Formatting (use stringreplace($info[4], ":", "") to remove or replace colons in the AP MAC if desired)
$BSSID = _ArrayToString($BSSID, ":")
$info[0] = $SSID
$info[1] = $signal
$info[2] = $noise
$info[3] = $channel
$info[4] = $BSSID
Return $info
EndFunc ;==>wirelessInfo