使用 Powershell 作业的 Active Directory sysvol 检查脚本

Dar*_*tux 1 windows powershell active-directory sysvol windows-server-2012-r2

我正在开发用于活动目录监控的 sysvol 检查脚本。完成了在给定域中的所有域控制器上检查与 sysvol 连接的脚本。作为其中的一部分,我正在做以下检查

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

这将返回以毫秒为单位的时间;不幸的是,由于明显的原因,即使 sysvol 无法访问,它也会返回时间,并且与可访问相比,它甚至更快。

我的问题是当我收到工作时,有没有办法找出工作是否有错误?因为测量命令并没有给出全貌。如果有任何其他关于此的问题,请告诉我。

Rya*_*ies 6

首先,我不明白你的语法。我在 Windows 10 上运行 PS v5,你的代码片段甚至没有运行,因为你输入的Start-Job是一个字符串,而不是一个脚本块。而-sb不是一个可以接受的别名/速记-ScriptBlock我。

但谁知道呢,也许这在 PS v4 中是合法的。这不是重点。

你应该添加-ErrorAction Stop到您的dir/ gci/ get-childitemcmdlet,以便它,如果它失败,产生了“终止”的错误。

看,这是我没有指定的工作-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
Run Code Online (Sandbox Code Playgroud)

我不知道这份工作到底是成功还是失败了。无论作业是否成功,作业的状态都会从 Running 变为 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
Run Code Online (Sandbox Code Playgroud)

现在您看到同一个作业进入失败状态。你现在知道你的工作失败了。此外,如果您要保存作业的结果

PS C:\> $Result = Receive-Job $MyJob
Run Code Online (Sandbox Code Playgroud)

$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
Run Code Online (Sandbox Code Playgroud)