List Remote or Local Windows Services

In a lot of IT projects, you often need to be able to quickly and easily see the state of certain Windows services on certain machines.  And in a large company, it may take time to get in touch with the right person to give you the information quickly and it may not be up to date information.  But there are ways to get this information yourself if you have the right access.

This script takes a CSV file as input with Computer Name, User Name, and Password.  The Computer name is for the machine you would like to query and the credentials should be for the user that has access to that machine.  It also has a parameter called “State” which allows filtering by the state of the service (Running, Stopped, or All).  The script will then enumerate through the list of machines provided in the CSV file and generate a quick report.

Param ( [string]$Computers, [string]$State = "all" ) $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition $dtFileDate = Get-Date -format "MMddyyyy" $strPassFile = "$scriptPath\password.txt" # Prompt for credentials and generate secure file function genSecurePassFile() { write-host "" write-host "Please enter a password below to create a SecureString and store it to a file." write-host "" $strSecPwd = Read-Host "Password: " -AsSecureString $strSecPwd | ConvertFrom-SecureString | Out-File $strPassFile write-host "" write-host "SecureString password saved to:" $strPassFile write-host "" exit } # Computers parameter Switch ($Computers.ToLower()) { "password" { # Generate a secure string password file write-host "" genSecurePassFile write-host "" break } default { # Assume its a path to CSV file by default # Read file data to arrays $AllComputers = Import-Csv $Computers break } } # State parameter Switch ($State.ToLower()) { "running" { # Only running services $myQuery = "select * from win32_service where state='running'" $st = $State.ToLower() break } "stopped" { # Only stopped services $myQuery = "select * from win32_service where state='stopped'" $st = $State.ToLower() break } default { # All services $myQuery = "select * from win32_service" $st = "all" break } } $cnt = $AllComputers.Length write-host "Getting all $st services for $cnt computers: " foreach ($Computer in $AllComputers) { $CompName = $Computer.Name.ToUpper() $OutFile = $Computer.Name.ToLower() try { Write-Host " $CompName… " -NoNewLine $securePassword = $Computer.Password | ConvertTo-SecureString $credential = New-Object System.Management.Automation.PSCredential $Computer.User, $securePassword Get-WmiObject -Computer $CompName -Query $myQuery -Credential $credential -ErrorAction Stop | Select-Object SystemName, DisplayName, Name, Status, PathName, ServiceType, StartMode, StartName, State | Export-CSV "$scriptPath\$OutFile-$st-$dtFileDate.csv" -notype Write-Host "SUCCESS!" -ForegroundColor Green } catch { $myError = $_.Exception.Message.ToString().Replace(",", "") Write-Host "ERROR - $myError" -BackgroundColor Black -ForegroundColor Red "$CompName : ERROR - $myError" | Out-File -FilePath "$scriptPath\$OutFile-$st-$dtFileDate.csv" } } Write-Host "Completed!"
Code language: PowerShell (powershell)