有没有办法为软件中心中列出的 System Center Configuration Manager 更新的安装编写脚本?

Nat*_*ley 5 scripting configuration-management windows-update sccm sccm-2012

我们有一个非常紧张的中断窗口,对于我们的许多系统,必须以正确的顺序重新启动服务器。因此,我想编写我们的更新脚本。

我曾尝试使用Microsoft Script Repository 中的这个Powershell 脚本,但是,对我来说它不能远程工作,并不总是使用 Invoke-Command 工作,它开始安装然后返回而不等待安装完成。我希望在安装完成后重新启动每个系统,这很难在没有安装阻塞或状态信息阻塞的情况下编写脚本。在花了太多时间试图让 CCM_SoftwareUpdate 和 CCM_SoftwareUpdatesManager WMI 类做我需要的事情之后,我想是时候问问其他人可能如何处理类似的情况了。

我的一个朋友说他的公司通过使用Shavlik解决了这个问题,不幸的是,这不是一个选择。

我们使用 SCCM 2012 并混合使用 2003、2008 和 2012 服务器。

MDM*_*313 2

是的。您可以使用 powershell 执行此操作,类似于您发布的脚本尝试执行的操作。我不久前遇到过这个脚本,不记得它是否有效,但我确实得到了一些东西。不知道为什么他的不起作用,它确实使用相同的方法,但我能够使用 C# 通过 .NET 和 WMI 来完成此操作,所以我知道它可以使用 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();

    }
Run Code Online (Sandbox Code Playgroud)

简而言之,我使用了 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;
Run Code Online (Sandbox Code Playgroud)

有关 CCMClientSDK 的更多信息请参见此处