У нас очень ограниченное окно простоя, и для многих наших систем серверы необходимо перезагружать в правильном порядке. Из-за этого я хотел бы сценарий наших обновлений.
Я пытался использовать это Скрипт Powershell, найденный в репозитории скриптов MicrosoftОднако для меня он не работает удаленно, не всегда работает с помощью Invoke-Command, запускает установку, а затем возвращается, не дожидаясь завершения установки. Я бы хотел, чтобы каждая система перезагружалась после завершения установки, это сложно написать сценарий без блокировки установки или информации о состоянии, которую нужно заблокировать. Потратив слишком много времени на попытки заставить WMI-классы CCM_SoftwareUpdate и CCM_SoftwareUpdatesManager делать то, что мне нужно, я подумал, что пришло время спросить, как другие могут справляться с подобными ситуациями.
Мой друг говорит, что его компания решила эту проблему, используя Шавликк сожалению, здесь это не вариант.
Мы используем SCCM 2012 и несколько серверов 2003, 2008 и 2012 годов.
Да. Вы можете сделать это с помощью PowerShell, аналогично тому, что пытается сделать опубликованный вами скрипт. Некоторое время назад я наткнулся на этот сценарий, не могу вспомнить, сработал он или нет, но кое-что у меня получилось. Не знаю, почему он не работает, он использует те же методы, но я смог сделать это с .NET и WMI с помощью C #, поэтому я знаю, что это можно сделать с помощью PowerShell.
private void InstallUpdates()
{
ManagementScope sc = new ManagementScope(@"\\.\root\ccm\clientsdk");
ManagementClass c = new ManagementClass(@"CCM_SoftwareUpdatesManager");
ManagementObjectSearcher s = new ManagementObjectSearcher("SELECT * FROM CCM_SOFTWAREUPDATE WHERE COMPLIANCESTATE=0 AND EVALUATIONSTATE < 2");
c.Scope = s.Scope = sc;
ManagementObjectCollection col = s.Get();
List<ManagementObject> lUpdates = new List<ManagementObject>();
//Install each update individually and display progress
int index = 1;
//double progress = 5/10;
//progressBar1.Value = progress;
//this.Enabled = false;
foreach (ManagementObject o in col)
{
System.Management.ManagementBaseObject[] args = { o };
object[] methodArgs = { args };
c.InvokeMethod("InstallUpdates", methodArgs);
lblCurrentUpdate.Text = "Now Installing Update " + index + " of " + col.Count;
UInt32 evalState = 0;
progressBar1.Value = (int)(((index) / (double)col.Count)*100.0);
//isCompleted = false;
//backgroundWorker1.RunWorkerAsync(o);
while (evalState < 7)
{
try
{
o.Get();
evalState = (UInt32)o.Properties["EvaluationState"].Value;
}
catch (Exception ex)
{
break;
}
}
++index;
}
//this.Enabled = true;
//Restart Workstation
System.Diagnostics.Process.Start("shutdown.exe", "-r -t 0 -f");
Application.Exit();
}
Вкратце, я использовал запрос WMI "SELECT * FROM CCM_SOFTWAREUPDATE WHERE COMPLIANCESTATE=0 AND EVALUATIONSTATE < 2"
и передавал каждое обновление одно за другим в метод InstallUpdates, потому что я хотел отображать прогресс, аналогичный тому, как это делает Microsoft. Вы должны передать массив методу InstallUpdates, даже если вы передаете только один объект обновления. Вы можете передать весь возвращенный массив, если хотите, и он будет ставить их в очередь, как всегда, устанавливая их один за другим.
Кроме того, как насчет настройки окна обслуживания для этой коллекции и указания sccm не устанавливать обновления вне окна обслуживания? Когда одно обновление завершено, если оно прошло через окно обслуживания, оно перестанет устанавливать обновления (теоретически для меня у меня никогда не было роскоши окна обслуживания).
если ты Gimmiedehcodez любопытный человек, этот код должен компилироваться с .NET 4.0 и
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Management;
using System.Windows.Forms;
Дополнительная информация о CCMClientSDK Вот
Вот то, что я собрал с разных веб-страниц. Используя Powershell. Обратите внимание, что вы добьетесь большего успеха с помощью WinRM (winrm quickconfig на удаленных серверах, чтобы включить WinRM), который может использовать Invoke-Command
командлет вместо Invoke-WmiMethod
но этот метод работает у меня на Server 2008 и новее. Для Server 2003 оценка развертывания обновлений работает, но Powershell на что-то пожалуется. Запустите команды локально, чтобы обойти это.
#Start the System Center Configuration Manager Software Updates Deployment Evaluation Scan
$trigger = '{00000000-0000-0000-0000-000000000108}'
$scan = Invoke-WmiMethod -ComputerName $server -Namespace root\ccm -Class sms_client -Name TriggerSchedule $trigger
[System.Management.ManagementObject[]] $CMMissingUpdates = @(GWMI -ComputerName $server -query "SELECT * FROM CCM_SoftwareUpdate WHERE ComplianceState = '0'" -namespace "ROOT\ccm\ClientSDK") #End Get update count.
(GWMI -ComputerName $server -Namespace "root\ccm\clientsdk" -Class "CCM_SoftwareUpdatesManager" -List).InstallUpdates($CMMissingUpdates)