我可以查询什么以查看Windows是否已启动并完成更新?

时间:2019-03-14 05:21:23

标签: windows powershell wmi

我的目标是远程检查一组计算机(广泛的列表),不仅查看服务器是否已重新启动(通常是在上次重新启动时),而且还查看Windows是否在登录屏幕上完全启动并正在运行,并且不会重新启动以进行进一步的更新,或者仍在安装更新。

我确实找到了一个名为AppReadiness的服务,该服务将其停止,直到服务器重新启动为止。我担心如果将其设置为手动,则可能无法始终启动。有人可以确认这是否可靠吗?

编辑:在撰写本文时,我确实发现它已停止运行,直到它显示“正在处理更新,已100%完成,请不要关闭计算机”,但是由于服务器挂起了该消息, AppReadiness服务已启动。还有什么更好看的吗?我已经阅读过其他有关不同问题的答案,例如C $是否可用,但是比AppReadiness可用的时间早。

用于检查服务的代码:

$creds = Get-Credential -Message "Enter server credentials:" -UserName "SERVERNAME\Administrator"
Get-WmiObject Win32_Service -ComputerName "SERVERIPADDRESS" -Credential $creds | Where-Object {$_.Name -eq "AppReadiness"}

编辑2:另外,除了监视服务之外,我还尝试寻找诸如winlogon.exe和loginui.exe之类的进程来指导服务器的状态,但是我没有收到想要记录的结果。这些过程显示了服务器何时准备就绪,我希望它们仅在可见登录GUI时显示。

编辑3:

此编辑针对@ Kelv.Gonzales的回答,他说要检查Windows事件日志“ DHCPv4客户端服务已启动”日志条目。那是行不通的,与我监控的其他服务和事件不相上下。在登录屏幕之前显示有效。

Image Showing Windows Is Working On Updates When Event Is Posted

我的代码是:

$creds = Get-Credential -Message "Enter server credentials:" -UserName "SERVERNAME\Administrator"
$server = "IPADDRESSOFSERVER"

while($true)
{
    $event = Get-WmiObject Win32_NTLogEvent -ComputerName $server -Credential $creds -Filter "(logfile='System' AND eventcode = '50036')" | select -First 1
    $event.ConvertToDateTime($event.TimeWritten)
    Start-Sleep -Seconds 5
}

3 个答案:

答案 0 :(得分:3)

那只班轮当然会开火一次。使用WMI而不是内置PowerShell cmdlet-Get-Service的任何原因?

我的建议是使用WMI事件观察器,使用您已经拥有的东西,但将服务和任何相关服务作为目标,并让该事件在状态运行时通知您。

Use PowerShell to Monitor and Respond to Events on Your Server

本文使用PowerShell和VBScript进行此操作,但是您可以使用所有PowerShell进行此操作。

您可以有一个临时的或永久的监视者。

PowerShell and Events: WMI Temporary Event Subscriptions

这些内容可能会更深一些,因此,如果不适合您,则只需在服务循环中停止运行的Do Loop中使用一行即可。

基本示例:

$TargetHost = $env:COMPUTERNAME
do {
    $TargetOperation = Get-WmiObject Win32_Service -ComputerName $TargetHost  | 
    Where-Object {$_.Name -eq "AppReadiness"}
    "Checking host $TargetHost for service/process $($TargetOperation.Name)"
    Start-Sleep -Seconds 3
} until (($TargetOperation).State -eq 'Running')
"Validation of host $TargetHost for service/process $($TargetOperation.Name) complete"

# Results

Checking host WS70 for service/process AppReadiness
Checking host WS70 for service/process AppReadiness
Checking host WS70 for service/process AppReadiness
Validation of host WS70 for service/process AppReadiness complete

您当然可以使用操作逻辑添加任意数量的服务或进程。

以上所有内容几乎适用于您想要观看的任何内容。服务,流程,文件文件夹。

或者只是在循环中使用此脚本。

  

Get Remote Logon Status - Powershell

     

此脚本将返回本地或远程的登录状态   机。返回类型包括“未登录”,“已锁定”,“已登录”   ”和“离线”。

     

最有用的部分是检查计算机是否位于   锁定状态,尽管其他返回类型也可能有用。

     

这是一个简单的功能,可以很容易地包含在较大的功能中   脚本。返回类型可以更改为呼叫号码   脚本来更轻松地解析返回值。

     

下载:GetRemoteLogonStatus.ps1

答案 1 :(得分:3)

会发现0个更新排队等待您完成所需的工作吗? arcticle详细介绍了如何实现。

要检查Windows是否准备好登录,是否可以查询“ DHCPv4客户端服务已启动”的事件日志-事件ID 50036满足Windows是否准备就绪的情况。

答案 2 :(得分:0)

我花了一周的时间寻找解决此问题的方法。我想分享目前最好的解决方案,希望对您有所帮助。

@ kelv-gonzales用他对Windows Modules InstallerTrustedInstaller的评论向我指出了正确的方向。

我的解决方案崩溃

存在一个名为TiWorker.exe的进程,它是Windows Modules Installer Worker进程。这是负责实际安装Windows Update的过程。这个过程(从我观察到的结果来看)在安装Windows Update的整个过程中可靠地运行。一旦安装了更新并需要重新启动,此过程将停止并消失。

当您重新引导计算机以满足未决的重新引导时,TiWorker.exe进程是在计算机重新启动时最先启动的进程之一。在某些情况下,根据更新的性质,将在计算机重新启动时完成更新的安装(即在启动过程中看到的百分比不断增加)。登录屏幕可用后,此过程通常将继续运行大约4分钟(根据我的观察)。之后,它停止并消失。我发现,等待这几分钟对于可靠地知道更新何时完成处理要付出很小的代价。

我的脚本逻辑

我能够编写一个脚本来取消该服务的存在。例如,下面是我的脚本的高级流程。

  1. 开始安装Windows Update。
  2. 等待更新以完成安装并等待重启。
  3. 一旦存在挂起的重启,请等待TiWorker.exe不再运行,然后触发重启。
  4. 计算机正在重新引导时,请在重新引导期间反复检查计算机的状态。备份计算机时,TiWorker.exe将开始备份以完成更新。一直等到TiWorker.exe不再运行(通常,更新将完成,并且操作系统将在锁定屏幕上等待约2分钟,然后该过程停止)。

代码

我修改了@ gabriel-graves发布的代码,以检查TiWorker.exe进程。

$creds = Get-Credential -Message "Enter server credentials:" -UserName "SERVERNAME\Administrator"
Get-WmiObject Win32_Process -ComputerName "SERVERIPADDRESS" -Credential $creds | Where-Object {$_.Name -eq "TiWorker.exe"}