我有以下功能,我注册了停止服务事件。 服务停止后,我想在事件中显示该ServiceName。但是,不知何故,下面的代码不想打印服务名称?
请参阅-Action开关中的Write-Host $ControllerSvc,” stopped ”
打印justs“已停止”。但是,如果我将代码更改为,这很好 -
Write-Host $e.ProcessName,” stopped ”
(我不想要,因为我的进程或图片名称对于所有服务都是相同的。它类似于svchost)
function Stop-MyService($SystemName)
{
$ControllerSvc = $SystemName+"Controller"
$svc = gwmi win32_service -filter "name = `"$ControllerSvc`""
$ControllerPid = $svc.ProcessId
Register-WMIEvent -query “SELECT * FROM Win32_ProcessStopTrace WHERE ProcessID=$ControllerPid” -SourceIdentifier “ControllerSvcEvent” -action {
$e = $Event.SourceEventArgs.NewEvent
Write-Host $ControllerSvc,” stopped ” #**** never prints out the variable****
unregister-event -sourceIdentifier “ControllerSvcEvent”
}
Stop-Service $ControllerSvc
}
NB :为了简单起见,我在这里展示了一项服务。其实 有多个服务停止其中一个停止 其他。所以,我想显示正在获取的服务名称 在活动中停了下来。
答案 0 :(得分:2)
这是我对备份查询的任务,注册Win32_Service.State值为'Stopped'的Win32_Service修改事件。我使用$ Event.SourceEventArgs.NewEvent.TargetInstance.Name来获取服务名称:
function Stop-MyService($SystemName)
{
$ControllerSvc = $SystemName
$query = "SELECT * FROM __InstanceModificationEvent WITHIN 2 " +
"WHERE TargetInstance Isa 'Win32_Service' " +
"AND TargetINstance.Name = '" + $ControllerSvc + "' " +
"AND TargetInstance.State = 'Stopped'"
$action =
{
Write-Host $Event.SourceEventArgs.NewEvent.TargetInstance.Name," stopped "
Unregister-Event -SourceIdentifier "ControllerSvcEvent"
}
Register-WMIEvent -query $query -SourceIdentifier "ControllerSvcEvent" -action $action
}
Stop-MyService 'MSSQL$SQLEXPRESS'
我使用SQL Server Express进行测试。
答案 1 :(得分:0)
尝试传递$ControllerSvc
到-MessageData
的{{1}}参数,然后根据this article可以通过Register-WMIEvent
访问它。