Я хотел бы получить Update Status
автоматически ( Update Status
это предложение You're up to date
на скриншоте ниже).
Я нашел, как получить Last checked
временную метку в PowerShell, используя:
$(New-Object -ComObject Microsoft.Update.AutoUpdate).Results.LastSearchSuccessDate;
Однако попытка найти Update Status
полностью ускользает от меня. Я не уверен, хранится ли где-то сам статус или приложение настроек определяет статус на основе количества доступных обновлений, но я не нашел решения для репликации статуса.
Кто-нибудь знает, возможно ли это сделать? Я не собираюсь автоматически принудительно устанавливать обновления, мне нужно только получить статус.
Обычно это статус You're up to date
или Updates available
, но я думаю, что есть и другие статусы, например Update Failed
.
Редактировать:Следующий код, похоже, не делает то, что я ищу:
решение1
Используйте Microsoft.Update.Session
объект для поиска назначенных обновлений программного обеспечения, которые не скрыты или уже установлены. Если ничего не найдено, значит, обновлений нет, в противном случае есть некоторые доступные:
$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;
Чтобы запустить это на удаленном компьютере, используйте 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;
Кроме того, если вам необходимо запустить это на удаленном сервере, который не находится в том же домене,следуйте моему ответу здесь, чтобы установить его как доверенный хост
Вот пример вывода скрипта:
компьютер1 ---------- Состояние обновления Windows: Последняя проверка: 26.01.2021 13:40:39 До настоящего времени компьютер2 ---------- Состояние обновления Windows: Последняя проверка: 26.01.2021 05:59:41 Доступны обновления: Накопительное обновление 2020-10 для .NET Framework 3.5 и 4.8 для Windows 10 версии 2004 для x64 (KB4578968) Обновление функций для Windows 10, версия 20H2
решение2
Продолжая свой комментарий. Всякий раз, когда вы запускаете Настройки и нажимаете Обновить, Windows динамически проверяет наличие обновлений. Вы можете сделать это самостоятельно.
($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();
#>
На основе результатов обнаружения вы можете использовать логику, чтобы выдать любое сообщение по вашему выбору.
If ($WindowsUpdateInfo.DetectNow() -eq $Null)
{"You're up to date"}
Else
{
Write-Warning -Message "Updates available
Last checked: $($WindowsUpdateInfo.Results)"
}
См. также похожий вариант:
https://michlstechblog.info/blog/windows-10-trigger-detecting-updates-from-command-line