How to Approve Updates for Optional Install
Applies To: Windows Server Update Services
Use the following procedure to approve specified updates for optional install. When approved, the updates will appear in Programs and Features (PAF) for Windows Vista and above or in Add/Remove Programs (ARP) for versions of Windows before Windows Vista (for example, Windows XP).
The procedure demonstrates the WSUS API calls required to perform this task. The example that follows gives a working command-line application where the UpdateId
, RevisionNumber
, and TargetGroupName
properties can all be passed in as parameters.
To approve updates for optional install
Add the
Microsoft.UpdateServices.Administration
assembly to your project.Insert a
using
statement for theMicrosoft.UpdateServices.Administration
namespace.using Microsoft.UpdateServices.Administration;
Instantiate an
UpdateRevisionId
object and initialize itsUpdateId
andRevisionNumber
properties. TheUpdateId
property is a GUID that identifies the update, while theRevisionNumber
property is a numeric value representing the revision number to be approved. To specify that you want the latest revision, set theRevisionNumber
property to 0.UpdateRevisionId updateRevisionId = new UpdateRevisionId(); // Replace UpdateGuid with actual value. updateRevisionId.UpdateId = new Guid( /* Your GUID here */ ); // 0 represents the latest revision. updateRevisionId.RevisionNumber = 0;
Instantiate an
IUpdateServer
object using the staticAdminProxy.GetUpdateServer
method.IUpdateServer updateServer = AdminProxy.GetUpdateServer();
Determine the target group. The following code snippet sets the target group to
ComputerTargetGroupId.AllComputers
.IComputerTargetGroup targetGroup = updateServer.GetComputerTargetGroup(ComputerTargetGroupId.AllComputers);
If you want a specific target group, you’ll need to get the
IComputerTargetGroup
interface for that group. The following code snippet includes a helper method (FindTargetGroup
) that takes two parameters—the WSUS server (updateServer
) and the name of desired target group (targetGroupName
)—and returns theIComputerTargetGroup
interface for that target group.IComputerTargetGroup targetGroup = FindTargetGroupByName(updateServer, args[3]); ... IComputerTargetGroup FindTargetGroupByName(IUpdateServer updateServer, string targetGroupName) { ComputerTargetGroupCollection targetGroupsCollection = updateServer.GetComputerTargetGroups(); foreach (IComputerTargetGroup targetGroup in targetGroupsCollection) { if (targetGroup.Name == targetGroupName) { return targetGroup; } } // If you get this far, throw an exception, because it means that the specified target group could not be located. throw new ArgumentException("Could not find target group: {0}", targetGroupName); }
Use the
IUpdateServer.GetUpdate
method to get the update to approve.// Get the update to approve. IUpdate update = updateServer.GetUpdate(updateRevisionId);
After you have the
IUpdate
andIComputerTargetGroup
interfaces, you can approve the update via theIUpdateServer.ApproveForOptionalInstall
method. The update will then show up in the PAF or ARP, depending on the Windows version.// Approve the update. update.ApproveForOptionalInstall(targetGroup);
Example
The following is the complete code listing for a console application that approves the specified update for optional install.
Syntax: ApproveForOptionalInstall UpdateID RevisionNumber [TargetGroupName]
UpdateIDIdentifies - The update with its GUID
RevisionNumberRevision - Number to be approved (0 = latest revision).
[TargetGroupName] (Optional) - Group to which updates must be approved. Defaults to "All Computers"
/*----------------------------------------------------------------------
This file is part of the Microsoft Windows Server Update Services
API Code Samples.
DISCLAIMER OF WARRANTY: THIS CODE AND INFORMATION ARE PROVIDED "AS-IS."
YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES,
GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS
UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE.
TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES
THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NON-INFRINGEMENT.
----------------------------------------------------------------------*/
/*
* This application approves the specified update for optional install.
* i.e. it will be shown as an optional install in the Add/Remove Programs (ARP)
* or Programs And Features (PAF) in case of Windows Vista or above.
* This application takes the following command line parameters
* UpdateID
* TargetGroupName (if not specified, then update is approved for "All Computers" target group)
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using Microsoft.UpdateServices.Administration;
namespace WsusSamples
{
class ApproveUpdatesForOptionalInstall
{
static void Main(string[] args)
{
try
{
const String usage = "\r\nApproveForOptionalInstall. Approves a specified update for optional install.\r\n\r\n" +
"USAGE:\r\n\r\n" +
"ApproveForOptionalInstall UpdateID RevisionNumber [TargetGroupName]\r\n\r\n" +
"\tUpdateID Identifies the update with its GUID.\r\n" +
"\tRevisionNumber Revision number to be approved. (0 = latest revision)\r\n" +
"\t[TargetGroupName] Group to which updates must be approved. (Default = All Computers)\r\n";
// There are two mandatory params to be passed with an optional third param
// Therefore, verify that the correct number of params are being passed.
// If not, show syntax
if ((args.Length < 2) || (args.Length > 3))
{
Console.WriteLine(usage);
return;
}
UpdateRevisionId updateRevisionId = new UpdateRevisionId();
updateRevisionId.UpdateId = new Guid(args[0]);
updateRevisionId.RevisionNumber = Convert.ToInt32(args[1]);
//connect to the local server
IUpdateServer updateServer = AdminProxy.GetUpdateServer();
// determine the target group to approve for
IComputerTargetGroup targetGroup = null;
if (args.Length == 4)
{
//target group was specified on the command line
targetGroup = FindTargetGroupByName(updateServer, args[2]);
}
else
{
//target group was not specified; default to the All Computers group
targetGroup = updateServer.GetComputerTargetGroup(ComputerTargetGroupId.AllComputers);
}
//get the update to approve
IUpdate update = updateServer.GetUpdate(updateRevisionId);
//approve the update
update.ApproveForOptionalInstall(targetGroup);
Console.WriteLine("Created Approval for optional Install to {0}", targetGroup.Name);
}
catch (Exception ex)
{
Console.WriteLine("An error occurred:\r\n" +
"Error text: {0}\r\n" +
"Stack trace: {1}\r\n",
ex.Message, ex.StackTrace);
}
}
static IComputerTargetGroup FindTargetGroupByName(IUpdateServer updateServer, string targetGroupName)
{
ComputerTargetGroupCollection targetGroupsCollection = updateServer.GetComputerTargetGroups();
foreach (IComputerTargetGroup targetGroup in targetGroupsCollection)
{
if (targetGroup.Name == targetGroupName)
{
return targetGroup;
}
}
throw new ArgumentException("Could not find target group: {0}", targetGroupName);
}
}
}