Using WUA remotely using C #

I am trying to connect to a remote computer and determine if updates for Windows will be installed using C # and WUApiLib. It seems pretty simple, however, I can’t find out how to connect to the remote computer.

http://msdn.microsoft.com/en-us/library/aa387288(v=VS.85).aspx identifies what can be used remotely, with a few exceptions that do not bother me, but there seems to be no documentation on that how to actually connect. I tried to pass the name of the computer, but that didn't work either (passing the name containing the gibberish is β€œsuccessful”, just like passing nothing, and it leads to the same calculations, so I assume the line is not used.)

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

Does anyone know who uses WUA remotely through C #?

+6
source share
3 answers

I searched the same a few years ago and wrote a little script.

 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"); } } } } 
+4
source
  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); } 
+3
source

Try the following:

 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'"); 
+2
source

Source: https://habr.com/ru/post/898543/


All Articles