{"id":3893,"date":"2013-04-02T11:59:00","date_gmt":"2013-04-02T11:59:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2013\/04\/02\/windows-software-update-services\/"},"modified":"2013-04-02T11:59:00","modified_gmt":"2013-04-02T11:59:00","slug":"windows-software-update-services","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/windows-software-update-services\/","title":{"rendered":"Windows Software Update Services"},"content":{"rendered":"<p align=\"left\"><strong>Summary<\/strong>: Honorary Scripting Guy, Boe Prox, shares an excerpt from his contribution to the book, <em>PowerShell Deep Dives<\/em>.<\/p>\n<p align=\"left\">Microsoft Scripting Guy, Ed Wilson, is here. This week we will not have our usual&nbsp;<strong>PowerTip<\/strong>. Instead we have excerpts from seven books from Manning Press. In addition, each blog will have a special code for 50% off the book being excerpted that day. Remember that the code is valid only for the day the excerpt is posted. The coupon code is also valid for a second book from the Manning collection.<\/p>\n<p>Today, the excerpt is from <a href=\"http:\/\/www.manning.com\/hicks\/\">PowerShell Deep Dives<\/a><br \/> &nbsp;&nbsp;&nbsp;&nbsp; Edited by Jeffery Hicks, Richard Siddaway, Oisin Grehan, and Aleksandar Nikolic.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/0184.hsg-4-2-13-1.jpg\"><img decoding=\"async\" title=\"Photo of book cover\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/0184.hsg-4-2-13-1.jpg\" alt=\"Photo of book cover\" \/><\/a><\/p>\n<p>Whether you just started using Windows PowerShell or are at a more advanced level, there are two things you should always look at while writing a script: performance and execution time. With the introduction of Windows PowerShell 3.0 there are a lot of new modules and cmdlets available to you. What a lot of people don&rsquo;t realize is that Microsoft also improves and expands already existing modules, and their cmdlets. This is especially the case with Windows PowerShell 3.0.<\/p>\n<p class=\"Body1\" align=\"left\">Here&rsquo;s Boe&hellip;<\/p>\n<p class=\"Body1\" align=\"left\">Although the UI can be clunky and slow, there is an API with WSUS, a new module that is available in Windows Server 2012, and even an open source WSUS module that I wrote called <a href=\"http:\/\/poshwsus.codeplex.com\/\">PoshWSUS<\/a>, which can more effectively allow you to quickly manage and generate reports by using Windows PowerShell.<\/p>\n<p class=\"Body1\" align=\"left\">Instead of looking at the existing cmdlets available in the 2012 Windows Server Update Services module, I will dive into the API and show you some tricks to further extend the reach of Windows PowerShell into WSUS. I&rsquo;ll show how to:<\/p>\n<ul>\n<li>Look at the WSUS configuration and events.<\/li>\n<li>Provide reporting on various client and patch statuses.<\/li>\n<li>Start and view synchronization progress and history.<\/li>\n<li>Viewing and create automatic installation rules to simplify patch management by approving the common updates that your clients require.<\/li>\n<\/ul>\n<h2 class=\"Head2\">WSUS server configuration and events<\/h2>\n<p class=\"Body1\" align=\"left\">In WSUS, some of the most basic administration concepts are client management and patch management. Before Windows Server 2012, the only two solutions to this were working with the UI or digging into the API via scripts or the open source module, PoshWSUS. With Server 2012, we now have a WSUS module called UpdateServices that makes managing clients easier. The UpdateServices module is only available to use on the WSUS server, which isn&rsquo;t bad if you plan to use Windows PowerShell remoting to manage the server. If you are not running Windows Server 2012, the module will not be available, and you need to use the API to manage a remote WSUS server.<\/p>\n<h3 class=\"Head2\">Initial connection<\/h3>\n<p class=\"Body1\" align=\"left\">To make a connection to the WSUS server locally or remotely with the API, you need the WSUS Administration console installed on the system that you will be making the connection from. After the console has been installed, you will have access to the required assemblies that you can the load and use for the WSUS connection. So with that, lets load the assembly, and then we can make the initial connection to the WSUS server.<\/p>\n<p class=\"Body\" style=\"padding-left: 30px\" align=\"left\">[reflection.assembly]::LoadWithPartialName(&#8220;Microsoft.UpdateServices.Administration&#8221;) | out-null<\/p>\n<p class=\"Code\">For the connection attempt, I will be using the Microsoft.UpdateServices.Administration.AdminProxy class along with the GetUpdateServer() method. This method accepts 1 of 3 parameter sets based on your WSUS configuration and if it is a remote or local connection. For the remote connection that I will be making, I need only supply the remote system name, a Boolean value that will say whether the connection is secure, and the remote port that I need to connect to on the WSUS server. (Acceptable ports for WSUS are 8080 and 8530 for non-secure ports and 443 and 8531 for SSL.)<\/p>\n<p class=\"Body\" style=\"padding-left: 30px\" align=\"left\">$Wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer(<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp; &#8220;Boe-PC&#8221;,<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp; $False,<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp; &#8220;8530&#8221;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">)<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$Wsus<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">WebServiceUrl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : http:\/\/BOE-PC:8530\/ApiRemoting30\/WebService.asmx<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">BypassApiRemoting&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">IsServerLocal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : BOE-PC<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 6.2.9200.16384<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">IsConnectionSecureForApiRemoting : True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">PortNumber&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 8530<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">PreferredCulture&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : en<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ServerName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : BOE-PC<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UseSecureConnection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ServerProtocolVersion&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 1.8<\/p>\n<p class=\"Code\">From here, you can see what version of the WSUS software you are running, among other things. The most important thing here is that you can now see that we have successfully connected to the WSUS server.<\/p>\n<h3 class=\"Head2\">Viewing WSUS configuration<\/h3>\n<p class=\"Body1\" align=\"left\">After the initial connection has been made, you can easily take a look at the internal configuration settings of the WSUS server by using the <strong>GetConfiguration()<\/strong><strong> <\/strong>method of the Microsoft.UpdateServices.Internal.BaseApi.UpdateServer object.<\/p>\n<p class=\"Body\" style=\"padding-left: 30px\" align=\"left\">$wsus.GetConfiguration()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateServer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">LastConfigChange&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 9\/17\/2012 2:22:43 AM<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ServerId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 64ad0f03-e81d-4539-883d-0c08066d1e82<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">SupportedUpdateLanguages&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : {he, cs, fr, es&#8230;}<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">TargetingMode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Server<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">SyncFromMicrosoftUpdate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">IsReplicaServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">HostBinariesOnMicrosoftUpdate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpstreamWsusServerName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpstreamWsusServerPortNumber&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 8530<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpstreamWsusServerUseSsl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UseProxy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ProxyName&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ProxyServerPort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 80<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UseSeparateProxyForSsl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">SslProxyName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">SslProxyServerPort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 443<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">AnonymousProxyAccess&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ProxyUserName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ProxyUserDomain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">HasProxyPassword&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">AllowProxyCredentialsOverNonSsl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&hellip;<\/p>\n<p class=\"Code\">This is just a marginal number of the 121 properties that are returned with this method. The majority of these properties are settable, meaning that you can easily update these from Windows PowerShell. Use caution when making any changes to the properties because it could leave your server in an unusable state!<\/p>\n<h3 class=\"Head2\">Viewing the WSUS database connection<\/h3>\n<p class=\"Body1\" align=\"left\">You can take a look at the database connection and the database properties from your WSUS server by using the <strong>GetDatabaseConfiguration()<\/strong> method and the <strong>CreateConnection()<\/strong> method from the created Microsoft.UpdateServices.Internal.DatabaseConfiguration object.<\/p>\n<p class=\"Body\" style=\"padding-left: 30px\" align=\"left\">$wsus.GetDatabaseConfiguration()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateServer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ServerName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : MICROSOFT##WID<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">DatabaseName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : SUSDB<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">IsUsingWindowsInternalDatabase : True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">AuthenticationMode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : WindowsAuthentication<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UserName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$wsus.GetDatabaseConfiguration().CreateConnection()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">QueryTimeOut&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;: 150<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">LoginTimeOut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 60<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ConnectionPooling : True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ApplicationName&nbsp;&nbsp; : WSUS:powershell:1824<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UserLoginName&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UseIntegrated&nbsp;&nbsp;&nbsp;&nbsp; : True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ConnectionString&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">MaxPoolSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 100<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">DoRetry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">DefaultRetryTimes : 3<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ServerName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : MICROSOFT##WID<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">DatabaseName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : SUSDB<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">IsConnected&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">InTransaction&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\">The amount of detail that you can get regarding the database is pretty nice. In fact, you could dive even deeper into the database if you wanted, but that is beyond the scope of this blog.<\/p>\n<h3 class=\"Head2\">Viewing WSUS event history<\/h3>\n<p class=\"Body1\" align=\"left\">&nbsp;If you are interested in viewing the event history of the WSUS server, it can be reached by calling the <strong>GetUpdateEventHistory(StartDate,EndDate)<\/strong><strong> <\/strong>method and supplying a Start Date and an End Date. In this case, I just want to look at the events that have occurred during the past hour.<\/p>\n<p class=\"Body\" style=\"padding-left: 30px\" align=\"left\">$wsus.GetUpdateEventHistory(&#8220;$((Get-Date).AddHours(-1))&#8221;,&#8221;$(Get-Date)&#8221;)<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateServer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">HasAssociatedUpdate&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.UpdateServices.Administration.UpdateRevisionId<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">HasAssociatedComputer : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ComputerId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Unknown<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">WsusEventId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : ContentSynchronizationSucceeded<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">WsusEventSource&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Server<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : f01cb84f-9a0b-4da8-a12a-39a6866c5787<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">CreationDate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 9\/23\/2012 7:08:20 PM<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Content synchronization succeeded.<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">IsError&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ErrorCode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Row&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: Microsoft.UpdateServices.Internal.DatabaseAccess.EventHistoryTableRow<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateServer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">HasAssociatedUpdate&nbsp;&nbsp; : True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.UpdateServices.Administration.UpdateRevisionId<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">HasAssociatedComputer : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ComputerId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Unknown<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">WsusEventId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : ContentSynchronizationFileDownloadSucceeded<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">WsusEventSource&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Server<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0c7ade08-87d6-4019-b676-0f50ce486591<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">CreationDate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 9\/23\/2012 7:08:20 PM<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Content file download succeeded. Digest:&nbsp; Source File: \/msdownload\/update\/v3-19990518\/cabpool\/w<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; indowsinstaller-kb893803-v2-x86_830994754ba721add8a13bd0266d2e092f21cab0.exe Destination File:<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F:\\WsusContent\\B0\\830994754BA721ADD8A13BD0266D2E092F21CAB0.exe.<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">IsError&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ErrorCode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Row&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.DatabaseAccess.EventHistoryTableRow<\/p>\n<p class=\"Code\">With this information, you could audit for any possible failures that have occurred with a recent synchronization or some other issue that might be cause for a WSUS issue.<\/p>\n<h2 class=\"Head2\">Automatic Approval Rules<\/h2>\n<p class=\"Body1\" align=\"left\">With WSUS, you can automate your patch approvals simply by creating and configuring Automatic Approval Rules. You can specify categories, target groups among other things to use for the rules.<\/p>\n<h3 class=\"Head2\">Locating approval rules<\/h3>\n<p class=\"Body1\" align=\"left\">To find out what approval rules are currently on the WSUS server, use the <strong>GetApprovalRules()<\/strong> method from the Microsoft.UpdateServices.Internal.BaseApi.UpdateServer object created from the initial connection.<\/p>\n<p class=\"Body\" style=\"padding-left: 30px\" align=\"left\">$wsus.GetInstallApprovalRules()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;UpdateServer&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateServer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Default Automatic Approval Rule<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Enabled&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Action&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Install<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Deadline&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">CanSetDeadline : True<\/p>\n<p class=\"Code\">This is not actually all of the information for the approval rules. To find out what Target Groups, Classifications, and Categories are contained in the Microsoft.UpdateServices.Internal.BaseApi.AutomaticUpdateApprovalRule object, you need to use the <strong>GetComputerTargetGroups()<\/strong>, <strong>GetUpdateClassifications()<\/strong>, and <strong>GetUpdateCategories()<\/strong> methods, respectively.<\/p>\n<p class=\"Body\" style=\"padding-left: 30px\" align=\"left\">$approvalRules = $wsus.GetInstallApprovalRules()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Get the Update Classifications<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$wsus.GetInstallApprovalRules()[0].GetUpdateClassifications()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateSer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ver<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: e6cf1350-c01b-414d-a61f-263d14d133b4<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Critical Updates<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : A broadly released fix for a specific problem<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addressing a critical, non-security related bug.<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ReleaseNotes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">DefaultPropertiesLanguage :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">DisplayOrder&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2147483647<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ArrivalDate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 9\/23\/2012 6:51:37 PM<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateSer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ver<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Id&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: 0fa1201d-4330-4fa8-8ae9-b877473b6441<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Security Updates<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : A broadly released fix for a product-specific<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; security-related vulnerability. Security<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vulnerabilities are rated based on their severity<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; which is indicated in the Microsoft&reg; security<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bulletin as critical, important, moderate, or low.<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ReleaseNotes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">DefaultPropertiesLanguage :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">DisplayOrder&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2147483647<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ArrivalDate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 9\/23\/2012 6:40:34 PM<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Get the Computer Target Groups<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$wsus.GetInstallApprovalRules()[0].GetComputerTargetGroups()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&#8212;&#8212;&#8212;&#8212;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Microsoft.UpdateService&#8230; a0a08746-4dbe-4a37-9adf&#8230; All Computers&nbsp;&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Get the Categories<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$wsus.GetInstallApprovalRules()[0].GetCategories()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Product<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ProhibitsSubcategories&nbsp;&nbsp;&nbsp; : True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ProhibitsUpdates&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateSource&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : MicrosoftUpdate<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateSer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ver<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : a105a108-7c9b-4518-bbbe-73f0fe30012b<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Windows Server 2012<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Windows Server 2012<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ReleaseNotes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">DefaultPropertiesLanguage :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">DisplayOrder&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2147483647<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">ArrivalDate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 9\/23\/2012 6:47:20 PM<\/p>\n<h3 class=\"Head2\">Creating approval rules<\/h3>\n<p class=\"Body1\" align=\"left\">Creating an approval is a simple process that involves first creating the approval object with a name and then filling in the blanks for the rest of the configuration (Target Groups, Categories, Classifications, and so on) on the object before deploying it on the server. First, verify that the rule I am going to create (named &ldquo;2012Servers&rdquo;) doesn&rsquo;t exist:<\/p>\n<p class=\"Body\" style=\"padding-left: 30px\" align=\"left\">#Look at current rules<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$wsus.GetInstallApprovalRules()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateServer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Default Automatic Approval Rule<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Enabled&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Action&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Install<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Deadline&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">CanSetDeadline : True<\/p>\n<p class=\"Code\">No Rules exist with the name I plan to use, so I can continue with the creation of the new Approval Rule.<\/p>\n<h4 class=\"Head2\">Listing 1: Creating an Approval Rule<\/h4>\n<p class=\"Body1\" style=\"padding-left: 30px\">&nbsp;[cmdletbinding()]<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Param (<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; [parameter(ValueFromPipeline=$True,Mandatory=$True,<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; HelpMessage=&#8221;Name of WSUS server to connect to.&#8221;)]<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; [Alias(&#8216;WSUSServer&#8217;)]&nbsp;&nbsp;&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; [string]$Computername,<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; [parameter()]<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; [Switch]$UseSSL<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">)<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">[reflection.assembly]::LoadWithPartialName(<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; &#8220;Microsoft.UpdateServices.Administration&#8221;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">) | out-null<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$Wsus = [Microsoft.UpdateServices.Administration.AdminProxy]::GetUpdateServer(<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; $Computername,$UseSSL,$Port<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">)<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Create New Rule Object<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$newRule = $wsus.CreateInstallApprovalRule(&#8220;2012Servers&#8221;)<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">##Categories<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Get Categories for Windows Server<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$updateCategories = $wsus.GetUpdateCategories() | Where {<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; $_.Title -LIKE &#8220;Windows Server 2012*&#8221;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">}<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Create collection for Categories<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$categoryCollection = New-Object Microsoft.UpdateServices.Administration.UpdateCategoryCollection<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$categoryCollection.AddRange($updateCategories)<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Add the Categories to the Rule<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$newRule.SetCategories($categoryCollection)<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">##Classifications<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Get all Classifications for specific Classifications<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$updateClassifications = $wsus.GetUpdateClassifications() | Where {<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; $_.Title -Match &#8220;Critical Updates|Service Packs|Updates|Security Updates&#8221;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">}<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Create collection for Categories<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$classificationCollection = New-Object Microsoft.UpdateServices.Administration.UpdateClassificationCollection<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$classificationCollection.AddRange($updateClassifications )<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Add the Classifications to the Rule<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$newRule.SetUpdateClassifications($classificationCollection)<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">##Target Groups<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Get Target Groups required for Rule<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$targetGroups = $wsus.GetComputerTargetGroups() | Where {<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp; $_.Name -Match &#8220;All Computers&#8221;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">}<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Create collection for TargetGroups<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$targetgroupCollection = New-Object Microsoft.UpdateServices.Administration.ComputerTargetGroupCollection<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$targetgroupCollection.AddRange($targetGroups)<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Add the Target Groups to the Rule<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$newRule.SetComputerTargetGroups($targetgroupCollection)<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Finalize the creation of the rule object<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$newRule.Enabled = $True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$newRule.Save()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">#Run the rule<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$newRule.ApplyRule()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Body1\" style=\"padding-left: 30px\" align=\"left\">Let&rsquo;s make sure that the rule is now created.<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">$wsus.GetInstallApprovalRules()<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateServer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Default Automatic Approval Rule<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Enabled&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : False<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Action&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Install<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Deadline&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">CanSetDeadline : True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">&nbsp;<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">UpdateServer&nbsp;&nbsp; : Microsoft.UpdateServices.Internal.BaseApi.UpdateServer<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 6<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2012Servers<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Enabled&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : True<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Action&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Install<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">Deadline&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<\/p>\n<p class=\"Code\" style=\"padding-left: 30px\">CanSetDeadline : True<\/p>\n<p class=\"Body1\" align=\"left\">Now we have a new Approval Rule that will run to approve only the updates I specified to only Windows Server 2012 systems. Keep in mind that the automatic approval rules only run after WSUS synchronizes, and only synched updates will be eligible for the rule unless you run the rule manually.<\/p>\n<p class=\"Body1\" align=\"left\">In today&rsquo;s blog, I showed a number of things that you can do with Windows PowerShell to manage your WSUS server by using the available APIs, such as looking at the configuration settings of the WSUS server and auditing events. Auditing and building Automatic Approval Rules and providing more detailed reporting is easily accomplished by using the APIs.<\/p>\n<p class=\"Body\" align=\"left\">With Windows Server 2012, you do have the option of using the Update Services module to perform some basic WSUS administration such as patch approvals, but for more advanced configurations and reporting, the APIs are definitely the way to go.<\/p>\n<p class=\"Body\" align=\"left\">There is also a module that I wrote called <a href=\"http:\/\/poshwsus.codeplex.com\/\" target=\"_blank\">PoshWSUS<\/a> that provides cmdlets that allow for a more advanced administration. With multiple options for automating your WSUS server, you can&rsquo;t go wrong. If you write some scripts for your own WSUS server, I hope that you will share those with the rest of the community.<em>&nbsp;<\/em><\/p>\n<p><strong>Here is the code for the discount offer today at<\/strong><strong>&nbsp;<\/strong><a href=\"http:\/\/www.manning.com\/\" target=\"_blank\">www.manning.com<\/a>:&nbsp;<strong>scriptw2<\/strong><br \/> Valid for 50% off <a href=\"http:\/\/www.manning.com\/hicks\/\" target=\"_blank\">PowerShell Deep Dives<\/a> and <a href=\"http:\/\/www.manning.com\/nielsen\/\" target=\"_blank\">SQL Server Deep MVP Dives<\/a><\/p>\n<p>Offer valid from April 2, 2013 12:01 AM until April 3 midnight (EST)<\/p>\n<p>I invite you to follow me on&nbsp;<a href=\"http:\/\/bit.ly\/scriptingguystwitter\" target=\"_blank\">Twitter<\/a>&nbsp;and&nbsp;<a href=\"http:\/\/bit.ly\/scriptingguysfacebook\" target=\"_blank\">Facebook<\/a>. If you have any questions, send email to me at&nbsp;<a href=\"mailto:scripter@microsoft.com\" target=\"_blank\">scripter@microsoft.com<\/a>, or post your questions on the&nbsp;<a href=\"http:\/\/bit.ly\/scriptingforum\" target=\"_blank\">Official Scripting Guys Forum<\/a>. See you tomorrow. Until then, peace.<\/p>\n<p><strong>Ed Wilson, Microsoft Scripting Guy<\/strong>&nbsp;&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summary: Honorary Scripting Guy, Boe Prox, shares an excerpt from his contribution to the book, PowerShell Deep Dives. Microsoft Scripting Guy, Ed Wilson, is here. This week we will not have our usual&nbsp;PowerTip. Instead we have excerpts from seven books from Manning Press. In addition, each blog will have a special code for 50% off [&hellip;]<\/p>\n","protected":false},"author":596,"featured_media":87096,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[162,56,3,45],"class_list":["post-3893","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-boe-prox","tag-guest-blogger","tag-scripting-guy","tag-windows-powershell"],"acf":[],"blog_post_summary":"<p>Summary: Honorary Scripting Guy, Boe Prox, shares an excerpt from his contribution to the book, PowerShell Deep Dives. Microsoft Scripting Guy, Ed Wilson, is here. This week we will not have our usual&nbsp;PowerTip. Instead we have excerpts from seven books from Manning Press. In addition, each blog will have a special code for 50% off [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/3893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/users\/596"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/comments?post=3893"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/3893\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media\/87096"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/media?parent=3893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=3893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=3893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}