Existe uma maneira de fazer o script da instalação das atualizações do System Center Configuration Manager listadas no Centro de Software?

5

Temos uma janela de interrupção muito apertada e, para muitos de nossos sistemas, os servidores devem ser reinicializados na ordem correta. Por causa disso, gostaria de fazer o script de nossas atualizações.

Eu tentei usar este script Powershell encontrado no Repositório de scripts da Microsoft , no entanto, para mim não funciona remotamente, nem sempre funciona usando Invoke-Command e ele inicia a instalação e retorna sem esperar que a instalação seja concluída. Eu gostaria que cada sistema reinicializado após a conclusão das instalações, isso é difícil de script sem o bloqueio de instalação ou informações de status para bloquear. Depois de gastar muito tempo, tentando fazer com que as classes WMI CCM_SoftwareUpdate e CCM_SoftwareUpdatesManager fizessem o que eu precisava, achei que era hora de perguntar como os outros poderiam estar lidando com situações semelhantes.

Um amigo meu diz que sua empresa resolveu esse problema usando Shavlik , infelizmente, isso não é uma opção aqui.

Estamos usando o SCCM 2012 e temos um mix de servidores de 2003, 2008 e 2012.

    
por Nathan Hartley 12.02.2014 / 22:05

2 respostas

2

Sim. Você pode fazer isso com powershell semelhante ao que o script que você postou tenta fazer. Eu me deparei com esse script há algum tempo, não consigo me lembrar se funcionou ou não, mas consegui algo para funcionar. Não sei porque o seu não funcionaria, ele usa os mesmos métodos, mas eu era capaz de fazer isso com o .NET e WMI usando C #, então eu sei que isso pode ser feito com o 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();

    }

Resumindo, usei a consulta WMI "SELECT * FROM CCM_SOFTWAREUPDATE WHERE COMPLIANCESTATE=0 AND EVALUATIONSTATE < 2" e passei cada atualização uma a uma para o método InstallUpdates, porque queria exibir o progresso semelhante a como a Microsoft faz isso. Você deve passar uma matriz para o método InstallUpdates, mesmo se estiver passando apenas um único objeto de atualização. Você poderia passar todo o array retornado se quisesse, e os colocaria em fila como sempre, instalando-os um por um.

Além disso, que tal configurar uma janela de manutenção para esta coleção e dizer ao sccm para não instalar atualizações fora da janela de manutenção? Quando uma atualização for concluída, se ela for passada pela janela de manutenção, ela parará de instalar as atualizações (em teoria, para mim, nunca tive a janela de manutenção de luxo).

se você é uma pessoa gimmiedehcodez , esse código deve ser compilado com o .NET 4.0 e

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Management;
using System.Windows.Forms;

Mais informações sobre o CCMClientSDK aqui

    
por 13.02.2014 / 22:56
1

Aqui está o que eu juntei de várias páginas da web. Usando o Powershell. Observe que você terá mais sucesso usando o WinRM (winrm quickconfig nos servidores remotos para habilitar o WinRM), que pode usar o cmdlet Invoke-Command em vez do Invoke-WmiMethod , mas esse método funciona para mim no Server 2008 e mais recente. Para o Server 2003, a verificação de avaliação de implantação do Updates funciona, mas o Powershell se queixará de algo. Execute os comandos localmente para contornar isso.

#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)
    
por 13.05.2015 / 01:06