2009-05-28 16 views
14

C'è qualche API per scrivere un programma C# che possa interfacciarsi con l'aggiornamento di Windows e usarlo per installare in modo selettivo determinati aggiornamenti?Usa C# per interagire con Windows Update

Sto pensando da qualche parte lungo le linee di archiviazione di un elenco in un repository centrale di aggiornamenti approvati. Quindi le applicazioni lato client (che dovrebbero essere installate una volta) dovrebbero interfacciarsi con Windows Update per determinare quali aggiornamenti sono disponibili, quindi installare quelli presenti nell'elenco approvato. In questo modo gli aggiornamenti vengono comunque applicati automaticamente da una prospettiva lato client, ma posso selezionare quali aggiornamenti vengono applicati.

Questo non è il mio ruolo nella società, a proposito, mi chiedevo davvero se c'è un'API per l'aggiornamento di Windows e come usarlo.

+0

si sono sicuramente alla ricerca per l'API di Windows Update Agent: http://msdn.microsoft.com/en-us/library/aa387099.aspx –

+0

Questo è un'interfaccia COM orientata verso C e C++, quindi a meno che volevo darmi un tutorial su come chiamare le API COM da C#, non mi aiuta = (. Anche se, sarò il primo ad ammettere che questo è un fallimento della mia conoscenza, e non della tua risposta. – DevinB

+0

Non sono a conoscenza di alcuna API C#. Ma hai considerato [Windows Server Update Service] (http://technet.microsoft.com/en-us/wsus/default.aspx) per aiutarti a gestire Windows Update a livello aziendale? –

risposta

19

aggiungere un riferimento a WUApiLib al progetto 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); 
    } 
} 

Dato si dispone di un modulo con una TextBox questo vi darà un elenco degli aggiornamenti installati. Vedere http://msdn.microsoft.com/en-us/library/aa387102(VS.85).aspx per ulteriore documentazione.

Ciò tuttavia non consente di trovare gli hotfix KB non distribuiti tramite Windows Update.

4

Il modo più semplice per fare ciò che vuoi è usare WSUS. È gratuito e fondamentalmente ti consente di configurare il tuo server di aggiornamento Windows locale dove decidi quali aggiornamenti sono "approvati" per i tuoi computer. Né il server WSUS né i client devono essere in un dominio, anche se è più semplice configurare i client, se lo sono. Se hai diversi set di macchine che necessitano di diversi set di aggiornamenti approvati, anche questo è supportato.

Non solo questo raggiunge l'obiettivo dichiarato, ma consente anche di risparmiare la larghezza di banda complessiva della rete scaricando gli aggiornamenti solo una volta dal server WSUS.

1

P-L destra. Ho provato prima il metodo Christoph Grimmer-Die e, in alcuni casi, non funzionava. Suppongo che fosse dovuto a diverse versioni di .net o architettura SO (32 o 64 bit). Poi, per essere sicuri che il mio programma ottiene sempre la lista di attesa di Windows Update di ciascuno del mio dominio del computer, ho fatto la seguente:

  • Installare un Server con WSUS (può risparmiare un po 'di banda internet): http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=5216
  • Aggiungi tutte le workstation & server per il server WSUS

  • Get SimpleImpersonation Lib per eseguire questo programma con diversi destra admin (opzionale)

  • installare solo il componente di console di amministrazione sulla workstation dev ed eseguire il seguente programma:

verrà stampata nella console tutti gli aggiornamenti di Windows con UpdateInstallationStates.Scaricato

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

ho scritto qualche dummycode per questo (una semplice applicazione console, che sarà installare tutti gli aggiornamenti che vogliamo in base ai parametri della riga di comando, si può essere trovato qui e contiene tutto il necessario per eseguire gli aggiornamenti)

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

Quello che vi serve se vuoi fai da te:

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

interfacce utili:

UpdateSession 
UpdateCollection 
UpdateDownloader 
IUpdateInstaller 
IInstallationResult 
Problemi correlati