PC info/diagnostic script

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