34

System.Security.SecureStringから読み取り可能なパスワードにパスワードをデコードしたいと思います。

$password = convertto-securestring "TestPassword" -asplaintext -force
$credentials = New-Object System.Net.NetworkCredential("TestUsername", $password, "TestDomain")

このコード部分は正常に機能します。$credentialsオブジェクトを使用できます。しかし、コードの後半で、読み取り可能な形式のパスワードが必要になります。メソッドには読み取り可能な文字列のパスワードが必要なためです。したがって、パスワードをデコードして戻す必要があります。

$ credentialsオブジェクトからパスワードをデコードするにはどうすればよいですか?

アップデート

動作しない:

$password = convertto-securestring "TestPassword" -asplaintext -force
$credentials = New-Object System.Net.NetworkCredential("TestUsername", $password, "TestDomain")

$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($credentials.password)
$result = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
[System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)
$result 
4

5 に答える 5

53

どうぞ:

$password = ConvertTo-SecureString 'P@ssw0rd' -AsPlainText -Force

$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($password)
$result = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
[System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)
$result 

P @ ssw0rd

于 2011-09-19T10:27:13.163 に答える
20

「System.Net.NetworkCredential」オブジェクトの場合、必要なのは文字列パスワードを読み取ることだけです。

$password = convertto-securestring "TestPassword" -asplaintext -force
$credentials = New-Object System.Net.NetworkCredential("TestUsername", $password, "TestDomain")
$credentials.Password
TestPassword

$credentials | gm

TypeName: System.Net.NetworkCredential

Name           MemberType Definition
----           ---------- ----------
Equals         Method     bool Equals(System.Object obj)
GetCredential  Method     System.Net.NetworkCredential GetCredential(uri uri, str
GetHashCode    Method     int GetHashCode()
GetType        Method     type GetType()
ToString       Method     string ToString()
Domain         Property   string Domain {get;set;}
Password       Property   string Password {get;set;}
SecurePassword Property   securestring SecurePassword {get;set;}
UserName       Property   string UserName {get;set;}

最終的にPSCredentialオブジェクトを使用する場合は、Get-Credentialのような対話型コマンドを使用します。

$credentials=Get-Credential
$credentials.GetNetworkCredential().UserName
TestUsername
$credentials.GetNetworkCredential().Domain
TestDomain
$credentials.GetNetworkCredential().Password
TestPassword

詳細については、 http://blogs.technet.com/b/heyscriptingguy/archive/2013/03/26/decrypt-powershell-secure-string-password.aspxを参照してください。

注:この例ではPS4を使用しました。

于 2015-01-29T21:20:04.447 に答える
7
($credentials.GetNetworkCredential()).Password
于 2014-02-05T12:01:20.897 に答える
5

詳細については、http://blogs.msdn.com/b/besidethepoint/archive/2010/09/21/decrypt-secure-strings-in-powershell.aspxで説明されています。

そして、私はそれを行うためのさらに別のわずかに異なる方法を持っています。

$pass=convertto-securestring "P@ssw0rd" -asplaintext -force  | ConvertFrom-SecureString
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR( (ConvertTo-SecureString $pass) ))

P @ ssw0rd

于 2013-11-13T09:56:13.623 に答える
2

上記のRobの投稿は、何らかの理由でうまくいきませんでした。別のサイトから回答を見つけました。

複数行のコードバージョン:

$password = ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force

$decrypted = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$decryptedPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($decrypted)
$decryptedPassword    # Outputs: P@ssw0rd

ワンライナーバージョン(変数に保存できます):

# Outputs: P@ssw0rd
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
于 2021-04-01T20:03:11.787 に答える