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