{"id":2456,"date":"2013-12-08T00:01:00","date_gmt":"2013-12-08T00:01:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2013\/12\/08\/weekend-scripter-who-are-the-administrators\/"},"modified":"2013-12-08T00:01:00","modified_gmt":"2013-12-08T00:01:00","slug":"weekend-scripter-who-are-the-administrators","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/weekend-scripter-who-are-the-administrators\/","title":{"rendered":"Weekend Scripter:  Who are the Administrators?"},"content":{"rendered":"<p><strong>Summary<\/strong>: Guest blogger, Bill Stewart, talks about using Windows PowerShell to find administrators.\nMicrosoft Scripting Guy, Ed Wilson, is here. Hello everyone. It is the weekend, and guest blogger, <a href=\"http:\/\/blogs.technet.com\/b\/heyscriptingguy\/archive\/tags\/bill+stewart\/\" target=\"_blank\">Bill Stewart<\/a> is going to share his time and knowledge today. Bill is a scripting guru and a moderator for the Official Scripting Guys Forum&#8230;\nAs you know, an administrator of a Windows computer is a member of the computer&rsquo;s local Administrators group. This is a special built-in group, so any user or group that&rsquo;s a member of this special group is an administrator on the computer. We can see who the members of this group are by typing the command <strong>net localgroup Administrators<\/strong> at a cmd.exe or Windows PowerShell prompt.<\/p>\n<h2>Get local group membership by using ADSI<\/h2>\n<p>But what if we want to get the members of the local Administrators group on a remote computer? We can&rsquo;t use the <strong>net localgroup<\/strong> command because it works only on the local computer. Since we&rsquo;re talking Windows &nbsp;PowerShell, you might be aware that you can use the <strong>[ADSI]<\/strong> type accelerator to connect to a group on a computer; for example:<\/p>\n<p style=\"padding-left: 30px\">$localAdminGroup = [ADSI] &#8220;WinNT:\/\/remotecomputer\/Administrators,Group&#8221;\nThis creates a System.DirectoryServices.DirectoryEntry object that references the local Administrators group on the computer <strong>RemoteComputer<\/strong>. This is an object, so we should be able to call its <strong>Members<\/strong> method to view the members of the group:<\/p>\n<p style=\"padding-left: 30px\">$localAdminGroup.Members()\nHowever, this produces some peculiar output:<\/p>\n<p style=\"padding-left: 30px\">System.__ComObject<\/p>\n<p style=\"padding-left: 30px\">&#8230;\nThe members of the group are COM objects, but Windows PowerShell doesn&rsquo;t know what to do with them because there&rsquo;s no type library that tells Windows PowerShell the interface for the objects (that is, what the properties and methods are). The workaround is to call the <strong>InvokeMember<\/strong> method of each COM object&rsquo;s base type to retrieve the name property, like this:<\/p>\n<p style=\"padding-left: 30px\">$localAdminGroup.Members() | ForEach-Object {<\/p>\n<p style=\"padding-left: 30px\">&nbsp; $_.GetType().InvokeMember(&#8220;Name&#8221;, &#8220;GetProperty&#8221;, $NULL, $_, $NULL)<\/p>\n<p style=\"padding-left: 30px\">}\nIt&rsquo;s ugly, but it works. But we have another issue. What if you&rsquo;re using a non-English version of Windows? Or what if the Administrators group has been renamed? In either case, the ADSI technique isn&rsquo;t going to work because the group might not be named <em>Administrators<\/em>.<\/p>\n<h2>Get Administrators group name by using WMI<\/h2>\n<p>The alternative is to use WMI. By using WMI, we can ask for the group by its SID, S-1-5-32-544, rather than by its name:<\/p>\n<p style=\"padding-left: 30px\">Get-WMIObject -Class Win32_Group `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Filter &#8220;LocalAccount=TRUE and SID=&#8217;S-1-5-32-544&#8242;&#8221; `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Computer remotecomputer\nThis gives us output like this:<\/p>\n<p style=\"padding-left: 30px\">Caption&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Domain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;<\/p>\n<p style=\"padding-left: 30px\">REMOTECOMPUTERAdministrators&nbsp; REMOTECOMPUTER&nbsp; Administrators&nbsp; S-1-5-32-544\n<strong>Get-WMIObject<\/strong> supports credentials, so if you&rsquo;re signed in with an account that doesn&rsquo;t have permission to access the remote computer, you can create a credential object to make the connection:<\/p>\n<p style=\"padding-left: 30px\">$credential = Get-Credential<\/p>\n<p style=\"padding-left: 30px\">Get-WMIObject -Class Win32_Group `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Filter &#8220;LocalAccount=TRUE and SID=&#8217;S-1-5-32-544&#8242;&#8221; `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -ComputerName remotecomputer `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Credential $credential<\/p>\n<h2>Combine ADSI and WMI?<\/h2>\n<p>Now that we&rsquo;ve connected to the actual Administrators group, we can use the <strong>Name<\/strong> property, with ADSI and script in the previous section, to get the members of the group:<\/p>\n<p style=\"padding-left: 30px\">$credential = Get-Credential<\/p>\n<p style=\"padding-left: 30px\">$computerName = &#8220;remotecomputer&#8221;<\/p>\n<p style=\"padding-left: 30px\">$wmiObject = Get-WMIObject `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Class Win32_Group `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Filter &#8220;LocalAccount=TRUE and SID=&#8217;S-1-5-32-544&#8242;&#8221; `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -ComputerName $computerName `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Credential $credential<\/p>\n<p style=\"padding-left: 30px\">$adminGroupName = $wmiObject.Name<\/p>\n<p style=\"padding-left: 30px\">$adminGroup = [ADSI] &#8220;WinNT:\/\/$computerName\/$adminGroupName,Group&#8221;<\/p>\n<p style=\"padding-left: 30px\">$adminGroup.Members() | ForEach-Object {<\/p>\n<p style=\"padding-left: 30px\">&nbsp; $_.GetType().InvokeMember(&#8220;Name&#8221;, &#8220;GetProperty&#8221;, $NULL, $_, $NULL)<\/p>\n<p style=\"padding-left: 30px\">}\nNow we&rsquo;re getting somewhere. The output of this script is a list of names like this:<\/p>\n<p style=\"padding-left: 30px\">Administrator<\/p>\n<p style=\"padding-left: 30px\">Domain Admins<\/p>\n<p style=\"padding-left: 30px\">kendyer<\/p>\n<p style=\"padding-left: 30px\">&#8230;\nThis is good, but we&rsquo;re missing something. We know that Administrator is probably a local account and Domain Admins is probably a domain group. But we don&rsquo;t know if kendyer is a local account or a domain account. To avoid confusion, it would be really helpful if the output contained the domain name for domain accounts.\nAlso, there&rsquo;s another issue with this approach: It&rsquo;s relatively inefficient. We&rsquo;re making an initial WMI connection to the remote computer to retrieve the Administrators group name, and then we&rsquo;re making a second connection (connecting to the ADSI group object) to retrieve the group members. This may not be an issue on a fast network, but over slower connections, it doesn&rsquo;t scale very well.<\/p>\n<h2>Use WMI to get members<\/h2>\n<p>To avoid making two separate connections to each remote computer, we can stick with WMI. When we connect to a computer and retrieve its Administrators group, we&rsquo;re retrieving a .NET ManagementObject object:<\/p>\n<p style=\"padding-left: 30px\">$credential = Get-Credential<\/p>\n<p style=\"padding-left: 30px\">$computerName = &#8220;remotecomputer&#8221;<\/p>\n<p style=\"padding-left: 30px\">$wmiObject = Get-WMIObject `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Class Win32_Group `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Filter &#8220;LocalAccount=TRUE and SID=&#8217;S-1-5-32-544&#8242;&#8221; `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -ComputerName $computerName `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Credential $credential<\/p>\n<p style=\"padding-left: 30px\">&#8220;.NET object type: {0}&#8221; -f $wmiObject.GetType().FullName<\/p>\n<p style=\"padding-left: 30px\">&#8220;WMI class: {0}&#8221; -f $wmiObject.__CLASS\nThe output of this command is:<\/p>\n<p style=\"padding-left: 30px\">.NET object type: System.Management.ManagementObject<\/p>\n<p style=\"padding-left: 30px\">WMI class: Win32_Group\nWMI objects can be related to each other by using associator classes; in this case, WMI relates the Win32_Group class with its members by using the <strong>Win32_GroupUser<\/strong> associator class. The WMI <strong>GetRelated<\/strong> method can use the <strong>Win32_GroupUser<\/strong> class to retrieve the group&rsquo;s members, like this:<\/p>\n<p style=\"padding-left: 30px\">$credential = Get-Credential<\/p>\n<p style=\"padding-left: 30px\">$computerName = &#8220;remotecomputer&#8221;<\/p>\n<p style=\"padding-left: 30px\">$wmiObject = Get-WMIObject `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Class Win32_Group `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Filter &#8220;LocalAccount=TRUE and SID=&#8217;S-1-5-32-544&#8242;&#8221; `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -ComputerName $computerName `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Credential $credential<\/p>\n<p style=\"padding-left: 30px\">$wmiObject.GetRelated(&#8220;Win32_Account&#8221;)\nWhen I run this on my computer, though, the script seems to hang, and it never finishes. There are simply too many relationships in WMI for this call to the <strong>GetRelated<\/strong> method to complete in a reasonable amount of time. To get around this issue, I need to specify the parameters to the <strong>GetRelated<\/strong> method to tell WMI that I only want the members of this specific group&mdash;not every possible relationship:<\/p>\n<p style=\"padding-left: 30px\">$credential = Get-Credential<\/p>\n<p style=\"padding-left: 30px\">$computerName = &#8220;remotecomputer&#8221;<\/p>\n<p style=\"padding-left: 30px\">$wmiObject = Get-WMIObject `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Class Win32_Group `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Filter &#8220;LocalAccount=TRUE and SID=&#8217;S-1-5-32-544&#8242;&#8221; `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -ComputerName $computerName `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Credential $credential<\/p>\n<p style=\"padding-left: 30px\">$wmiObject.GetRelated(&#8220;Win32_Account&#8221;,&#8221;Win32_GroupUser&#8221;,&#8221;&#8221;,&#8221;&#8221;,<\/p>\n<p style=\"padding-left: 30px\">&nbsp; &#8220;PartComponent&#8221;,&#8221;GroupComponent&#8221;,$FALSE,$NULL)\nIn this case, I use all eight parameters for the <strong>GetRelated<\/strong> method to focus on the exact relationship between the <strong>Win32_Group<\/strong> object instance (in the variable <strong>$wmiObject<\/strong>) and its related <strong>Win32_Account<\/strong> object instances. When I run the previous script, I get the desired output:<\/p>\n<p style=\"padding-left: 30px\">AccountType : 512<\/p>\n<p style=\"padding-left: 30px\">Caption&nbsp;&nbsp;&nbsp;&nbsp; : REMOTECOMPUTERAdministrator<\/p>\n<p style=\"padding-left: 30px\">Domain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : REMOTECOMPUTER<\/p>\n<p style=\"padding-left: 30px\">SID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : S-1-5-21&#8230;<\/p>\n<p style=\"padding-left: 30px\">FullName&nbsp;&nbsp;&nbsp; :<\/p>\n<p style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Administrator<\/p>\n<p style=\"padding-left: 30px\">Caption : FABRIKAMDomain Admins<\/p>\n<p style=\"padding-left: 30px\">Domain&nbsp; : FABRIKAM<\/p>\n<p style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp; : Domain Admins<\/p>\n<p style=\"padding-left: 30px\">SID&nbsp;&nbsp;&nbsp;&nbsp; : S-1-5-21&#8230;<\/p>\n<h2>Improve WMI performance<\/h2>\n<p>I&rsquo;ve run into a final snag, though. When I connect to a remote computer over a slow network connection, I get the group members, but the <strong>GetRelated<\/strong> method only outputs one group member at a time. To speed things up, I would prefer to retrieve multiple members at a time; say, in batches of 50 members.\nTo do this, I need to create a System.Management.EnumerationOptions object, set its <strong>BlockSize<\/strong> property to 50, and use this object as the final parameter of the <strong>GetRelated<\/strong> method:<\/p>\n<p style=\"padding-left: 30px\">$wmiEnumOpts = new-object System.Management.EnumerationOptions<\/p>\n<p style=\"padding-left: 30px\">$wmiEnumOpts.BlockSize = 50<\/p>\n<p style=\"padding-left: 30px\">$credential = Get-Credential<\/p>\n<p style=\"padding-left: 30px\">$computerName = &#8220;remotecomputer&#8221;<\/p>\n<p style=\"padding-left: 30px\">$wmiObject = Get-WMIObject `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Class Win32_Group `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Filter &#8220;LocalAccount=TRUE and SID=&#8217;S-1-5-32-544&#8242;&#8221; `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -ComputerName $computerName `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Credential $credential<\/p>\n<p style=\"padding-left: 30px\">$wmiObject.GetRelated(&#8220;Win32_Account&#8221;,&#8221;Win32_GroupUser&#8221;,&#8221;&#8221;,&#8221;&#8221;,<\/p>\n<p style=\"padding-left: 30px\">&nbsp; &#8220;PartComponent&#8221;,&#8221;GroupComponent&#8221;,$FALSE,$wmiEnumOpts)\nNow, I get the same output, but it runs faster because the <strong>GetRelated<\/strong> method retrieves the local Administrator group&rsquo;s membership in batches of 50 instead of one at a time.<\/p>\n<h2>User friendly output<\/h2>\n<p>When I use the <strong>GetRelated<\/strong> method, the object instances are output by the default formatter in Windows PowerShell. These output objects provide a lot of detail, but I only want to know three things:<\/p>\n<ul>\n<li>The computer name where the local Administrators group resides<\/li>\n<li>The name of the Administrators group (in case it&rsquo;s not in English or has been renamed)<\/li>\n<li>The name of the member of the group<\/li>\n<\/ul>\n<p>To do this, I&rsquo;ll use the <strong>Select-Object<\/strong> cmdlet to output customized objects that contain only the information I want:<\/p>\n<p style=\"padding-left: 30px\">$wmiEnumOpts = new-object System.Management.EnumerationOptions<\/p>\n<p style=\"padding-left: 30px\">$wmiEnumOpts.BlockSize = 20<\/p>\n<p style=\"padding-left: 30px\">$credential = Get-Credential<\/p>\n<p style=\"padding-left: 30px\">$computerName = &#8220;remotecomputer&#8221;<\/p>\n<p style=\"padding-left: 30px\">$wmiObject = Get-WMIObject `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Class Win32_Group `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Filter &#8220;LocalAccount=TRUE and SID=&#8217;S-1-5-32-544&#8242;&#8221; `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -ComputerName $computerName `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; -Credential $credential<\/p>\n<p style=\"padding-left: 30px\">$groupName = $wmiObject.Name<\/p>\n<p style=\"padding-left: 30px\">$wmiObject.GetRelated(&#8220;Win32_Account&#8221;,&#8221;Win32_GroupUser&#8221;,&#8221;&#8221;,&#8221;&#8221;,<\/p>\n<p style=\"padding-left: 30px\">&nbsp; &#8220;PartComponent&#8221;,&#8221;GroupComponent&#8221;,$FALSE,$wmiEnumOpts) |<\/p>\n<p style=\"padding-left: 30px\">&nbsp; Select-Object `<\/p>\n<p style=\"padding-left: 30px\">&nbsp; @{Name=&#8221;ComputerName&#8221;; Expression={$_.__SERVER}},<\/p>\n<p style=\"padding-left: 30px\">&nbsp; @{Name=&#8221;Name&#8221;; Expression={$groupName}},<\/p>\n<p style=\"padding-left: 30px\">&nbsp; @{Name=&#8221;Member&#8221;; Expression={$_.Caption}}\nNote that I&rsquo;m retrieving the group&rsquo;s name before calling the <strong>GetRelated<\/strong> method so I can include it in the output objects.\nThere is one final &ldquo;tweak&rdquo; I want to include. If the account is a local account, I want to omit the computer name from the <strong>Member<\/strong> output property; that is, I want my <strong>Member<\/strong> property to contain <strong>Administrator<\/strong> rather than <strong>RemoteComputerAdministrator<\/strong>. To get this effect, I&rsquo;ll use the Windows PowerShell <strong>-replace<\/strong> operator to replace the computer name from the <strong>Caption<\/strong> property with an empty string. To do this, let&rsquo;s replace the final line of script:<\/p>\n<p style=\"padding-left: 30px\">@{Name=&#8221;Member&#8221;; Expression={$_.Caption}}<\/p>\n<p style=\"padding-left: 30px\">with this instead:<\/p>\n<p style=\"padding-left: 30px\">@{Name=&#8221;Member&#8221;; Expression={$_.Caption -replace &#8220;^$($_.__SERVER)\\&#8221;, &#8220;&#8221;}}<\/p>\n<p style=\"padding-left: 30px\">This code gives me the final output I want:<\/p>\n<p style=\"padding-left: 30px\">ComputerName&nbsp;&nbsp;&nbsp; Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Member<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212;&#8212;&#8212;&nbsp;&nbsp;&nbsp; &#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;<\/p>\n<p style=\"padding-left: 30px\">REMOTECOMPUTER&nbsp; Administrators&nbsp; Administrator<\/p>\n<p style=\"padding-left: 30px\">REMOTECOMPUTER&nbsp; Administrators&nbsp; D1Domain Admins<\/p>\n<p style=\"padding-left: 30px\">&#8230;<\/p>\n<h2>Put it all together<\/h2>\n<p>Now that we have the working script, all that&rsquo;s left is to put it together so it&rsquo;s easy to use. You can download the entire script from the TechNet Gallery, and it supports pipeline input for computer names: <a href=\"http:\/\/gallery.technet.microsoft.com\/Get-LocalAdminGroupMemberps-a8ace894\" target=\"_blank\">Get-LocalAdminGroupMember.ps1<\/a>.\n~Bill\nThanks Bill. Excellent post.\nI invite you to follow me on <a href=\"http:\/\/bit.ly\/scriptingguystwitter\" target=\"_blank\">Twitter<\/a> and <a href=\"http:\/\/bit.ly\/scriptingguysfacebook\" target=\"_blank\">Facebook<\/a>. If you have any questions, send email to me at <a href=\"http:\/\/blogs.technet.commailto:scripter@microsoft.com\" target=\"_blank\">scripter@microsoft.com<\/a>, or post your questions on the <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><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summary: Guest blogger, Bill Stewart, talks about using Windows PowerShell to find administrators. Microsoft Scripting Guy, Ed Wilson, is here. Hello everyone. It is the weekend, and guest blogger, Bill Stewart is going to share his time and knowledge today. Bill is a scripting guru and a moderator for the Official Scripting Guys Forum&#8230; As [&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":[347,44,56,197,3,61,45],"class_list":["post-2456","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-bill-stewart","tag-groups","tag-guest-blogger","tag-local-account-management","tag-scripting-guy","tag-weekend-scripter","tag-windows-powershell"],"acf":[],"blog_post_summary":"<p>Summary: Guest blogger, Bill Stewart, talks about using Windows PowerShell to find administrators. Microsoft Scripting Guy, Ed Wilson, is here. Hello everyone. It is the weekend, and guest blogger, Bill Stewart is going to share his time and knowledge today. Bill is a scripting guru and a moderator for the Official Scripting Guys Forum&#8230; As [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/2456","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=2456"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/2456\/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=2456"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=2456"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=2456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}