加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

脚本 – 是否有办法编写软件中心中列出的System Center Configur

发布时间:2020-12-14 00:03:19 所属栏目:Windows 来源:网络整理
导读:我们有一个非常严格的中断窗口,对于我们的许多系统,必须以正确的顺序重新启动服务器.因此,我想编写我们的更新脚本. 我试图使用这个Powershell script found in the Microsoft Script Repository,但是,对我来说它不能远程工作,并不总是使用Invoke-Command工作
我们有一个非常严格的中断窗口,对于我们的许多系统,必须以正确的顺序重新启动服务器.因此,我想编写我们的更新脚本.

我试图使用这个Powershell script found in the Microsoft Script Repository,但是,对我来说它不能远程工作,并不总是使用Invoke-Command工作,它启动安装然后返回而不等待安装完成.我希望在安装完成后重新启动每个系统,如果没有安装阻止或状态信息阻止,这很难编写脚本.在花了太多时间之后,尝试使CCM_SoftwareUpdate和CCM_SoftwareUpdatesManager WMI类能够满足我的需求,我认为现在是时候问别人如何处理类似情况了.

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

我们正在使用SCCM 2012,并混合使用2003,2008和2012服务器.

是.您可以使用PowerShell执行此操作,类似于您发布的脚本尝试执行的操作.我不久前遇到了那个剧本,不记得它是否有效,但我确实得到了一些工作.不知道为什么他不会工作,它确实使用相同的方法,但我能够使用C#使用.NET和WMI,所以我知道可以用powershell完成.
private void InstallUpdates()
    {
        ManagementScope sc = new ManagementScope(@".rootccmclientsdk");
        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 here的更多信息

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读