我正在通过 GPO 推送启动脚本。该脚本会更新本地脚本(以防更改或删除),然后自行运行。
我希望仅当计算机处于离线状态且无法接收更新的脚本时,才在启动时运行本地脚本。是否有可以触发“无法到达 DC 以在启动时应用 GPO”的事件日志项?我不希望脚本在每次 DC 不可用时运行(例如,网络暂时中断),只在 DC 不可用时在启动时运行。
有一个更好的方法吗?
答案1
一种相当直接的方法是在启动时始终运行 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 转义的麻烦。