{"id":52363,"date":"2009-09-29T03:01:00","date_gmt":"2009-09-29T03:01:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2009\/09\/29\/hey-scripting-guy-can-i-create-microsoft-access-reports-of-running-services\/"},"modified":"2009-09-29T03:01:00","modified_gmt":"2009-09-29T03:01:00","slug":"hey-scripting-guy-can-i-create-microsoft-access-reports-of-running-services","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/hey-scripting-guy-can-i-create-microsoft-access-reports-of-running-services\/","title":{"rendered":"Hey, Scripting Guy! Can I Create Microsoft Access Reports of Running Services?"},"content":{"rendered":"<p><!-- AddThis Button BEGIN --><a class=\"addthis_button\" href=\"http:\/\/www.addthis.com\/bookmark.php?v=250&amp;pub=scriptingguys\"><img decoding=\"async\" alt=\"Bookmark and Share\" src=\"http:\/\/s7.addthis.com\/static\/btn\/v2\/lg-share-en.gif\" width=\"125\" height=\"16\"><\/a><!-- AddThis Button END --><\/p>\n<p class=\"Readeraidonly\">(Portions of this article previously appeared in the Microsoft Press book, <a href=\"http:\/\/www.microsoft.com\/learning\/en\/us\/Book.aspx?ID=9541&amp;locale=en-us\"><font face=\"Segoe\">Windows PowerShell Scripting Guide<\/font><\/a>.)<\/p>\n<p><img decoding=\"async\" title=\"Hey, Scripting Guy! Question\" border=\"0\" alt=\"Hey, Scripting Guy! Question\" align=\"left\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/q-for-powertip.jpg\" width=\"34\" height=\"34\"><\/p>\n<p class=\"MsoNormal\">Hey, Scripting Guy! I would like to be able to write a listing of the services that are running to a Microsoft Access database. I would then be able to use the report writer from Microsoft Access to produce some nice professional looking reports. Is this something I can do using Windows PowerShell?<\/p>\n<p>&lt;<\/p>\n<p>p style=&#8221;MARGIN: 0in 0in 8pt&#8221; class=&#8221;MsoNormal&#8221;&gt;&#8211; DN<\/p>\n<p><img decoding=\"async\" title=\"Hey, Scripting Guy! Answer\" border=\"0\" alt=\"Hey, Scripting Guy! Answer\" align=\"left\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/a-for-powertip.jpg\" width=\"34\" height=\"34\"><\/p>\n<p class=\"MsoNormal\">Hello DN, <\/p>\n<p class=\"MsoNormal\">Microsoft Scripting Guy Ed Wilson here. It is evening as I write this article, and the sky is clear and the moon shines brightly through the few remaining wafting clouds. I am sitting in my swing on my front porch, checking the <a href=\"http:\/\/blogs.technet.commailto:scripter@microsoft.com\"><span><font face=\"Segoe\">scripter@microsoft.com<\/font><\/span><\/a> inbox, and just relaxing and enjoying the onset of fall in <a href=\"http:\/\/en.wikipedia.org\/wiki\/Charlotte,_North_Carolina\"><font face=\"Segoe\">Charlotte, North Carolina<\/font><\/a>, in the United States. Some of the leaves are already changing color, and it will not be too long before the <a href=\"http:\/\/en.wikipedia.org\/wiki\/Trick-or-treating\"><font face=\"Segoe\">trick-or-treaters<\/font><\/a> will be making their way through the neighborhood extorting candy from the various householders. I love the fall season, the changing colors, the homemade apple pies, and apple cider. It is a relaxing time of the year. Because I am in such a mellow and relaxed mood, it seems that I remember having written something that is close to what you are asking. Let me dig it out, dust it off, and adapt it a bit. Kind of an <a href=\"http:\/\/en.wikipedia.org\/wiki\/Reuse\"><font face=\"Segoe\">environmental approach<\/font><\/a> to Hey, Scripting Guy! Blog posts. <\/p>\n<p class=\"MsoNormal\">By writing to a database, we give ourselves the opportunity to store the data in a more permanent fashion. We can produce reports that not only provide pertinent information, but also are easy to read and understand. Additionally, because databases are designed for concurrent access, they are a more robust solution for storing data than are text files, which typically are limited to one user at a time. By using the report writer in Access, the process of developing a report is as easy as clicking through a wizard. After we are finished, the report has automatic grouping and sorting, which greatly facilitate the navigation of the information. The report looks professional and could easily be given to upper management. An example of such a report is seen here:<\/p>\n<p class=\"Fig-Graphic\"><img decoding=\"async\" title=\"Image of an example Access report\" alt=\"Image of an example Access report\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/hsg\/2009\/september\/hey0929\/hsg-09-29-09-01.jpg\" width=\"600\" height=\"429\"><br><\/p>\n<p class=\"MsoNormal\">In the WriteRunningServicesToAccess.ps1 script, we illustrate the process of writing to a Microsoft Access database by using Active X Data Objects (ADO) technology.<span>&nbsp; <\/span>On the first line of the script, we retrieve the current computer name by using the <b>wshNetwork<\/b> object, which is created by using the <b>New-Object<\/b> cmdlet, specifying the <b>&ndash;comobject<\/b> parameter, and using the <b>wscript.network<\/b> program ID. We enclose the entire statement in a set of smooth parentheses, and then choose only the <b>computer name<\/b> property from the object. We assign this computer name to the variable <b>$strComputer<\/b>. <\/p>\n<p class=\"MsoNormal\">On the second line of the script, we use exactly the same object and the same procedure. The only difference is that, instead of choosing the <b>computername<\/b> property, we choose the domain name instead. The two lines of code that work with the <b>wshNetwork<\/b> object are seen here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$StrComputer = (New-Object -ComObject WScript.Network).computername<br>$StrDomain = (New-Object -ComObject WScript.Network).Domain<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">To retrieve the <b>computername<\/b> and the domain properties from the <b>wshNetwork<\/b> object, we created the same object twice. This saved us a little bit of typing. One other way to have done it would have looked like the following:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$wshNetwork = (New-Object -ComObject WScript.Network)<br>$StrComputer = $wshNetwork.computername<br>$strDomain = $wshNetwork.domain<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">On the next line, we define the WMI query we will use. It is an unabashed WMI Query Language (WQL) statement <b>&ldquo;Select * from WIN32_Service<\/b>. When we use this query with the <b>Get-WmiObject<\/b> cmdlet, we will retrieve every property from every service that is defined on the machine. We hold this WQL statement in the variable <b>$strQuery<\/b>. <\/p>\n<p class=\"Readeraidonly\">If WQL &ldquo;looks like&rdquo; SQL, it is for good reason. WQL is considered to be a subset of the Transact SQL query language. <\/p>\n<p class=\"MsoNormal\">We query the WMI service on the machine by using the <b>Get-WmiObject<\/b> cmdlet. We call the <b>Get-WmiObject<\/b> cmdlet and specify the <b>&ndash;query<\/b> parameter. The string contained in the <b>$strWMIQuery<\/b> variable is passed as the query. The resulting object is held in the <b>$objService<\/b> variable. The two lines of code that define the WMI query and make the connection into WMI are seen here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$strWMIQuery = &#8220;Select * from win32_Service&#8221;<br>$objservice = get-wmiobject -query $strWMIQuery<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">After we have made the connection into WMI and retrieved our information, we use the <b>Write-Host<\/b> cmdlet to display a status message. We use the <b>&ndash;foregroundcolor<\/b> to print the message in yellow. The string &ldquo;Obtaining service info &hellip;&rdquo; is hard-coded into the call for the <b>Write-Host<\/b> cmdlet. The <b>Write-Host<\/b> line of code is seen here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">write-host -foreGroundColor yellow &#8220;Obtaining service info &#8230;&#8221;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">The <b>Get-WmiObject<\/b> cmdlet returns a collection of WMI objects, each representing a different service that is defined on the machine. To deal with all the data, we use the <b>foreach<\/b> statement to walk through the collection. <b>$strservice<\/b> is a variable we define to hold each individual service out of the collection services stored in the <b>$objService<\/b> variable. <\/p>\n<p class=\"MsoNormal\">We open the script block for the <b>foreach<\/b> cmdlet by using curly brackets. The first thing we do inside the <b>foreach<\/b> code block is use the <b>if<\/b> statement to determine if the service is running or not. We use the <b>$service.state<\/b> property and see if it is equal to &ldquo;running.&rdquo; The <b>foreach<\/b> and opening code block for the <b>if<\/b> statement are seen here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">foreach ($service in $objService) <br><span>&nbsp;<\/span>{<br><span>&nbsp; <\/span>if ($service.state -eq &#8220;running&#8221;)<br><span>&nbsp; <\/span>{<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">If the service is running, we enter another code block and store the <b>servicename<\/b> property in the variable <b>$strServiceName<\/b>. We retrieve service state and assign it in the <b>$strStatus<\/b> variable. The two WMI value assignments are seen here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$strServiceName = $service.name<br>$strStatus = $service.State<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">On the next line we create a variable called <b>$adOpenStatic<\/b> and assign the number 3 to it. This will be used when opening the connection to the database. We also create a variable called <b>$adLockOptimistic<\/b> and set it equal to 3 as well. This value will also be used when opening the connection to the database. <\/p>\n<p class=\"MsoNormal\">The complete path to the database is stored in the variable <b>$strDB<\/b>. The <b>$strTable<\/b> variable is used to hold the name of the table we wish to access. In this script, we are going to connect to the <b>runningServices<\/b> table. This is the string we assign to the <b>$strTable<\/b> variable. The four variables that will be used by ADO are seen here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$adOpenStatic = 3<br>$adLockOptimistic = 3<br>$strDB = &#8220;c:fsoservices.mdb&#8221;<br>$strTable = &#8220;runningServices&#8221;<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">With the &ldquo;preliminaries&rdquo; out of the way, we are ready to get into some nitty-gritty ADO. We need to create two objects: a <b>Connection<\/b> object and a <b>RecordSet<\/b> object. To create the <b>Connection<\/b> object we use the <b>New-Object<\/b> cmdlet to specify the <b>&ndash;comobject<\/b> parameter and feed it the program ID <b>ADODB.Connection<\/b>. We store the <b>Connection<\/b> object in the <b>$objConnection<\/b>. <\/p>\n<p class=\"MsoNormal\">The next object we need to create is a <b>RecordSet<\/b> object. To do this we also use the <b>New-Object<\/b> cmdlet with the <b>&ndash;ComObject<\/b> parameter. We use the program ID <b>ADODB.Recordset<\/b> and store the resulting <b>RecordSet<\/b> object in the variable <b>$objRecordSet<\/b>. The code used to create the two ADODB objects is seen here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$objConnection = New-Object -ComObject ADODB.Connection<br>$objRecordSet = new-object -ComObject ADODB.Recordset<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">Now that we have the two ADODB objects created, we can begin the process of &ldquo;wiring up&rdquo; the ADO connection to the <b>services.mdb<\/b> database. The first thing that must be done is to open the connection to the database. To do this, we must use the Connection object that is contained in the <b>$objConnection<\/b> variable. We use the <b>Open<\/b> method from the <b>Connection<\/b> object, and specify the provider as the <b>Microsoft.Jet.OLEDB.4.0<\/b> provider. We separate the provider from the data source, which is specified as the database whose path is stored in the <b>$strDB<\/b> variable. This command is a single, logical line. The grave character is used after the semicolon to indicate line continuation. This line of code is seen here: <\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$objConnection.Open(&#8220;Provider = Microsoft.Jet.OLEDB.4.0; `<br>Data Source= $strDB&#8221;)<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">When the connection to the database is open, it is time to use the Open method from the <b>RecordSet<\/b> object. To do this, we first specify a SQL query. We then list the connection and how we wish to open the database. All these parameters are seen in the code shown here: <\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$objRecordSet.Open(&#8220;SELECT * FROM runningServices&#8221;, `<br>$objConnection, $adOpenStatic, $adLockOptimistic)<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">After the <b>RecordSet<\/b> is opened, we can add new records to it. To do this, we use the <b>AddNew<\/b> method from the <b><span>&nbsp;<\/span>RecordSet<\/b> object. To add data to the database, we use the <b>Fields.item<\/b> property of the <b><span>&nbsp;<\/span>RecordSet<\/b> object. The <b>fieldnames<\/b> for the Microsoft Access database can be found easily by looking at the database table in design view. This is seen here: <\/p>\n<p class=\"Fig-Graphic\"><img decoding=\"async\" title=\"Image of database table in Design view\" alt=\"Image of database table in Design view\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/hsg\/2009\/september\/hey0929\/hsg-09-29-09-02.jpg\" width=\"600\" height=\"429\"><a href=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/hsg\/2009\/september\/hey0929\/hsg-09-29-09-02.jpg\"><\/a><\/p>\n<p class=\"MsoCaption\"><strong>&nbsp;<\/strong><\/p>\n<p class=\"MsoNormal\">The <b>fieldname<\/b> in quotation marks comes from the database itself. We use the variables we assigned earlier. The exception is the use of the <b>Get-Date<\/b> cmdlet to retrieve the current date-time stamp. The code to do this is seen here: <\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$objRecordSet.AddNew()<br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Fields.item(&#8220;TimeStamp&#8221;) = Get-Date <br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Fields.item(&#8220;strComputer&#8221;) = $strComputer<br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Fields.item(&#8220;strDomain&#8221;) = $strDomain<br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Fields.item(&#8220;strService&#8221;) = $strServiceName<br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Fields.item(&#8220;strStatus&#8221;) = $strStatus<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">To write the data back to the database, we use the <b>Update<\/b> method from the <b>RecordSet<\/b> object. This is seen here: <\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$objRecordSet.Update()<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">To provide feedback to the user on the progress of writing the data back to the database, we use the <b>Write-Host<\/b> cmdlet and display a series of <b>\/<\/b>,each of which indicates one service. To indicate continuity, we use the <b>&ndash;noNewLine<\/b> switch: <\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">write-host -foregroundColor yellow &#8220;\/&#8221; -noNewLine<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">The output from the above <b>Write-Host<\/b> cmdlet, though maybe not impressive, does provide a good visual representation that the script is running and indicates progress. The completed output is seen here:<\/p>\n<p class=\"Fig-Graphic\"><img decoding=\"async\" title=\"Image of completed output\" alt=\"Image of completed output\" src=\"http:\/\/img.microsoft.com\/library\/media\/1033\/technet\/images\/scriptcenter\/qanda\/hsg\/2009\/september\/hey0929\/hsg-09-29-09-03.jpg\" width=\"600\" height=\"171\"><\/p>\n<p class=\"Fig-Graphic\">&nbsp;<\/p>\n<p class=\"MsoNormal\">After all the records have been written to the database, we close both the <b>Connection<\/b> object and the <b>RecordSet<\/b> object. These two lines of code are seen here:<\/p>\n<p class=\"CodeBlock\"><span><font face=\"Lucida Sans Typewriter\">$objRecordSet.Close()<br>$objConnection.Close()<\/p>\n<p><\/font><\/span><\/p>\n<p class=\"MsoNormal\">The complete WriteRunningServicesToAccess.ps1 script is seen here. <\/p>\n<p class=\"CodeBlockScreenedHead\"><strong>WriteRunningServicesToAccess.ps1<\/p>\n<p><\/strong><\/p>\n<p class=\"CodeBlockScreened\"><span><font><font face=\"Lucida Sans Typewriter\">$StrComputer = (New-Object -ComObject WScript.Network).computername<br>$StrDomain = (New-Object -ComObject WScript.Network).Domain<br>$strWMIQuery = &#8220;Select * from win32_Service&#8221;<br>$objservice = get-wmiobject -query $strWMIQuery<\/p>\n<p>write-host -foreGroundColor yellow &#8220;Obtaining service info &#8230;&#8221;<\/p>\n<p>foreach ($service in $objService) <br><span>&nbsp;<\/span>{<br><span>&nbsp; <\/span>if ($service.state -eq &#8220;running&#8221;)<br><span>&nbsp; <\/span>{<br><span>&nbsp;&nbsp; <\/span>$strServiceName = $service.name<br><span>&nbsp;&nbsp; <\/span>$strStatus = $service.State<br><span>&nbsp;&nbsp; <\/span>$adOpenStatic = 3<br><span>&nbsp;&nbsp; <\/span>$adLockOptimistic = 3<br><span>&nbsp;&nbsp; <\/span>$strDB = &#8220;c:fsoservices.mdb&#8221;<br><span>&nbsp;&nbsp; <\/span>$strTable = &#8220;runningServices&#8221;<br><span>&nbsp;&nbsp; <\/span>$objConnection = New-Object -ComObject ADODB.Connection<br><span>&nbsp;&nbsp; <\/span>$objRecordSet = new-object -ComObject ADODB.Recordset<br><span>&nbsp;&nbsp; <\/span>$objConnection.Open(&#8220;Provider = Microsoft.Jet.OLEDB.4.0; `<br><span>&nbsp;&nbsp;&nbsp;&nbsp; <\/span>Data Source= $strDB&#8221;)<br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Open(&#8220;SELECT * FROM runningServices&#8221;, `<br><span>&nbsp;&nbsp;&nbsp;&nbsp; <\/span>$objConnection, $adOpenStatic, $adLockOptimistic)<\/p>\n<p><span>&nbsp;&nbsp; <\/span>$objRecordSet.AddNew()<br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Fields.item(&#8220;TimeStamp&#8221;) = Get-Date <br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Fields.item(&#8220;strComputer&#8221;) = $strComputer<br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Fields.item(&#8220;strDomain&#8221;) = $strDomain<br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Fields.item(&#8220;strService&#8221;) = $strServiceName<br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Fields.item(&#8220;strStatus&#8221;) = $strStatus<br><span>&nbsp;&nbsp; <\/span>$objRecordSet.Update()<br><span>&nbsp;&nbsp; <\/span>write-host -foregroundColor yellow &#8220;\/&#8221; -noNewLine<br><span>&nbsp; <\/span>}<br><span>&nbsp;<\/span>}<\/p>\n<p>$objRecordSet.Close()<br>$objConnection.Close()<\/p>\n<p><\/font><\/font><\/span><\/p>\n<p class=\"MsoNormal\">DN, that is how you can record the running services to a Microsoft Access database. Join us tomorrow as Service Week continues. <\/p>\n<p class=\"MsoNormal\">If you want to know exactly what we will be scripting tomorrow, follow us on <a href=\"http:\/\/www.twitter.com\/scriptingguys\/\" target=\"_blank\"><font face=\"Segoe\">Twitter<\/font><\/a> or <a href=\"http:\/\/www.facebook.com\/group.php?gid=5901799452\" target=\"_blank\"><font face=\"Segoe\">Facebook<\/font><\/a>. If you have any questions, send e-mail to us at <a href=\"http:\/\/blogs.technet.commailto:scripter@microsoft.com\" target=\"_blank\"><font face=\"Segoe\">scripter@microsoft.com<\/font><\/a> or post your questions on the <a href=\"http:\/\/social.technet.microsoft.com\/Forums\/en\/ITCG\/threads\/\" target=\"_blank\"><font face=\"Segoe\">Official Scripting Guys Forum<\/font><\/a>. See you tomorrow. Until then, peace.<\/p>\n<p class=\"MsoNormal\">&nbsp;<\/p>\n<p><b><span>Ed Wilson and Craig Liebendorfer, Scripting Guys<\/span><\/b><\/p>\n<p><b><span><\/span><\/b>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>(Portions of this article previously appeared in the Microsoft Press book, Windows PowerShell Scripting Guide.) Hey, Scripting Guy! I would like to be able to write a listing of the services that are running to a Microsoft Access database. I would then be able to use the report writer from Microsoft Access to produce some [&hellip;]<\/p>\n","protected":false},"author":595,"featured_media":87096,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[31,3,39,45],"class_list":["post-52363","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-operating-system","tag-scripting-guy","tag-services","tag-windows-powershell"],"acf":[],"blog_post_summary":"<p>(Portions of this article previously appeared in the Microsoft Press book, Windows PowerShell Scripting Guide.) Hey, Scripting Guy! I would like to be able to write a listing of the services that are running to a Microsoft Access database. I would then be able to use the report writer from Microsoft Access to produce some [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/52363","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\/595"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/comments?post=52363"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/52363\/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=52363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=52363"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=52363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}