Testing services
A forum question about testing services and if they weren’t running got me thinking. I created an function to solve the question
function test-service{
[CmdletBinding(SupportsShouldProcess=$true)]
param (
[parameter(Position=0,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[Alias("CN", "ComputerName")]
[string]$computer="." ,
[string]$service="BITS" ,
[parameter(Mandatory=$true)]
[string]$file
)
BEGIN {
if (!(Test-Path -Path $file)){Throw "log file not found"}
}
PROCESS {
$result = Get-WmiObject -Class Win32_Service -ComputerName $computer -Filter "Name='$service'"
Write-Verbose "$($result.State)"
if ($($result.State) -eq "Running"){
$logdata = "{0,14} {1} {2}" -f $computer, $($result.State), (get-date -Format f )
}
else{
$start = $result.StartService()
if ($start.ReturnValue -eq 0){
$logdata = "{0,14} {1} {2}" -f $computer, "Service Started", (get-date -Format f )
}
else {
$logdata = "{0,14} {1} {2}" -f $computer, "Service FAILED to Start", (get-date -Format f )
}
}
Add-Content -Path $file -Value $logdata
}
} ## end function
But I don’t like the answer for a number of reasons:
- end up out putting text
- log files involve extra work in parsing
- will other people know where the log file is
A better solution, in my mind, is to write the data to the event log. In this case I would use the system log because we are testing services. The application log could be used or we could even create a specific event log for the purpose.
function test-service2{
[CmdletBinding(SupportsShouldProcess=$true)]
param (
[parameter(Position=0,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[Alias("CN", "ComputerName")]
[string]$computer="." ,
[string]$service="BITS"
)
PROCESS {
$result = Get-WmiObject -Class Win32_Service -ComputerName $computer -Filter "Name='$service'"
Write-Verbose "$($result.State)"
if ($($result.State) -eq "Running"){
$type = "Information"
$msg = "$computer - $service is $($result.State) "
}
else{
$start = $result.StartService()
if ($start.ReturnValue -eq 0){
$type = "Warning"
$msg = "$computer - $service was started "
}
else {
$type = "Error"
$msg = "$computer - $service FAILED to start"
}
}
Write-EventLog -LogName Application -Source ServiceTest -EntryType $type -Message $msg -EventId 9999
}
} ## end function
before using the function run this to create the event log source
New-EventLog -LogName Application -Source ServiceTest
The actions are all written to the event log as information, Warning or Error messages as appropriate.
Get-EventLog -LogName Application -Source ServiceTest
Shows the messages.
Enjoy