¿La mejor manera de detectar si Windows tiene actualizaciones de Windows listas para descargar/instalar?

StackOverflow https://stackoverflow.com/questions/121585

  •  02-07-2019
  •  | 
  •  

Pregunta

Estoy específicamente interesado en Windows 2000/XP, pero Vista/7 también sería interesante (si es diferente).

Estaba pensando en la programación de tareas de un archivo por lotes o equivalente a diario.

EDITAR:Lo siento, debería haber proporcionado más información.La pregunta se refiere a 10 máquinas en las que aplico actualizaciones manualmente.No quiero instalar las actualizaciones mediante programación, sino simplemente averiguar si hay actualizaciones listas para descargar/instalar (es decir,el icono del escudo de actualización en la bandeja del sistema lo indica) usando un lote o script.Gracias.

¿Fue útil?

Solución 6

Al final, Windows sus no era una opción, así que estoy usando lo siguiente en un archivo por lotes junto con ActiveState ActivePerl (recomendado):

perl -nle "imprimir $_ si se detectan m/actualizaciones/i" < c:\Windows\WindowsUpdate.log

Esto puede ser tosco o sucio y podría romperse en el futuro, pero actualmente hace lo que necesito.

Gracias por todas las ideas.

Otros consejos

Podrías usar WUApiLib:

UpdateSessionClass session = new UpdateSessionClass();

IUpdateSearcher search = session.CreateUpdateSearcher();

ISearchResult result = search.Search("IsInstalled=0 and IsPresent=0 and Type='Software'");

int numberOfUpdates = result.Updates.Count - 1;

Log.Debug("Found " + numberOfUpdates.ToString() + " updates");

UpdateCollection updateCollection = new UpdateCollection();

for (int i = 0; i < numberOfUpdates; i++)
{
    IUpdate update = result.Updates[i];

    if (update.EulaAccepted == false)
    {
        update.AcceptEula();
    }

    updateCollection.Add(update);
}

if (numberOfUpdates > 0)
{
    UpdateCollection downloadCollection = new UpdateCollection();

    for (int i = 0; i < updateCollection.Count; i++)
    {
        downloadCollection.Add(updateCollection[i]);
    }

    UpdateDownloader downloader = session.CreateUpdateDownloader();

    downloader.Updates =  downloadCollection;

    IDownloadResult dlResult = downloader.Download();

    if (dlResult.ResultCode == OperationResultCode.orcSucceeded)
    {
        for (int i = 0; i < downloadCollection.Count; i++)
        {
            Log.Debug(string.Format("Downloaded {0} with a result of {1}", downloadCollection[i].Title, dlResult.GetUpdateResult(i).ResultCode));
        }

        UpdateCollection installCollection = new UpdateCollection();

        for (int i = 0; i < updateCollection.Count; i++)
        {
            if (downloadCollection[i].IsDownloaded)
            {
                installCollection.Add(downloadCollection[i]);
            }
        }

        UpdateInstaller installer = session.CreateUpdateInstaller() as UpdateInstaller;

        installer.Updates = installCollection;

        IInstallationResult iresult = installer.Install();

        if (iresult.ResultCode == OperationResultCode.orcSucceeded)
        {
            updated = installCollection.Count.ToString() + " updates installed";

            for (int i = 0; i < installCollection.Count; i++)
            {
                Log.Debug(string.Format("Installed {0} with a result of {1}", installCollection[i].Title, iresult.GetUpdateResult(i).ResultCode));
            }

            if (iresult.RebootRequired == true)
            {
                ManagementClass mcWin32 = new ManagementClass("Win32_OperatingSystem");

                foreach (ManagementObject shutdown in mcWin32.GetInstances())
                {
                    shutdown.Scope.Options.EnablePrivileges = true;
                    shutdown.InvokeMethod("Reboot", null);
                }
            }
        }

Windows sus Funciona muy bien para varias máquinas en una red.

La forma "más fácil" de saberlo es configurar las actualizaciones de Windows para que se realicen todas las noches y descargar las actualizaciones si están disponibles, lo que luego coloca el icono del escudo de actualización en la bandeja del sistema.Simplemente mire la bandeja para ver si el ícono está presente.

También puede configurar Windows para que busque actualizaciones todas las noches y luego descargarlas e instalarlas a una hora específica.

Con respecto a lo que dijo mdsindzeleta, hacer esto programáticamente probablemente no sea la mejor solución.Usaría las funciones integradas en Windows XP para descargar e instalar actualizaciones.Supongo que Vista tiene características similares.

Creo que las actualizaciones de Windows se descargan mediante el servicio BITS.Puede utilizar Bitsadmin.exe que se encuentra en las herramientas de soporte de Windows.Desde la línea de comando puede ejecutar bitsadmin.exe /list y puede ver el estado de los trabajos BITS.(es decir.progreso de la descarga, nombre del trabajo, estado del trabajo)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top