我需要确保可以在Windows启动阶段的早期阶段执行的Powershell脚本等待Winlogon Init
或Post Boot
阶段继续执行。有没有办法确定Powershell / .NET中的当前启动阶段?如有必要,可以使用P / Invoke。
答案 0 :(得分:1)
实际上,问题在于完整的启动过程是异步的。
您可以通过检查winlogon.exe
或者即使至少有一个用户登录,例如,您可以确定登录屏幕显示为Mathias建议。检查userinit.exe
已经开始:
Register-WmiEvent -Query SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName='userinit.exe'" -Action {...}
但即便如此也不会自动暗示,例如网络正常运行,可以访问互联网或域。这是因为自Windows 7以来,默认情况下Microsoft已启用fast user logon(另请参阅:Understand the Effect of Fast Logon Optimization and Fast Startup on Group Policy)。 这基本上意味着在许多情况下用户已经登录(使用缓存凭证)之前建立网络连接......
所以如果你的脚本取决于例如在域中,您需要创建一个事件来捕获网络更改:
Register-ObjectEvent ([System.Net.NetworkInformation.NetworkChange]) 'NetworkAddressChanged' -Action {...}
并且ping到域以确认该域名确实可用...
您不需要尝试定义“当前启动阶段”,而是需要定义cmdlet的依赖关系并相应地检查它们(或构建特定事件)。