2011-10-03 12 views
6

Estoy intentando conectarme a una máquina remota y determinar si hay alguna actualización de Windows para instalar utilizando C# y WUApiLib. Parece bastante sencillo, sin embargo, no puedo encontrar la forma de conectarme realmente a la computadora remota.Uso de WUA de forma remota con C#

http://msdn.microsoft.com/en-us/library/aa387288(v=VS.85).aspx identifica que se puede utilizar de forma remota, con algunas excepciones que no me preocupan, pero parece que no hay documentación sobre cómo realmente conectarse. Traté de pasar el nombre de una computadora, pero esto no funcionó tan bien (pasar un nombre que contiene galimatías "tiene éxito" al igual que no pasar nada, y da como resultado los mismos recuentos así que asumo que la cadena no se usa.)

var updateSession = new UpdateSession(dependencies.ComputerName); 
var searcher = updateSession.CreateUpdateSearcher(); 
var results = searcher.Search("IsInstalled=0 and Type='Software'"); 

¿Alguien sabe quién utiliza WUA de forma remota a través de C#?

+0

También me gustaría saber cómo determinar el tamaño de la actualización. – hidden

Respuesta

4

Estaba buscando lo mismo hace años y escribí un pequeño guión.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using WUApiLib;//this is required to use the Interfaces given by microsoft. 
namespace MSHWindowsUpdateAgent 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      UpdatesAvailable(); 
      if (NeedsUpdate()) 
      { 
       EnableUpdateServices();//enables everything windows need in order to make an update 
       InstallUpdates(DownloadUpdates()); 
      } 
      else 
      { 
       Console.WriteLine("There are no updates for your computer at this time."); 
      } 
      Console.WriteLine("Press any key to finalize the process"); 
      Console.Read(); 
     } 
     //this is my first try.. I can see the need for abstract classes here... 
     //but at least it gives most people a good starting point. 
     public static void InstalledUpdates() 
     { 
      UpdateSession UpdateSession = new UpdateSession(); 
      IUpdateSearcher UpdateSearchResult = UpdateSession.CreateUpdateSearcher(); 
      UpdateSearchResult.Online = true;//checks for updates online 
      ISearchResult SearchResults = UpdateSearchResult.Search("IsInstalled=1 AND IsHidden=0"); 
      //for the above search criteria refer to 
      //http://msdn.microsoft.com/en-us/library/windows/desktop/aa386526(v=VS.85).aspx 
      //Check the remakrs section 
      Console.WriteLine("The following updates are available"); 
      foreach (IUpdate x in SearchResults.Updates) 
      { 
       Console.WriteLine(x.Title); 
      } 
     } 
     public static void UpdatesAvailable() 
     { 
      UpdateSession UpdateSession = new UpdateSession(); 
      IUpdateSearcher UpdateSearchResult = UpdateSession.CreateUpdateSearcher(); 
      UpdateSearchResult.Online = true;//checks for updates online 
      ISearchResult SearchResults = UpdateSearchResult.Search("IsInstalled=0 AND IsPresent=0"); 
      //for the above search criteria refer to 
      //http://msdn.microsoft.com/en-us/library/windows/desktop/aa386526(v=VS.85).aspx 
      //Check the remakrs section 

      foreach (IUpdate x in SearchResults.Updates) 
      { 
       Console.WriteLine(x.Title); 
      } 
     } 
     public static bool NeedsUpdate() 
     { 
      UpdateSession UpdateSession = new UpdateSession(); 
      IUpdateSearcher UpdateSearchResult = UpdateSession.CreateUpdateSearcher(); 
      UpdateSearchResult.Online = true;//checks for updates online 
      ISearchResult SearchResults = UpdateSearchResult.Search("IsInstalled=0 AND IsPresent=0"); 
      //for the above search criteria refer to 
      //http://msdn.microsoft.com/en-us/library/windows/desktop/aa386526(v=VS.85).aspx 
      //Check the remakrs section 
      if (SearchResults.Updates.Count > 0) 
       return true; 
      else return false; 
     } 
     public static UpdateCollection DownloadUpdates() 
     { 
      UpdateSession UpdateSession = new UpdateSession(); 
      IUpdateSearcher SearchUpdates = UpdateSession.CreateUpdateSearcher(); 
      ISearchResult UpdateSearchResult = SearchUpdates.Search("IsInstalled=0 and IsPresent=0"); 
      UpdateCollection UpdateCollection = new UpdateCollection(); 
      //Accept Eula code for each update 
      for (int i = 0; i < UpdateSearchResult.Updates.Count; i++) 
      { 
       IUpdate Updates = UpdateSearchResult.Updates[i]; 
       if (Updates.EulaAccepted == false) 
       { 
        Updates.AcceptEula(); 
       } 
       UpdateCollection.Add(Updates); 
      } 
      //Accept Eula ends here 
      //if it is zero i am not sure if it will trow an exception -- I havent tested it. 
      if (UpdateSearchResult.Updates.Count > 0) 
      { 
       UpdateCollection DownloadCollection = new UpdateCollection(); 
       UpdateDownloader Downloader = UpdateSession.CreateUpdateDownloader(); 

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

       Downloader.Updates = DownloadCollection; 
       Console.WriteLine("Downloading Updates... This may take several minutes."); 


       IDownloadResult DownloadResult = Downloader.Download(); 
       UpdateCollection InstallCollection = new UpdateCollection(); 
       for (int i = 0; i < UpdateCollection.Count; i++) 
       { 
        if (DownloadCollection[i].IsDownloaded) 
        { 
         InstallCollection.Add(DownloadCollection[i]); 
        } 
       } 
       Console.WriteLine("Download Finished"); 
       return InstallCollection; 
      } 
      else 
       return UpdateCollection; 
     } 
     public static void InstallUpdates(UpdateCollection DownloadedUpdates) 
     { 
      Console.WriteLine("Installing updates now..."); 
      UpdateSession UpdateSession = new UpdateSession(); 
      UpdateInstaller InstallAgent = UpdateSession.CreateUpdateInstaller() as UpdateInstaller; 
      InstallAgent.Updates = DownloadedUpdates; 

      //Starts a synchronous installation of the updates. 
      // http://msdn.microsoft.com/en-us/library/windows/desktop/aa386491(v=VS.85).aspx#methods 
      if (DownloadedUpdates.Count > 0) 
      { 
       IInstallationResult InstallResult = InstallAgent.Install(); 
       if (InstallResult.ResultCode == OperationResultCode.orcSucceeded) 
       { 
        Console.WriteLine("Updates installed succesfully"); 
        if (InstallResult.RebootRequired == true) 
        { 
         Console.WriteLine("Reboot is required for one of more updates."); 
        } 
       } 
       else 
       { 
        Console.WriteLine("Updates failed to install do it manually"); 
       } 
      } 
      else 
      { 
       Console.WriteLine("The computer that this script was executed is up to date"); 
      } 

     } 
     public static void EnableUpdateServices() 
     { 
      IAutomaticUpdates updates = new AutomaticUpdates(); 
      if (!updates.ServiceEnabled) 
      { 
       Console.WriteLine("Not all updates services where enabled. Enabling Now" + updates.ServiceEnabled); 
       updates.EnableService(); 
       Console.WriteLine("Service enable success"); 
      } 


     } 

    } 
} 
+0

