2011-07-19 133 views
3

我在这里写了一个使用WUA COM接口(IUpdateSearcher,IUpdate等)的应用程序。我使用此应用程序来扫描可用更新,下载更新并安装它们。一切正常,直到我下载并安装一些更新有一些用户界面更新对话框。Windows更新应用程序

当我使用IUpdateSearcher.Search()我得到这个更新,我可以成功地下载它(使用IUpdateDownloader.Download()),但是当我安装使用IUpdateInstaller2.Install()此更新我无法摆脱的用户界面。

我的问题是 - 我怎样才能使这个沉默的安装?

+0

为了我的好奇心,请问您为什么要编写这样的应用程序? – Johnny5

+0

它是大型系统的一部分,控制许多pc ..(其中一个选项是控制eche PC的Windows更新...) – confi

+1

找到解决方案使用IUpdateInstaller2 insten IUpdateInstaller,有“forcesielte”属性... – confi

回答

3
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using WUApiLib; 
namespace MSHWindowsUpdateAgent 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      UpdatesAvailable(); 
      EnableUpdateServices();//enables everything windows need in order to make an update 
      InstallUpdates(DownloadUpdates()); 
      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 

      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 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. 

       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"); 
       IDownloadResult DownloadResult = Downloader.Download(); 
       UpdateCollection InstallCollection = new UpdateCollection(); 
       for (int i = 0; i < UpdateCollection.Count; i++) 
       { 
        if (DownloadCollection[i].IsDownloaded) 
        { 
         InstallCollection.Add(DownloadCollection[i]); 
        } 
       } 
       return InstallCollection; 
     } 
     public static void InstallUpdates(UpdateCollection DownloadedUpdates) 
     { 
      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 
      IInstallationResult InstallResult = InstallAgent.Install(); 

     } 
     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

jvelez有一个很好的答案,但它不直接回答实际问题:“我怎么能使这个沉默安装?”

CONFI - 我建议首先最简单的方法:

static class Program 
{ 
/// <summary> 
/// The main entry point for the application. 
/// </summary> 
[STAThread] 
static void Main() 
{ 
Application.SetCompatibleTextRenderingDefault(false); 
Application.EnableVisualStyles(); 

Thread thread = new Thread(() => 
{ 
Form1 form1 = new Form1(); 
form1.Visible = false; 
form1.ShowInTaskbar = false; 
Application.Run(form1); 
}); 

thread.SetApartmentState(ApartmentState.STA); 
thread.Start(); 
} 
} 

确保所有的方法对在后台通过简单地隐藏你的UI的工作,这将让你做这无声的手段。

@Justin Choponis - 我有需要做同样的confi。 WSUS并非为我的许多客户削减它。它的实用和庞大。如果你有一个网络需要照顾,并且一直都在现场,那么WSUS会非常有用,除此之外,我觉得它非常令人不满意。