web-dev-qa-db-ja.com

Powershellジョブを使用したActiveDirectorysysvolチェックスクリプト

ActiveDirectory監視用のsysvolチェックスクリプトに取り組んでいます。指定されたドメイン内のすべてのドメインコントローラーでsysvolへの接続をチェックするスクリプトを完了しました。この一環として、私は以下のチェックを行っています

Start-Job -sb "(Measure-Command{Dir \\$DCName\sysvol\$Domain\Policies}).Milliseconds"

これは、ミリ秒単位でかかった時間を返します。残念ながら、明らかな理由により、sysvolにアクセスできない場合でも、アクセス可能な場合に比べてさらに高速な時間を返します。

私の質問は、いつ受け取るかです-ジョブ、ジョブにエラーがあるかどうかを確認する方法はありますか?測定コマンドでは全体像がわからないためです。これに関して他にご不明な点がありましたらお知らせください。

1
Darktux

まず、あなたの構文がわかりません。私はWindows10でPSv5を実行していますが、スクリプトブロックではなく文字列をStart-Jobに入力したため、コードスニペットも実行されません。そして、-sbは私にとって-ScriptBlockの受け入れ可能な別名/省略形ではありませんでした。

しかし、誰が知っているか、多分それはPSv4では合法でした。それは重要なことではありません。

-ErrorAction Stopdir/gci/get-childitemコマンドレットに追加して、失敗した場合に「終了」エラーを生成するようにする必要があります。

見よ、これが私が-ErrorAction Stopを指定しないときの仕事です:

PS C:\> $MyJob = Start-Job -ScriptBlock { (Measure-Command{Dir \\$DCName\sysvol\$Domain\Policies}).Milliseconds }
PS C:\> $MyJob.State
Running
PS C:\> $MyJob.State
Completed

ジョブが実際に成功したか失敗したかはわかりません。ジョブの状態は、ジョブの成功に関係なく、単に実行中から完了になります。

それでは、終了エラーで再試行してみましょう。

PS C:\> $MyJob = Start-Job -ScriptBlock { (Measure-Command{Dir \\$DCName\sysvol\$Domain\Policies -ErrorAction Stop}).Milliseconds }
PS C:\> $MyJob.State
Running
PS C:\> $MyJob.State
Failed

これで、同じジョブが失敗の状態になっていることがわかります。あなたは今あなたの仕事が失敗したことを知っています。さらに、ジョブの結果を次のように保存する場合

PS C:\> $Result = Receive-Job $MyJob

ジョブが失敗した場合、$Resultはnullになります。

ジョブ内で発生した特定のエラーを保存する場合は、次のことを試してください。

PS C:\> Receive-Job $MyJob -ErrorVariable Result
PS C:\> $Result
Cannot find path '\\\sysvol\\Policies' because it does not exist.
+ CategoryInfo          : ObjectNotFound: (\\\sysvol\\Policies:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
+ PSComputerName        : localhost
6
Ryan Ries