PC info/diagnostic script
2013-01-16 1 Comment
My new collegue suggested that we create a logon script to capture certain information in order to maintain our asset register, as per usual I ran away with the idea and put the following together.
Const ForWriting = 2 Const PadValue = 30 strComputer = "." Set objFSO = CreateObject("Scripting.FileSystemObject") Set objWMIService = GetObject( "winmgmts://" & strComputer & "/root/cimv2" ) Set colItems = objWMIService.ExecQuery( "Select * from Win32_ComputerSystem" ) For Each objItem in colItems strComputer = objItem.Name Set objOutput = objFSO.OpenTextFile("\\SERVER\SHARE$\" & strComputer & ".txt", ForWriting, True) objOutput.WriteLine UserInfo() objOutput.WriteLine SystemInfo(strComputer) objOutput.WriteLine ProcessorInfo(strComputer) objOutput.WriteLine MemoryInfo(strComputer) objOutput.WriteLine DisplayInfo(strComputer) objOutput.WriteLine IPInfo(strComputer) objOutput.WriteLine DriveInfo(strComputer) objOutput.WriteLine OSInfo(strComputer) objOutput.WriteLine PrinterInfo(strComputer) objOutput.WriteLine StatrtUpInfo(strComputer) objOutput.WriteLine SoftwareInfo(strComputer) objOutput.WriteLine HotFixInfo(strComputer) objOutput.WriteLine ServiceInfo(strComputer) objOutput.WriteLine ProcessInfo(strComputer) ObjOutput.Close Next Public Function Pad(blnLeft, intLength, strValue) Dim lstrOutput if isnull(strValue) then strValue = "" lstrOutput = Replace(Replace(Replace(strValue,vbCr," "),vbLf," ")," "," ") Do Until len(lstrOutput) >= intLength If blnLeft = True then lstrOutput = " " & lstrOutput Else lstrOutput = lstrOutput & " " End If Loop Pad = lstrOutput End Function Public Function UserInfo() dim output output = output & "User" Set WshShell = WScript.CreateObject("WScript.Shell") output = output & vbcrlf & vbtab & Pad(false, PadValue, "Current User") & ": " & WshShell.Environment("Process")("username") output = output & vbcrlf & vbtab & Pad(false, PadValue, "Computer Name") & ": " & WshShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" ) output = output & vbcrlf & vbtab & Pad(false, PadValue, "Logon Server") & ": " & WshShell.ExpandEnvironmentStrings( "%LOGONSERVER%" ) output = output & vbcrlf & vbtab & Pad(false, PadValue, "User Domain") & ": " & WshShell.ExpandEnvironmentStrings( "%USERDOMAIN%" ) output = output & vbcrlf & vbtab & Pad(false, PadValue, "User Name") & ": " & WshShell.ExpandEnvironmentStrings( "%USERNAME%" ) UserInfo = output & vbCrLf & vbCrLf End Function Public Function OSInfo(strComputer) dim output output = output & "OS" Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colSettings = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colSettings output = output & vbcrlf & vbtab & Pad(false, PadValue, "OS Name") & ": " & objOperatingSystem.Name output = output & vbcrlf & vbtab & Pad(false, PadValue, "Version") & ": " & objOperatingSystem.Version output = output & vbcrlf & vbtab & Pad(false, PadValue, "Service Pack") & ": " & objOperatingSystem.ServicePackMajorVersion & "." & objOperatingSystem.ServicePackMinorVersion output = output & vbcrlf & vbtab & Pad(false, PadValue, "OS Manufacturer") & ": " & objOperatingSystem.Manufacturer output = output & vbcrlf & vbtab & Pad(false, PadValue, "Windows Directory") & ": " & objOperatingSystem.WindowsDirectory output = output & vbcrlf & vbtab & Pad(false, PadValue, "Locale") & ": " & objOperatingSystem.Locale output = output & vbcrlf & vbtab & Pad(false, PadValue, "Available Physical Memory") & ": " & round((objOperatingSystem.FreePhysicalMemory) * .001 ) & " MB" output = output & vbcrlf & vbtab & Pad(false, PadValue, "Total Virtual Memory") & ": " & round((objOperatingSystem.TotalVirtualMemorySize) * .001 ) & " MB" output = output & vbcrlf & vbtab & Pad(false, PadValue, "Available Virtual Memory") & ": " & round((objOperatingSystem.FreeVirtualMemory) * .001 ) & " MB" output = output & vbcrlf & vbtab & Pad(false, PadValue, "Paging File") & ": " & round((objOperatingSystem.SizeStoredInPagingFiles) * .001 ) & " MB" Next const HKEY_LOCAL_MACHINE = &H80000002 Set objShell = CreateObject("WScript.Shell") Set oReg=GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv") 'winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") strKeyPath = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" strValueName = "PROCESSOR_ARCHITECTURE" oReg.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,OsType If OsType = "x86" then output = output & vbcrlf & vbtab & Pad(false, PadValue, "System Type") & ": " & "32-bit Operating System" elseif OsType = "AMD64" then output = output & vbcrlf & vbtab & Pad(false, PadValue, "System Type") & ": " & "64-bit Operating System" end if OSInfo = output & vbCrLf & vbCrLf End Function Public Function IPInfo(strComputer) dim output output = output & "IP Addresses" Set objWMIService = GetObject( "winmgmts://" & strComputer & "/root/cimv2" ) Set colItems = objWMIService.ExecQuery( "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress > ''", "WQL", 48 ) For Each objItem In colItems If IsArray( objItem.IPAddress ) Then For Each Address In objItem.IPAddress output = output & vbcrlf & vbtab & Address Next End If Next IPInfo = output & vbCrLf & vbCrLf End Function Public Function SystemInfo(strComputer) dim output output = output & "System" Set SystemSet = GetObject("winmgmts://"& strComputerName ).InstancesOf("Win32_ComputerSystem") for each System in SystemSet output = output & vbcrlf & vbtab & Pad(false, PadValue, "Machine Name") & ": " & System.Name output = output & vbcrlf & vbtab &Pad(false, PadValue, "Logon") & ": " & System.username output = output & vbcrlf & vbtab &Pad(false, PadValue, "Model") & ": " & System.Model 'output = output & vbcrlf & vbtab &Pad(false, PadValue, "RAM") & ": " & round((System.TotalPhysicalMemory / 1024) * .001 ) & " MB" next Set colSMBIOS = objWMIService.ExecQuery("Select * from Win32_SystemEnclosure") For Each objSMBIOS in colSMBIOS output = output & vbcrlf & vbtab & Pad(false, PadValue, "Service Tag") & ": " & objSMBIOS.SerialNumber Next SystemInfo = output & vbCrLf & vbCrLf End Function Public Function DriveInfo(strComputer) dim output output = output & "Drives" Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk Where DriveType = 3") intHDUs = 0 For Each objItem in colItems intHDUs = intHDUs + 1 If colItems.Count > 1 Then output = output & " " & intHDUs End If output = output & vbCrLf & vbtab & Pad(false, PadValue, "Letter") & ": " & objItem.DeviceID output = output & vbCrLf & vbtab & Pad(false, PadValue, "Size") & ": " & Int( ( objItem.Size + 536870912 ) / 1073741824 ) & " GB" output = output & vbCrLf & vbtab & Pad(false, PadValue, "Free") & ": " & Int( ( objItem.FreeSpace + 536870912 ) / 1073741824 ) & " GB" output = output & vbCrLf & vbtab & Pad(false, PadValue, "Free") & ": " & Round(((cdbl(objItem.FreeSpace) / cdbl(objItem.Size)) * 100),1) & " %" output = output & vbCrLf Next DriveInfo = output & vbCrLf End Function Public Function MemoryInfo(strComputer) dim output output = output & "Memory" Set objWMIService = GetObject( "winmgmts://" & strComputer & "/root/cimv2" ) Set colItems = objWMIService.ExecQuery( "Select * from Win32_MemoryDevice" ) intMem = 0 intMod = 0 For Each objItem in colItems intMem = intMem + objItem.EndingAddress - objItem.StartingAddress intMod = intMod + 1 Next output = output & vbCrLf & vbtab & Pad(false, PadValue, "Memory Modules") & ": " & intMod output = output & vbCrLf & vbtab & Pad(false, PadValue, "Total Physical Memory") & ": " & Int( ( intMem + 1023 ) / 1024 ) & " MB" MemoryInfo = output & vbCrLf & vbCrLf End Function Public Function DisplayInfo(strComputer) dim output output = output & "Display" Set objWMIService = GetObject( "winmgmts://" & strComputer & "/root/cimv2" ) Set colItems = objWMIService.ExecQuery( "Select * from Win32_VideoController" ) For Each objItem in colItems output = output & vbCrLf & vbtab & Pad(false, PadValue, "Name") & ": " & objItem.Name output = output & vbCrLf & vbtab & Pad(false, PadValue, "Description") & ": " & objItem.Description output = output & vbCrLf & vbtab & Pad(false, PadValue, "Video Processor") & ": " & objItem.VideoProcessor output = output & vbCrLf & vbtab & Pad(false, PadValue, "Adapter RAM") & ": " & Int( ( objItem.AdapterRAM + 1048575 ) / 1048576 ) & " MB" output = output & vbCrLf & vbtab & Pad(false, PadValue, "Video Mode Description") & ": " & objItem.VideoModeDescription output = output & vbCrLf Next DisplayInfo = output & vbCrLf End Function Public Function ProcessorInfo(strComputer) dim output output = output & "Processor" Set objWMIService = GetObject( "winmgmts://" & strComputer & "/root/cimv2" ) Set colItems = objWMIService.ExecQuery( "Select * from Win32_Processor" ) intCPUs = 0 For Each objItem in colItems intCPUs = intCPUs + 1 If colItems.Count > 1 Then output = output & " " & intCPUs End If output = output & vbCrLf & vbtab & Pad(false, PadValue, "Name") & ": " & objItem.Name output = output & vbCrLf & vbtab & Pad(false, PadValue, "Manufacturer") & ": " & objItem.Manufacturer output = output & vbCrLf & vbtab & Pad(false, PadValue, "Description") & ": " & objItem.Description output = output & vbCrLf & vbtab & Pad(false, PadValue, "Current Clock Speed") & ": " & objItem.CurrentClockSpeed output = output & vbCrLf & vbtab & Pad(false, PadValue, "Maximum Clock Speed") & ": " & objItem.MaxClockSpeed output = output & vbCrLf & vbtab & Pad(false, PadValue, "System Type") & ": " & objItem.Architecture output = output & vbCrLf & vbtab & Pad(false, PadValue, "Processor") & ": " & objItem.Description output = output & vbCrLf & vbtab & Pad(false, PadValue, "Windows") & ": " & objItem.AddressWidth & "-bit" output = output & vbCrLf & vbtab & Pad(false, PadValue, "Processor") & ": " & objItem.DataWidth & "-bit" output = output & vbCrLf Next ProcessorInfo = output & vbCrLf End Function Public Function SoftwareInfo(strComputer) dim output output = output & "Software" Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colSoftware = objWMIService.ExecQuery ("Select * from Win32_Product") For Each objSoftware in colSoftware output = output & vbcrlf & vbtab & Pad(false, 80, objSoftware.Caption) & Pad(false, 10, objSoftware.installDate) & Pad(false, 10, objSoftware.installDate2) Next SoftwareInfo = output & vbCrLf & vbCrLf End Function Public Function HotFixInfo(strComputer) dim output output = output & "Hotfix" Set colQuickFixes = objWMIService.ExecQuery( "Select * from Win32_QuickFixEngineering" ) output = output & vbcrlf & vbtab & Pad(false, 40, "Description: ") & Pad(false, 40, "Hot Fix ID: ") & Pad(false, 40, "Installation Date: ") & Pad(false, 40, "Installed By: ") For Each objQuickFix in colQuickFixes output = output & vbcrlf & vbtab & Pad(false, 40, objQuickFix.Description) & Pad(false, 40, objQuickFix.HotFixID) & Pad(false, 40, objQuickFix.InstallDate) & Pad(false, 40, objQuickFix.InstalledBy) Next HotFixInfo = output & vbCrLf & vbCrLf End Function Public Function ProcessInfo(strComputer) dim output output = output & "Process" Set objWMIService = GetObject( "winmgmts://" & strComputer & "/root/cimv2" ) Set colItems = objWMIService.ExecQuery( "Select * from Win32_Process", , 48 ) output = output & vbcrlf & vbtab & Pad(false, 40, "Name: ") & "Path: " For Each objItem in colItems output = output & vbcrlf & vbtab & Pad(false, 40, objItem.Caption) & objItem.ExecutablePath Next ProcessInfo = output & vbCrLf & vbCrLf End Function Public Function ServiceInfo(strComputer) dim output output = output & "Service" Set objWMIService = GetObject( "winmgmts://" & strComputer & "/root/cimv2" ) Set colItems = objWMIService.ExecQuery("Select * from Win32_Service",,48) For Each objItem in colItems output = output & vbCrLf & vbtab & Pad(false, PadValue, "Name") & ": " & objItem.Name output = output & vbCrLf & vbtab & Pad(false, PadValue, "Display Name") & ": " & objItem.DisplayName output = output & vbCrLf & vbtab & Pad(false, PadValue, "Path Name") & ": " & objItem.PathName output = output & vbCrLf & vbtab & Pad(false, PadValue, "Start Mode") & ": " & objItem.StartMode output = output & vbCrLf & vbtab & Pad(false, PadValue, "State") & ": " & objItem.State output = output & vbCrLf & vbtab & Pad(false, PadValue, "Login") & ": " & objItem.StartName output = output & vbcrlf Next ServiceInfo = output & vbCrLf End Function Public Function PrinterInfo(strComputer) dim output output = output & "Printer" Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer",,48) For Each objItem in colItems output = output & vbCrLf & vbtab & Pad(false, PadValue, "Printer Name") & ": " & objItem.Name output = output & vbCrLf & vbtab & Pad(false, PadValue, "Port Name") & ": " & objItem.PortName output = output & vbCrLf & vbtab & Pad(false, PadValue, "Driver Name") & ": " & objItem.DriverName output = output & vbCrLf & vbtab & Pad(false, PadValue, "Server Name") & ": " & objItem.ServerName output = output & vbCrLf & vbtab & Pad(false, PadValue, "Share Name") & ": " & objItem.ShareName output = output & vbcrlf Next PrinterInfo = output & vbCrLf End Function Public Function StatrtUpInfo(strComputer) dim output output = output & "Start Up" Set objWMIService = GetObject( "winmgmts://" & strComputer & "/root/cimv2" ) Set colItems = objWMIService.ExecQuery( "Select * from Win32_StartupCommand", , 48 ) For Each objItem in colItems output = output & vbCrLf & vbtab & Pad(false, PadValue, "Name") & ": " & objItem.Name output = output & vbCrLf & vbtab & Pad(false, PadValue, "Command") & ": " & objItem.Command output = output & vbCrLf & vbtab & Pad(false, PadValue, "Location") & ": " & objItem.Location output = output & vbCrLf & vbtab & Pad(false, PadValue, "User") & ": " & objItem.User output = output & vbcrlf Next StatrtUpInfo = output & vbCrLf End Function
If you need any more information I would definately recommend http://www.robvanderwoude.com/wmiexamples.php