![¿Cómo puedo obtener automáticamente el "Estado de actualización" de una computadora, como se muestra en la Configuración?](https://rvso.com/image/1642373/%C2%BFC%C3%B3mo%20puedo%20obtener%20autom%C3%A1ticamente%20el%20%22Estado%20de%20actualizaci%C3%B3n%22%20de%20una%20computadora%2C%20como%20se%20muestra%20en%20la%20Configuraci%C3%B3n%3F.png)
Me gustaría obtener Update Status
automáticamente ( Update Status
siendo la oración You're up to date
en la captura de pantalla a continuación).
Descubrí cómo obtener la Last checked
marca de tiempo en PowerShell usando:
$(New-Object -ComObject Microsoft.Update.AutoUpdate).Results.LastSearchSuccessDate;
Sin embargo, intentar encontrarlo Update Status
se me escapa por completo. No estoy seguro de si el estado en sí está almacenado en algún lugar o si la aplicación de configuración determina el estado en función de la cantidad de actualizaciones disponibles, pero no he encontrado una solución para replicar el estado.
¿Alguien sabe si esto es posible lograrlo? No busco forzar la instalación automática de las actualizaciones, solo necesito obtener el estado.
El estado suele ser You're up to date
o Updates available
, pero creo que hay otros estados como Update Failed
.
Editar:El siguiente código no parece hacer lo que estoy buscando:
Respuesta1
Utilice el Microsoft.Update.Session
objeto para buscar actualizaciones de software asignadas que no estén ocultas o ya instaladas. Si no se encuentra ninguna, no hay actualizaciones; en caso contrario, hay algunas disponibles:
$updateInfoMsg = "Windows Update Status: `n";
$UpdateSession = New-Object -ComObject Microsoft.Update.Session;
$UpdateSearcher = $UpdateSession.CreateupdateSearcher();
$Updates = @($UpdateSearcher.Search("IsAssigned=1 and IsHidden=0 and IsInstalled=0 and Type='Software'").Updates);
$Found = ($Updates | Select-Object -Expand Title);
If ($Found -eq $Null) {
$updateInfoMsg += "Up to date";
} Else {
$Found = ($Updates | Select-Object -Expand Title) -Join "`n";
$updateInfoMsg += "Updates available:`n";
$updateInfoMsg += $Found;
}
$updateInfoMsg;
Para ejecutar esto en una computadora remota, use Invoke-Command
:
$server = "server";
<# Get Windows Update Info #>
$out += Invoke-Command -ComputerName $server -ScriptBlock {
$updateInfoMsg = "Windows Update Status: `n";
$UpdateSession = New-Object -ComObject Microsoft.Update.Session;
$UpdateSearcher = $UpdateSession.CreateupdateSearcher();
$Updates = @($UpdateSearcher.Search("IsAssigned=1 and IsHidden=0 and IsInstalled=0 and Type='Software'").Updates);
$Found = ($Updates | Select-Object -Expand Title);
If ($Found -eq $Null) {
$updateInfoMsg += "Up to date";
} Else {
$Found = ($Updates | Select-Object -Expand Title) -Join "`n";
$updateInfoMsg += "Updates available:`n";
$updateInfoMsg += $Found;
}
Return $updateInfoMsg;
}
$out;
Además, si necesita ejecutar esto en un servidor remoto que no está en el mismo dominio,sigue mi respuesta aquí para configurarlo como un host confiable
Aquí hay un ejemplo de salida del script:
computadora1 ---------- Estado de actualización de Windows: Última consulta: 26/01/2021 13:40:39 A hoy computadora2 ---------- Estado de actualización de Windows: Última consulta: 26/01/2021 05:59:41 Actualizaciones disponibles: Actualización acumulativa 2020-10 para .NET Framework 3.5 y 4.8 para Windows 10 versión 2004 para x64 (KB4578968) Actualización de funciones a Windows 10, versión 20H2
Respuesta2
Continuando con mi comentario. Cada vez que activas Configuración y haces clic en Actualizar. Windows busca actualizaciones dinámicamente. Puede hacerlo usted mismo.
($WindowsUpdateInfo = $(New-Object -ComObject Microsoft.Update.AutoUpdate)) |
Get-Member
# Results
<#
TypeName: System.__ComObject#{4a2f5c31-cfd9-410e-b7fb-29a653973a0f}
Name MemberType Definition
---- ---------- ----------
DetectNow Method void DetectNow ()
EnableService Method void EnableService ()
Pause Method void Pause ()
Resume Method void Resume ()
ShowSettingsDialog Method void ShowSettingsDialog ()
Results Property IAutomaticUpdatesResults Results () {get}
ServiceEnabled Property bool ServiceEnabled () {get}
Settings Property IAutomaticUpdatesSettings Settings () {get}
MSDN ScriptMethod System.Object MSDN();
#>
Según los resultados de la detección, puede utilizar la lógica para escupir el mensaje que elija.
If ($WindowsUpdateInfo.DetectNow() -eq $Null)
{"You're up to date"}
Else
{
Write-Warning -Message "Updates available
Last checked: $($WindowsUpdateInfo.Results)"
}
Véase también para una toma similar:
https://michlstechblog.info/blog/windows-10-trigger-detecting-updates-from-command-line