If you are like me, sometimes you need to find a few machines where no users are logged in. I have written this script that will scan a list of machines and tell whether a user is logged on or not. It reads a list of machine names from a text file and then scans the list. It displays a status window while running of how far along it is in the scans. This can take sometime because it queries the WMI on each machine. If a machine is offline, then it will take a while to continue trying to connect to that machine until it goes to the next machine name in the list. The reason I have it read from a list is because I can easily export the list of computer names out of SMS/SCCM and into a simple delimited text file. The output file will display the list of machines with either a username to the right, signifying that there is a user logged on, or with no username beside the machine name.
You can download the file from here
You can download the file from here
REM ***************************************************************************
REM *** Program: UserLoggedOn.vbs
REM *** Author: Mick Pletcher
REM *** Created: 10 January 2010
REM *** Edited: 02 October 2012
REM ***
REM *** Description: This script will read from a list of computer names and
REM *** check to see if a user is logged on. It will write the
REM *** status to the output text file for each system read from
REM *** the input file. This was written like this so that admins
REM *** can export lists of workstations from SMS/SCCM to find
REM *** machines with no user logged on for troubleshooting
REM *** deployments and/or find free machines to test other
REM *** issues. It will display an error if there is no input
REM *** file.
REM ***
REM ***************************************************************************
Option Explicit
REM Define Global Constants
CONST InputFileName = "Workstations.txt"
CONST OutputFileName = "LoggedOn.txt"
REM Define Global Variables
DIM arrComputers : Set arrComputers = Nothing
DIM InputFile : Set InputFile = Nothing
DIM InputFileExists : Set InputFileExists = Nothing
DIM objIE : Set objIE = CreateObject("InternetExplorer.Application")
DIM OutputFile : Set OutputFile = Nothing
DIM RelativePath : Set RelativePath = Nothing
REM Define Relative Path
DefineRelativePath()
REM Define Input and Output Files
DefineIOFiles()
REM Create Display Window
CreateDisplayWindow()
If InputFileExists then
REM Read Input File
ReadInputFile()
REM Parse Computer Status
ParseComputerStatus()
Else
Wscript.Echo " File containing workstation list does not exist."
End If
REM Cleanup Global Memory
CleanupGlobalMemory()
'*******************************************************************************
'*******************************************************************************
Sub DefineRelativePath()
REM Get File Name with full relative path
RelativePath = WScript.ScriptFullName
REM Remove file name, leaving relative path only
RelativePath = Left(RelativePath, InStrRev(RelativePath, "\"))
End Sub
'*******************************************************************************
Sub DefineIOFiles()
REM Define Local Objects
DIM FSO : Set FSO = CreateObject("Scripting.FileSystemObject")
InputFile = RelativePath & InputFileName
OutputFile = RelativePath & OutputFileName
If FSO.FileExists(InputFile) then
InputFileExists = True
Else
InputFileExists = False
End If
If FSO.FileExists(OutputFile) then
FSO.DeleteFile OutputFile, True
End If
REM Cleanup Memory
Set FSO = Nothing
End Sub
'*******************************************************************************
Sub CreateDisplayWindow()
REM Define Local Constants
CONST strComputer = "."
REM Define Local Objects
DIM objWMIService : Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
DIM colItems : Set colItems = objWMIService.ExecQuery ("Select PelsWidth,PelsHeight From Win32_DisplayConfiguration")
DIM objItem : Set objItem = Nothing
REM Define Local Variables
DIM intWidth : intWidth = 500
DIM intHeight : intHeight = 300
DIM intScreenWidth : Set intScreenWidth = Nothing
DIM intScreenHeight : Set intScreenHeight = Nothing
For Each objItem in colItems
intScreenWidth = objItem.PelsWidth
intScreenHeight = objItem.PelsHeight
Next
objIE.Navigate "about:blank"
objIE.Document.Title = "Users Logged On"
objIE.Toolbar = 0
objIE.StatusBar = 0
objIE.AddressBar = 0
objIE.MenuBar = 0
objIE.Resizable = 0
objIE.Width = 500
objIE.Height = 300
While objIE.ReadyState <> 4
WScript.Sleep 100
Wend
objIE.Left = (intScreenWidth / 2) - (intWidth / 2)
objIE.Top = (intScreenHeight / 2) - (intHeight / 2)
objIE.Visible = True
REM Cleanup Local Variables
Set colItems = Nothing
Set intScreenWidth = Nothing
Set intScreenHeight = Nothing
Set intWidth = Nothing
Set intHeight = Nothing
Set objItem = Nothing
Set objWMIService = Nothing
End Sub
'******************************************************************************
Sub ReadInputFile()
REM Define Local Constant
CONST ForReading = 1
REM Define Local Variables
DIM FSO : Set FSO = CreateObject("Scripting.FileSystemObject")
DIM objTextFile : Set objTextFile = FSO.OpenTextFile(InputFile, ForReading)
DIM strText : strText = objTextFile.ReadAll
objTextFile.Close
arrComputers = Split(strText, VbCrLf)
REM Cleanup Local Variables
Set FSO = Nothing
Set objTextFile = Nothing
Set strText = Nothing
End Sub
'*******************************************************************************
Sub ParseComputerStatus()
On Error Resume Next
REM Define Local Objects
DIM FSO : Set FSO = CreateObject("Scripting.FileSystemObject")
DIM objFile : Set objFile = FSO.CreateTextFile(OutputFile, True)
DIM objWMIService : Set objWMIService = Nothing
REM Define Local Variables
DIM colItems : Set colItems = Nothing
DIM Count : Count = 0
DIM objItem : Set objItem = Nothing
DIM strComputer : Set strComputer = Nothing
DIM Total : Set Total = Nothing
objIE.Document.Body.InnerHTML = "<font color=black>"
objIE.Document.Body.InnerHTML = ""
objIE.Document.Body.InnerHTML = "Scanning Systems..." & "<BR>"
Count = Count + 1
Total = UBound(arrComputers)
For Each strComputer In arrComputers
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem",,48)
For Each objItem in colItems
If IsNull(objItem.UserName) then
objFile.WriteLine( strComputer & ": ")
else
objFile.WriteLine( strComputer & ": " & objItem.UserName )
End IF
If Round((Count/Total)*100, 0) <= 100 Then
objIE.Document.Body.InnerHTML = "<font color=black>"
objIE.Document.Body.InnerHTML = "Scanning Systems..." & "<BR>" & "<BR>" & Round((Count/Total)*100, 0) & "% complete"
Count = Count + 1
End If
Next
Next
objIE.Document.Body.InnerHTML = "100% complete" & "<BR>" & "<BR>"&_
Total & Chr(32) & "systems scanned."
REM Cleanup Local Memory
Set colItems = Nothing
Set Count = Nothing
Set FSO = Nothing
Set Total = Nothing
Set objItem = Nothing
Set objFile = Nothing
Set objWMIService = Nothing
Set strComputer = Nothing
End Sub
'*******************************************************************************
Sub CleanupGlobalMemory()
Set arrComputers = Nothing
Set InputFile = Nothing
Set InputFileExists = Nothing
Set OutputFile = Nothing
Set RelativePath = Nothing
End Sub
0 comments:
Post a Comment