{"id":3949,"date":"2013-03-26T00:01:00","date_gmt":"2013-03-26T00:01:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/heyscriptingguy\/2013\/03\/26\/decrypt-powershell-secure-string-password\/"},"modified":"2013-03-26T00:01:00","modified_gmt":"2013-03-26T00:01:00","slug":"decrypt-powershell-secure-string-password","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/scripting\/decrypt-powershell-secure-string-password\/","title":{"rendered":"Decrypt PowerShell Secure String Password"},"content":{"rendered":"<p><strong>Summary<\/strong>: Microsoft Scripting Guy, Ed Wilson, shows how to easily decrypt the Windows PowerShell secure string password.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/q-for-powertip.jpg\" alt=\"Hey, Scripting Guy! Question\" \/>&nbsp;Hey, Scripting Guy! We have an FTP site that I have to use on a regular basis. I need an easy way to get a credential and use that credential with the FTP site so that I can download a file that changes on a daily basis. I found a few scripts and functions on the Internet that will decrypt the secure string password from a Windows PowerShell credential object, but they all seem really complicated. Is there an easy way to do this?<\/p>\n<p>&mdash;AD<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/a-for-powertip.jpg\" alt=\"Hey, Scripting Guy! Answer\" \/>&nbsp;Hello AD,<\/p>\n<p>Microsoft Scripting Guy, Ed Wilson, is here. Today I am sitting here drinking a cup of Earl Grey tea with a pinch of lavender in it. I love the way the two flavors complement each other. As I look over my email, I ran across your question. Although you did not include a link to the complicated versions<em> <\/em>of the scripts and functions you ran across, I will venture to say that my method should be relatively painless.<\/p>\n<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<strong>Note<\/strong> &nbsp;&nbsp;What I am showing here today is exactly by design, and is not a hack.<\/p>\n<h2>Using Get-Credential for credentials<\/h2>\n<p>I love using the <strong>Get-Credential<\/strong> cmdlet to retrieve a credential object. It is already set up to work; and therefore, it is easy to use. If I need credentials, I do not need to mess around writing HTAs, creating various WinForms to prompt for a user name and password, or worry about how to mask the password&mdash;all of which were problems before Windows PowerShell and the <strong>Get-Credential<\/strong> cmdlet. So, like I say, I absolutely love it. To use the <strong>Get-Credential<\/strong> cmdlet, I generally store the resulting credential object in a variable. (I do not have to do so, because I can use it directly if I need to, but it is more flexible to store it in a variable.) Here is the command.<\/p>\n<p style=\"padding-left: 30px\">$credential = Get-Credential<\/p>\n<p>When I run this command, a dialog box appears. The box is already set up to use, with a user name on the top, and it masks the password in the bottom box. The box is shown here.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/6153.hsg-3-26-13-01.png\"><img decoding=\"async\" title=\"Image of dialog box\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/29\/2019\/02\/6153.hsg-3-26-13-01.png\" alt=\"Image of dialog box\" \/><\/a><\/p>\n<h2>&nbsp;<span style=\"font-size: 1.5em\">The problem with Get-Credential<\/span><\/h2>\n<p>The problem with the <strong>Get-Credential<\/strong> cmdlet is that it returns a <strong>PSCredential<\/strong> object. In itself, this is not an issue, but it does mean that I can only use the credential object for cmdlets and for other items that know what a <strong>PSCredential<\/strong> object is. Not even all .NET classes know how to deal with a PSCredential object, so when it comes to connecting to legacy databases and things like websites and FTP sites, there is little hope of being able to use the object directly.<\/p>\n<p>Luckily, I can use the <strong>Get-Member<\/strong> cmdlet to look at the members of a <strong>PSCredential<\/strong> object. The members are listed here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential | gm&nbsp;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;&nbsp; TypeName: System.Management.Automation.PSCredential<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemberType Definition<\/p>\n<p style=\"padding-left: 30px\">&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<\/p>\n<p style=\"padding-left: 30px\">Equals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; bool Equals(System.Object obj)<\/p>\n<p style=\"padding-left: 30px\">GetHashCode&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;&nbsp; int GetHashCode()<\/p>\n<p style=\"padding-left: 30px\">GetNetworkCredential Method&nbsp;&nbsp;&nbsp;&nbsp; System.Net.NetworkCredential GetNetworkCredential()<\/p>\n<p style=\"padding-left: 30px\">GetObjectData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; void GetObjectData(System.Runtime.Serialization.S&#8230;<\/p>\n<p style=\"padding-left: 30px\">GetType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; type GetType()<\/p>\n<p style=\"padding-left: 30px\">ToString&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; string ToString()<\/p>\n<p style=\"padding-left: 30px\">Password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property&nbsp;&nbsp; securestring Password {get;}<\/p>\n<p style=\"padding-left: 30px\">UserName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property&nbsp;&nbsp; string UserName {get;}<\/p>\n<p>At first, it looks like things are relatively easy. If I want to see the user name, all I need to do is access the <strong>UserName<\/strong><em> <\/em>property as shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.UserName<\/p>\n<p style=\"padding-left: 30px\">mydomain\\someuser<\/p>\n<p>That is cool. Now what about the password? When I access the <strong>Password<\/strong><em> <\/em>property, it returns <strong>SecureString<\/strong>. This is shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.Password<\/p>\n<p style=\"padding-left: 30px\">System.Security.SecureString<\/p>\n<p>Hmmm, what if I look at the members of <strong>SecureString<\/strong>? I pipe it to the <strong>Get-Member<\/strong> cmdlet, and I see the following members.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.Password | gm&nbsp;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;&nbsp; TypeName: System.Security.SecureString<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemberType Definition<\/p>\n<p style=\"padding-left: 30px\">&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<\/p>\n<p style=\"padding-left: 30px\">AppendChar&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; void AppendChar(char c)<\/p>\n<p style=\"padding-left: 30px\">Clear&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; void Clear()<\/p>\n<p style=\"padding-left: 30px\">Copy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; securestring Copy()<\/p>\n<p style=\"padding-left: 30px\">Dispose&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; void Dispose(), void IDisposable.Dispose()<\/p>\n<p style=\"padding-left: 30px\">Equals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; bool Equals(System.Object obj)<\/p>\n<p style=\"padding-left: 30px\">GetHashCode&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; int GetHashCode()<\/p>\n<p style=\"padding-left: 30px\">GetType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; type GetType()<\/p>\n<p style=\"padding-left: 30px\">InsertAt&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; void InsertAt(int index, char c)<\/p>\n<p style=\"padding-left: 30px\">IsReadOnly&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; bool IsReadOnly()<\/p>\n<p style=\"padding-left: 30px\">MakeReadOnly Method&nbsp;&nbsp;&nbsp;&nbsp; void MakeReadOnly()<\/p>\n<p style=\"padding-left: 30px\">RemoveAt&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; void RemoveAt(int index)<\/p>\n<p style=\"padding-left: 30px\">SetAt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; void SetAt(int index, char c)<\/p>\n<p style=\"padding-left: 30px\">ToString&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; string ToString()<\/p>\n<p style=\"padding-left: 30px\">Length&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property&nbsp;&nbsp; int Length {get;}<\/p>\n<p>Ok, cool. I will try the <strong>ToString<\/strong><em> <\/em>method and see what happens.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.Password.ToString()<\/p>\n<p style=\"padding-left: 30px\">System.Security.SecureString<\/p>\n<p>Well, that was less than illuminating&hellip;<\/p>\n<p>What if I try the <strong>Length<\/strong><em> <\/em>property? Does it give me anything?<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.Password.Length<\/p>\n<p style=\"padding-left: 30px\">17<\/p>\n<p>It does.This is promising. I can at least write code that checks the length of the password and provides some sort of feedback to users regarding the length of the password they supply. It could be rather a cool solution.<\/p>\n<p>What if I use the <strong>ConvertFrom-SecureString<\/strong> cmdlet? This is a standard Windows PowerShell cmdlet, so I decide to pipe the password to the <strong>ConvertFrom-SecureString<\/strong> cmdlet. The following illustrates the output.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.Password | ConvertFrom-SecureString<\/p>\n<p style=\"padding-left: 30px\">01000000d08c9ddf0115d1118c7a00c04fc297eb0100000052ded6c2db80e748933432e19b9de8b10000<\/p>\n<p style=\"padding-left: 30px\">000002000000000003660000c00000001000000016dc35885d76d07bab289eb9927cfc1e000000000480<\/p>\n<p style=\"padding-left: 30px\">0000a0000000100000003106cde553f45b08d13d89d11336170b280000005cc865c1ee1b57e84ed3d1a2<\/p>\n<p style=\"padding-left: 30px\">d3f2d0ec0f189b532e61c18d1f31444d6f119a1e8368477fd2d81f54140000000cb0262e58b08ae14f37<\/p>\n<p style=\"padding-left: 30px\">22c14c69684841b6b21c<\/p>\n<p>This latest representation is a string, and therefore there are no more options available for decrypting the password&mdash;at &nbsp;least, none that are very direct or easy to use.<\/p>\n<h2>Get a network credential<\/h2>\n<p>The solution, is to go back to the <strong>PSCredential<\/strong> object itself. It has a method that is designed to help with the exact scenario. I need to provide credentials to a legacy type of interface that does not know how to handle a <strong>PSCredential<\/strong>. Therefore, I need to be able to get both the user name and the password in an easy-to-use and easy-to-digest manner. When I call the <strong>GetNetworkCredential <\/strong>method from the <strong>PSCredential<\/strong> object, it returns the user name and the domain name. This is shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.GetNetworkCredential()&nbsp;<\/p>\n<p 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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Domain<\/p>\n<p style=\"padding-left: 30px\">&#8212;&#8212;&#8211;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;<\/p>\n<p style=\"padding-left: 30px\">someuser&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mydomain<\/p>\n<p>If I pipe the returned object to the <strong>Get-Member<\/strong> cmdlet, however, I see that I now have a <strong>NetworkCredential<\/strong> object. The members are listed here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.GetNetworkCredential() | gm&nbsp;<\/p>\n<p style=\"padding-left: 30px\">&nbsp;&nbsp; TypeName: System.Net.NetworkCredential<\/p>\n<p style=\"padding-left: 30px\">&nbsp;<\/p>\n<p style=\"padding-left: 30px\">Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MemberType Definition<\/p>\n<p style=\"padding-left: 30px\">&#8212;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<\/p>\n<p style=\"padding-left: 30px\">Equals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; bool Equals(System.Object obj)<\/p>\n<p style=\"padding-left: 30px\">GetCredential&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; System.Net.NetworkCredential GetCredential(uri uri, str&#8230;<\/p>\n<p style=\"padding-left: 30px\">GetHashCode&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; int GetHashCode()<\/p>\n<p style=\"padding-left: 30px\">GetType&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;&nbsp;&nbsp;&nbsp; type GetType()<\/p>\n<p style=\"padding-left: 30px\">ToString&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method&nbsp;&nbsp;&nbsp;&nbsp; string ToString()<\/p>\n<p style=\"padding-left: 30px\">Domain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property&nbsp;&nbsp; string Domain {get;set;}<\/p>\n<p style=\"padding-left: 30px\">Password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property&nbsp;&nbsp; string Password {get;set;}<\/p>\n<p style=\"padding-left: 30px\">SecurePassword Property&nbsp;&nbsp; securestring SecurePassword {get;set;}<\/p>\n<p style=\"padding-left: 30px\">UserName&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;Property&nbsp;&nbsp; string UserName {get;set;}<\/p>\n<p>I see the password has a <strong>SecureString<\/strong> for the <strong>SecurePassword<\/strong> property, but there is also the <strong>Password<\/strong> property that is a plain string. So, I pipe the <strong>NetworkCredential<\/strong> object to the <strong>Format-List<\/strong> cmdlet and the following appears.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.GetNetworkCredential() | fl *&nbsp;<\/p>\n<p style=\"padding-left: 30px\">UserName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : someuser<\/p>\n<p style=\"padding-left: 30px\">Password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : SomeUsersPassword<\/p>\n<p style=\"padding-left: 30px\">SecurePassword : System.Security.SecureString<\/p>\n<p style=\"padding-left: 30px\">Domain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : mydomain<\/p>\n<p>If I need only the password, I simply retrieve the <strong>Password<\/strong><em> <\/em>property as shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.GetNetworkCredential().password<\/p>\n<p style=\"padding-left: 30px\">SomeUsersPassword<\/p>\n<p>By the way, I can also get the password length here. This is because all string objects contain a <strong>Length<\/strong> property. This is shown here.<\/p>\n<p style=\"padding-left: 30px\">PS C:\\&gt; $credential.GetNetworkCredential().password.length<\/p>\n<p style=\"padding-left: 30px\">17<\/p>\n<p>AD, that is all there is to using the <strong>NetworkCredential<\/strong> object. Join me tomorrow when I will talk about more cool Windows PowerShell stuff.<\/p>\n<p>I 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=\"mailto: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: Microsoft Scripting Guy, Ed Wilson, shows how to easily decrypt the Windows PowerShell secure string password. &nbsp;Hey, Scripting Guy! We have an FTP site that I have to use on a regular basis. I need an easy way to get a credential and use that credential with the FTP site so that I can [&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":[421,3,63,45],"class_list":["post-3949","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scripting","tag-passwords","tag-scripting-guy","tag-security","tag-windows-powershell"],"acf":[],"blog_post_summary":"<p>Summary: Microsoft Scripting Guy, Ed Wilson, shows how to easily decrypt the Windows PowerShell secure string password. &nbsp;Hey, Scripting Guy! We have an FTP site that I have to use on a regular basis. I need an easy way to get a credential and use that credential with the FTP site so that I can [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/3949","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=3949"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/posts\/3949\/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=3949"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/categories?post=3949"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/scripting\/wp-json\/wp\/v2\/tags?post=3949"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}