有没有办法确定Powershell中的当前启动阶段?

时间:2017-10-06 16:12:37

标签: .net powershell boot

我需要确保可以在Windows启动阶段的早期阶段执行的Powershell脚本等待Winlogon InitPost Boot阶段继续执行。有没有办法确定Powershell / .NET中的当前启动阶段?如有必要,可以使用P / Invoke。

1 个答案:

答案 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的依赖关系并相应地检查它们(或构建特定事件)。