¿Quién escribió este código? –

+0

Esta no es una respuesta a la pregunta; solo un voto de "Tengo esta pregunta también" con un montón de código adjunto. – quux

+0

hice por qué lo preguntas? – hidden

2

Prueba esto:

Type t = Type.GetTypeFromProgID("Microsoft.Update.Session", HOSTNAME); 
UpdateSession uSession = (UpdateSession)Activator.CreateInstance(t); 

IUpdateSearcher uSearcher = uSession.CreateUpdateSearcher(); 
uSearcher.ServerSelection = ServerSelection.ssWindowsUpdate; 
uSearcher.IncludePotentiallySupersededUpdates = false; 
uSearcher.Online = false; 

ISearchResult sResult = uSearcher.Search(
    "IsInstalled=0 And IsHidden=0 And Type='Software'"); 
3
 Type t = Type.GetTypeFromProgID("Microsoft.Update.Session", "SYDEMMTA001"); 
     UpdateSession session = (UpdateSession)Activator.CreateInstance(t); 
     IUpdateSearcher updateSearcher = session.CreateUpdateSearcher(); 
     //int count = updateSearcher.GetTotalHistoryCount(); 
     //IUpdateHistoryEntryCollection history = updateSearcher.QueryHistory(0, count); 
     //for (int i = 0; i < count; ++i) 
     //{ 
     // Console.WriteLine(string.Format("Title: {0}\tSupportURL: {1}\tDate: {2}\tResult Code: {3}\tDescription: {4}\r\n", history[i].Title, history[i].SupportUrl, history[i].Date, history[i].ResultCode, history[i].Description)); 
     //} 
     //Console.WriteLine("Total up: {0}", count); 
     ISearchResult sResult = updateSearcher.Search("IsInstalled=0 AND IsPresent=0"); 
     foreach (IUpdate x in sResult.Updates) 
     { 
      Console.WriteLine(x.Title); 
     } 
Cuestiones relacionadas