1

この問題を特定するために何時間も費やしました。さまざまなサービスが実行されているかどうかを確認するために、PowerShell を実行しています。Windows タスク スケジューラから 5 分ごとに実行したい。

他のサーバー上のサービスと、それが実行されている同じマシン上のいくつかのサービスをチェックします。インタラクティブに実行しているのと同じユーザーIDで、タスクスケジューラの下で実行すると、異なる結果が得られます。インタラクティブに、ローカル マシン上のすべてのサービスが実行されていることを示します。タスク スケジューラを実行すると、サービスが見つからないことがわかります。

これは、より大きなプログラムのほんの一部です。サーバー/サービス名を CSV ファイルから取得し、最後に素敵な HTML メールを送信します。Add-Content を追加して、これが起こっていることを証明するトレース ファイルを作成しました。

foreach ($line in $csv) {
    $reportStatus = "" 
    $ServerCount = $ServerCount + 1  

    #$Service = (get-service -Name $line.ServiceName -ComputerName $line.ServerName)
    #this is slower than above, but it gives us the processId which we can use to find out what time the service/process started 
    write-host "Verifying: " $line.ServerName $line.ServiceName 
    $myDate = Get-Date
    Add-Content D:\scripts\ServiceMonitorTrace.txt "$myDate  $($line.ServerName) $($line.ServiceName)"
    $Service = (get-wmiobject win32_service -ComputerName $line.ServerName -filter "name = '$($line.ServiceName)'")
    if ($Service -eq $null) 
    {
        $reportStatus = "Service Not Found: name = '$($line.ServiceName)'"
        $trColor = "Yellow"
        $ErrorCount = $ErrorCount + 1  
        $CriticalErrorCount = $CriticalErrorCount + 1
        $CreationDate = "NA" 
        Write-Host "----> $reportStatus " 
        Add-Content D:\scripts\ServiceMonitorTrace.txt "$myDate  $reportStatus" 
    }
  }

新しいシンプルなバージョン (まったく同じ問題があります): $Service = (get-wmiobject win32_service -ComputerName "DAL-BIZ-APP01" -filter "name = 'LanManServer'") if ($Service -eq $null) { $reportStatus = "サービスが見つかりません" } else { $reportStatus = "サービスが見つかりました" } $myDate = Get-Date Write-Host $reportStatus Add-Content D:\scripts\ServiceTestTrace.txt "$myDate $reportStatus"

インタラクティブな結果:

10/31/2013 09:34:00  DAL-BIZ-APP01 MSDTC
10/31/2013 09:34:00  DAL-BIZ-APP01 BTSSvc$BizTalkHost_QT_Default

スケジュールされたジョブの結果:

10/31/2013 09:25:42  DAL-BIZ-APP01 MSDTC
10/31/2013 09:25:42  Service Not Found: name = 'MSDTC'
10/31/2013 09:25:42  DAL-BIZ-APP01 BTSSvc$BizTalkHost_QT_Default

これを含むコマンドファイルから実行します:

powershell -command "& 'D:\Scripts\ServerMonitor.ps1'" d:\Scripts\ServerMonitorConfig.csv

管理者以外のコマンド プロンプト ウィンドウまたはスケジューラからコマンド ファイルを実行すると、結果も異なるようです。

新しいシンプルなバージョンを試してみたい場合は、2 つのコンピューター名を置き換えてください。

$Service = (get-wmiobject win32_service -ComputerName "DAL-BIZ-APP01" -filter "name = 'LanManServer'")
if ($Service -eq $null) 
{
  $reportStatus = "Service not found" 
}
else 
{
  $reportStatus = "Service found" 
}
$myDate = Get-Date
Write-Host $reportStatus
Add-Content D:\scripts\ServiceTestTrace.txt "$myDate  DAL-BIZ-APP01 $reportStatus" 

$Service = (get-wmiobject win32_service -ComputerName "DAL-BIZ-APP02" -filter "name = 'LanManServer'")
if ($Service -eq $null) 
{
  $reportStatus = "Service not found" 
}
else 
{
  $reportStatus = "Service found" 
}
$myDate = Get-Date
Write-Host $reportStatus
Add-Content D:\scripts\ServiceTestTrace.txt "$myDate  DAL-BIZ-APP02 $reportStatus" 

結果:

10/31/2013 16:07:48  DAL-BIZ-APP01 Service found
10/31/2013 16:07:48  DAL-BIZ-APP02 Service found
10/31/2013 16:08:03  DAL-BIZ-APP01 Service not found
10/31/2013 16:08:03  DAL-BIZ-APP02 Service found

16:07:48 はコマンド プロンプトから、16:08:03 はタスク スケジューラからのものです。

4

1 に答える 1

0

これをコードに追加しました:

if ($error -ne $null) 
{
    Write-Host "----> $($error[0].Exception) " 
    Add-Content $TraceFilename "$myDate TRCE1 $($error[0].Exception)" 
}

今、私は飲み込まれていた理由を見ることができます:

11/13/2013 11:35:37 TRCE1 System.Management.ManagementException: Microsoft.PowerShell.Commands の System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext() で System.Management.ManagementException.ThrowWithExtendedInfo (ManagementStatus errorCode) でアクセスが拒否されました。 GetWmiObjectCommand.BeginProcessing()

「アクセスが拒否されました」はまだわかりませんが、少なくとも本当のエラー、つまり「get-wmiobject win32_service...」の結果が null だった理由が表示されたことをうれしく思います。

ここの新しいスレッドで「アクセスが拒否されました」をフォローアップしています: アクセスが拒否されました - get-wmiobject win32_service (Powershell)

于 2013-11-13T17:43:14.547 に答える