2011-10-03 18 views
6

リモートマシンに接続し、C#とWUApiLibを使用してインストールするWindowsアップデートがあるかどうかを確認しようとしています。それはかなり簡単ですが、私は実際にリモートコンピュータに接続する方法を見つけることができません。C#を使用してリモートでWUAを使用する

http://msdn.microsoft.com/en-us/library/aa387288(v=VS.85).aspxは、私が心配していないことを除いて、いくつかの例外を除いて、リモートで使用できることを示していますが、実際に接続する方法に関するドキュメントはありません。私は、コンピュータ名を渡してみましたが、これは同様に動作しませんでした(何を渡していないと同じように「成功」​​と同じ数の結果は、私はその文字列が未使用であると仮定しちんぷんかんぷんを含む名前を渡す。)

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

誰かがCU経由でWUAをリモートで使用することを知っていますか?

+0

私はまた、アップデートのサイズを決定する方法を知っていただきたいと思います。 – hidden

答えて

4

私は何年も前と同じことを探していて、少し脚本を書いていました。

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

誰がこのコードを書いたのですか? –

+0

これは質問に対する答えではありません。ちょうど "私もこの質問があります"というコードを添付して投票します。 – quux

+0

私はなぜあなたは尋ねましたか? – hidden

2

これを試してみてください:

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); 
     } 
関連する問題