我正在尝试连接到远程计算机并确定是否使用C#和WUApiLib安装任何Windows更新。这看起来非常简单,但我无法找到如何实际连接到远程计算机。
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'");
有谁知道谁通过C#远程使用WUA?
答案 0 :(得分: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");
}
}
}
}
答案 1 :(得分: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);
}
答案 2 :(得分: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'");