有没有办法确定 Powershell 中的当前引导阶段?
Is there a way to determine the current boot phase in Powershell?
我需要确保可能在 Windows 引导阶段的早期部分执行的 Powershell 脚本等到 Winlogon Init
或 Post Boot
阶段继续执行.有没有办法确定 Powershell/.NET 中的当前启动阶段? P/Invoke 必要时可以接受。
不是,问题是整个启动过程是异步的。
您可能会通过检查 winlogon.exe
或即使至少有一个用户已登录来确定登录屏幕是否如 Mathias 建议的那样显示检查 userinit.exe
已经开始:
Register-WmiEvent -Query SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName='userinit.exe'" -Action {...}
但即便如此也不会自动暗示例如网络已启动并且 运行,可以访问互联网或域。这是因为自 windows 7 起,Microsoft 已 fast user logon enabled by default (see also: Understand the Effect of Fast Logon Optimization and Fast Startup on Group Policy)。
这基本上意味着在很多情况下用户已经登录(使用缓存的凭据)prior 建立网络连接...
所以如果你的脚本依赖于例如一个域,您将需要创建一个事件来捕获网络更改:
Register-ObjectEvent ([System.Net.NetworkInformation.NetworkChange]) 'NetworkAddressChanged' -Action {...}
然后 ping 域以确认该域确实可用...
结论
您无需尝试定义 "current boot phase",而是需要定义 cmdlet 的依赖项并相应地检查它们(或构建特定事件)。
我需要确保可能在 Windows 引导阶段的早期部分执行的 Powershell 脚本等到 Winlogon Init
或 Post Boot
阶段继续执行.有没有办法确定 Powershell/.NET 中的当前启动阶段? P/Invoke 必要时可以接受。
不是,问题是整个启动过程是异步的。
您可能会通过检查 winlogon.exe
或即使至少有一个用户已登录来确定登录屏幕是否如 Mathias 建议的那样显示检查 userinit.exe
已经开始:
Register-WmiEvent -Query SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName='userinit.exe'" -Action {...}
但即便如此也不会自动暗示例如网络已启动并且 运行,可以访问互联网或域。这是因为自 windows 7 起,Microsoft 已 fast user logon enabled by default (see also: Understand the Effect of Fast Logon Optimization and Fast Startup on Group Policy)。 这基本上意味着在很多情况下用户已经登录(使用缓存的凭据)prior 建立网络连接...
所以如果你的脚本依赖于例如一个域,您将需要创建一个事件来捕获网络更改:
Register-ObjectEvent ([System.Net.NetworkInformation.NetworkChange]) 'NetworkAddressChanged' -Action {...}
然后 ping 域以确认该域确实可用...
结论
您无需尝试定义 "current boot phase",而是需要定义 cmdlet 的依赖项并相应地检查它们(或构建特定事件)。