我正在通过GPO推送启动脚本。该脚本更新本地脚本(如果发生更改或删除),然后自行运行。
我希望只有当机器脱机且无法接收更新的脚本时才能在启动时运行本地脚本。是否有一个事件日志项,用于触发无法到达的DC-to-apply-GPO-on-boot?我不希望每次DC不可用时运行脚本(例如临时网络中断),仅在DC不可用时才启动。
有一个更好的方法吗?
我正在通过GPO推送启动脚本。该脚本更新本地脚本(如果发生更改或删除),然后自行运行。
我希望只有当机器脱机且无法接收更新的脚本时才能在启动时运行本地脚本。是否有一个事件日志项,用于触发无法到达的DC-to-apply-GPO-on-boot?我不希望每次DC不可用时运行脚本(例如临时网络中断),仅在DC不可用时才启动。
有一个更好的方法吗?
Answers:
一种相当简单的方法是始终在启动时运行PowerShell脚本,然后检查域是否可用:
Try {
[System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain() | Out-Null
} Catch {
# Code here
}
如果没有可以联系域控制器,那么 GetComputerDomain
函数抛出异常,执行落入catch块。如果域可用,则函数成功并且脚本结束。
当然,PowerShell脚本中的代码需要是PowerShell,但您可以通过将脚本转储到临时文件,运行批处理器,然后删除该文件来运行经典批处理:
Try {
[System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain() | Out-Null
} Catch {
$tmpBat = [System.IO.Path]::GetTempFileName() + '.bat'
@"
rem PUT YOUR BATCH CODE HERE
"@ | Out-File $tmpBat -Encoding ASCII
cmd /c $tmpBat
Remove-Item $tmpBat
}
批量代码之前缺少空格是有意的;多行字符串文字(由...描述的内容)是必要的 @"
和 "@
),这使您无需处理PowerShell转义。