2009-05-28 11 views
14

¿Hay alguna API para escribir un programa de C# que pueda interactuar con la actualización de Windows y usarla para instalar determinadas actualizaciones?Use C# para interactuar con la actualización de Windows

Estoy pensando en algún lugar en la línea de almacenar una lista en un depósito central de actualizaciones aprobadas. Luego, las aplicaciones del lado del cliente (que tendrían que instalarse una vez) interactuarían con Windows Update para determinar qué actualizaciones están disponibles, luego instalarían las que están en la lista aprobada. De esta forma, las actualizaciones se siguen aplicando automáticamente desde una perspectiva del lado del cliente, pero puedo seleccionar qué actualizaciones se están aplicando.

Este no es mi papel en la empresa por cierto, realmente me preguntaba si hay una API para la actualización de Windows y cómo usarla.

+0

seguramente están buscando la API de Windows Update Agent: http://msdn.microsoft.com/en-us/library/aa387099.aspx –

+0

Eso es una interfaz COM orientada a C y C++, por lo menos que quería darme un tutorial sobre cómo llamar a las API COM desde C#, no me ayuda = (. Aunque, seré el primero en admitir que esto es un error de mi conocimiento, y no de su respuesta. – DevinB

+0

No conozco ninguna API de C#. ¿Pero considera [Servicio de actualización de Windows Server] (http://technet.microsoft.com/en-us/wsus/default.aspx) para ayudarlo a administrar Windows Update para nivel empresarial? –

Respuesta

19

agregar una referencia a WUApiLib a su proyecto de C#.

using WUApiLib; 
protected override void OnLoad(EventArgs e){ 
    base.OnLoad(e); 
    UpdateSession uSession = new UpdateSession(); 
    IUpdateSearcher uSearcher = uSession.CreateUpdateSearcher(); 
    uSearcher.Online = false; 
    try { 
     ISearchResult sResult = uSearcher.Search("IsInstalled=1 And IsHidden=0"); 
     textBox1.Text = "Found " + sResult.Updates.Count + " updates" + Environment.NewLine; 
     foreach (IUpdate update in sResult.Updates) { 
       textBox1.AppendText(update.Title + Environment.NewLine); 
     } 
    } 
    catch (Exception ex) { 
     Console.WriteLine("Something went wrong: " + ex.Message); 
    } 
} 

Dado que tiene un formulario con un cuadro de texto esto le dará una lista de las actualizaciones instaladas actualmente. Consulte http://msdn.microsoft.com/en-us/library/aa387102(VS.85).aspx para obtener más documentación.

Esto, sin embargo, no le permitirá encontrar revisiones de KB que no se distribuyan a través de Windows Update.

4

La manera más fácil de hacer lo que quiere es usar WSUS. Es gratis y, básicamente, le permite configurar su propio servidor de actualización de Windows local donde decide qué actualizaciones están "aprobadas" para sus computadoras. Ni el servidor WSUS ni los clientes necesitan estar en un dominio, aunque facilita la configuración de los clientes, si es así. Si tiene diferentes conjuntos de máquinas que necesitan diferentes conjuntos de actualizaciones aprobadas, eso también es compatible.

Esto no solo logra su objetivo declarado, sino que también ahorra el ancho de banda global de la red al descargar solo las actualizaciones una vez del servidor WSUS.

1

P-L derecha. Primero probé el método de Christoph Grimmer-Die y, en algunos casos, no funcionaba. Supongo que se debió a una versión diferente de la arquitectura .net o OS (32 o 64 bits). Entonces, para estar seguro de que mi programa de obtener siempre la lista de espera de Windows Update de cada uno de mi dominio del equipo, hice lo siguiente:

  • Instalar un servidor con WSUS (puede ahorrar algo de ancho de banda de Internet): http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=5216
  • Agrega todas las estaciones de trabajo & servidores a su servidor WSUS

  • Obtener SimpleImpersonation Lib para ejecutar este programa con diferente derecho de administración (opcional)

  • instalar sólo el componente de consola de administración en su estación de trabajo dev y ejecute el siguiente programa:

se imprimirá en la consola de todas las actualizaciones de Windows con UpdateInstallationStates.Descargado

using System; 
using Microsoft.UpdateServices.Administration; 
using SimpleImpersonation; 

namespace MAJSRS_CalendarChecker 
{ 
    class WSUS 
    { 
     public WSUS() 
     { 
      // I use impersonation to use other logon than mine. Remove the following "using" if not needed 
      using (Impersonation.LogonUser("mydomain.local", "admin_account_wsus", "Password", LogonType.Batch)) 
      { 
       ComputerTargetScope scope = new ComputerTargetScope(); 
       IUpdateServer server = AdminProxy.GetUpdateServer("wsus_server.mydomain.local", false, 80); 
       ComputerTargetCollection targets = server.GetComputerTargets(scope); 
       // Search 
       targets = server.SearchComputerTargets("any_server_name_or_ip"); 

       // To get only on server FindTarget method 
       IComputerTarget target = FindTarget(targets, "any_server_name_or_ip"); 
       Console.WriteLine(target.FullDomainName); 
       IUpdateSummary summary = target.GetUpdateInstallationSummary(); 
       UpdateScope _updateScope = new UpdateScope(); 
       // See in UpdateInstallationStates all other properties criteria 
       _updateScope.IncludedInstallationStates = UpdateInstallationStates.Downloaded; 
       UpdateInstallationInfoCollection updatesInfo = target.GetUpdateInstallationInfoPerUpdate(_updateScope); 

       int updateCount = updatesInfo.Count; 

       foreach (IUpdateInstallationInfo updateInfo in updatesInfo) 
       { 
        Console.WriteLine(updateInfo.GetUpdate().Title); 
       } 
      } 
     } 
     public IComputerTarget FindTarget(ComputerTargetCollection coll, string computername) 
     { 
      foreach (IComputerTarget target in coll) 
      { 
       if (target.FullDomainName.Contains(computername.ToLower())) 
        return target; 
      } 
      return null; 
     } 
    } 
} 
1

escribí algunos dummycode para esto (una aplicación de consola sencilla, que va a instalar todas las actualizaciones que queremos en base a parámetros de línea de comandos, que se puede encontrar aquí y contiene todo lo necesario para realizar actualizaciones)

https://bitbucket.org/LilleCarl/c-windowsupdate

lo que necesita si quiere hacerlo por sí solo:

Add reference to C:\Windows\System32\wuapi.dll 
using WUApiLib; 

interfaces de interés:

UpdateSession 
UpdateCollection 
UpdateDownloader 
IUpdateInstaller 
IInstallationResult 
Cuestiones relacionadas