用powershell script 擷取windows task status
# Description : This script is designed to check scheduled tasks for windows
# servers and alert in case tasks failed in Nagios style output.
#############################################################################
#define states for opsview
[email protected]{ "OK"=0;"WARNING"=1;"CRITICAL"=2;"UNKNOWN"=3 }
$TaskStruct = New-Object PSObject -Property @{
Struct_TaskServer = [string]"";
Struct_TaskName = [string]"";
Struct_TaskPath = [string]"";
Struct_TaskLastTaskResult = [int]0;
}
#function help
Function check_help {
Write-Host @"
check_ms_win_task.ps1:
This script is designed to check check Windows 2008 or higher scheduled tasks and alert in case tasks failed in Nagios style output.
Arguments:
-H | --Hostname => Optional hostname
-T | --Taskname => Name of Task.
-P | --Pathname => Path of Task
-h | --Help => Print this help output.
"@
Exit $return_status["OK"]
}
Function Process_Args {
Param (
[Parameter(Mandatory=$True)]$Args
)
try {
For ( $i = 0; $i -lt $Args.count; $i=$i+2 ) {
$CurrentArg = $Args[$i].ToString()
#write-host "CurrentArg is $CurrentArg"
if ($i -lt $Args.Count-1) {
$Value = $Args[$i+1].ToString();
} else {
$Value = ""
};
switch -regex -case ($CurrentArg) {
"^(-h|--Help)$" {
check_help
}
"(-H|--Hostname)" {
$TaskStruct.Struct_TaskServer = $Value
# write-host $TaskStruct.TaskServer
}
"(-T|--Taskname)" {
$TaskStruct.Struct_TaskName = $Value
# write-host $TaskStruct.TaskName
}
"(-P|--Pathname)" {
$TaskStruct.Struct_TaskPath = $Value
# write-host $TaskStruct.TaskPath
}
default {
throw "Illegal arguments detected: $_"
}
}
}
}
catch {
Write-Host "Critical - $_"
Exit $return_status["CRITICAL"]
}
}
#main function
Function Check_MS_Win_Tasks {
#first connect to task schedule program
$service = New-Object -ComObject Schedule.Service
$service.Connect("")
$OutputString = ""
$ExitCode=[int]3
$folder = ""
$task = ""
#specify the task
try {
$folder = $service.GetFolder($TaskStruct.Struct_TaskPath)
} catch [Exception]
{
$OutputString = "Critical - Task Path " + $TaskStruct.Struct_TaskPath + " does not exist,please check."
$ExitCode = $return_status["CRITICAL"]
write-host $OutputString
exit $ExitCode
}
try {
$task = $folder.GetTask($TaskStruct.Struct_TaskName)
} catch [exception]
{
$OutputString = "Critical - Task " + $TaskStruct.Struct_TaskName + " does not exist,please check"
$ExitCode = $return_status["CRITICAL"]
write-host $OutputString
exit $ExitCode
}
$TaskName = $task.Name
$TaskPath = $task.Path
$LastTaskResult = $task.LastTaskResult
if ($LastTaskResult -eq "0" -and $task.Enabled)
{
$OutputString = "OK - Task $TaskName success."
$ExitCode = $return_status["OK"]
}
elseif ($LastTaskResult -eq "0x00041301" -and $task.Enabled)
{
$OutputString = "OK - Task $TaskName is still running."
$ExitCode = $return_status["OK"]
}
elseif ($task.Enabled)
{
$OutputString = "Critical - Task $TaskName fail."
$ExitCode = $return_status["CRITICAL"]
}
else
{
$OutputString = "Critical - Task $TaskName disable."
$ExitCode = $return_status["CRITICAL"]
}
# write-host "taskname is $TaskName, taskpath is $TaskPath, lasttaskresult is $LastTaskResult"
write-host $OutputString
exit $ExitCode
}
if($Args.length -ge 1)
{
Process_Args $Args
}
if(($TaskStruct.Struct_TaskName -eq "") -or ($TaskStruct.Struct_TaskPath -eq ""))
{
check_help
}
Check_MS_Win_Tasks