我们有一个非常紧急的中断窗口,对于我们的许多系统,服务器必须以正确的顺序重新启动。 正因为如此,我想编写我们的更新脚本。
我曾尝试使用Microsoft Script Repository中的Powershell脚本 ,但是,对于我来说,它不能远程工作,并不总是使用Invoke-Command,而是开始安装,然后返回而无需等待安装完成。 我希望每个系统在安装完成后重新启动,如果没有安装阻止或状态信息阻止,则很难编写脚本。 花费太多时间之后,试图使CCM_SoftwareUpdate和CCM_SoftwareUpdatesManager WMI类能够做我所需要的,我想是时候去问别人怎么处理类似的情况了。
我的一个朋友说,他的公司通过使用Shavlik解决了这个问题,不幸的是,这不是一个select。
我们正在使用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方法。 如果你愿意的话,你可以传递整个返回的数组,它会像往常一样将它们排队,逐一安装它们。
另外,如何为这个集合configuration一个维护窗口,告诉sccm不要在维护窗口之外安装更新? 当一个更新完成时,如果它已经过了维护窗口,那么它将停止安装更新(理论上对我来说,我从来没有维护过的豪华窗口)。
如果你是个gimmiedehcodez的人,那么这个代码应该用.NET 4.0和.NET编译
using System; using System.Collections.Generic; using System.ComponentModel; using System.Management; using System.Windows.Forms;
有关CCMClientSDK的更多信息,请点击这里
这是我从各种网页放在一起。 使用Powershell。 请注意,使用WinRM(远程服务器上的winrm quickconfig来启用WinRM)可以使用Invoke-Command
cmdlet而不是Invoke-WmiMethod
但在Server 2008和更新的版本上,这种方法对我来说会Invoke-WmiMethod
。 对于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)