ConvertTo-SecureString在不同的用户帐户上运行时没有密钥,有没有办法(有适当的凭据)让这个工作从不同的用户?

时间:2017-09-01 19:15:39

标签: powershell encryption

我有一个可以访问所有帐户的完全访问权限的虚拟机。我在下面的问题都是在相同的计算机上运行,​​只是在不同的用户帐户下运行。

如果我使用domain\user1登录并运行以下PowerShell以生成SecureString的字符串:

$SecurePassword = "ThisIsATest" | ConvertTo-SecureString -AsPlainText -Force

$RawSecureString = $SecurePassword | ConvertFrom-SecureString

Write-Host $RawSecureString

所以输出如下:

  

$RawSecureString = "01000000d08c9ddf0115d1118c7a00c04fc297eb0100000014c54a4678625849adf32615ece5d33f000000000200000000001066000000010000200000007ece54f23781b598d0341c2380e678bc6286222186717e612e0f095b3edc4137000000000e80000000020000200000006b68df76dbc98fcd35943be7818c80ed502ec49d0ae06deeec183367ea19e10d200000002087d6178d6a67165d41ed172e11eae6bf7d648a59d25c01dd573baaad985bb040000000adc87d779c7de9d1565bcb834e50214e982c133c3558111138a2e1964b599d1bcb7b4583ff18d314f7bc6a0549bf03342a49ba2456cc13df60585ca36125ae37"

使用domain\user1我运行以下内容:

$SecureString = $RawSecureString | ConvertTo-SecureString
[System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($SecureString))

,输出为ThisIsATest,这很好。

如果我以domain\user2身份登录并运行以下内容:

$RawSecureString = "01000000d08c9ddf0115d1118c7a00c04fc297eb0100000014c54a4678625849adf32615ece5d33f000000000200000000001066000000010000200000007ece54f23781b598d0341c2380e678bc6286222186717e612e0f095b3edc4137000000000e80000000020000200000006b68df76dbc98fcd35943be7818c80ed502ec49d0ae06deeec183367ea19e10d200000002087d6178d6a67165d41ed172e11eae6bf7d648a59d25c01dd573baaad985bb040000000adc87d779c7de9d1565bcb834e50214e982c133c3558111138a2e1964b599d1bcb7b4583ff18d314f7bc6a0549bf03342a49ba2456cc13df60585ca36125ae37"
$SecureString = $RawSecureString | ConvertTo-SecureString
[System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($SecureString))

我得到Key not valid for use in specified state.,因为它是不同的用户。

由于user1加密期间没有提供密钥,我的问题是,如果我有权访问这两个登录帐户,是否有办法从user2解密此安全字符串?

原因是我有很多虚拟机,其中密钥作为本地管理员帐户存储在注册表中,而我所做的大部分工作都来自远程域帐户。

1 个答案:

答案 0 :(得分:1)

是的,但您必须重新创建SecureStrings。

ConvertTo-SecureString加密的字符串只能由默认加密它们的同一台计算机和用户帐户解密。

您可以使用-Key参数来解决此问题。 From the helpful folks at PDQ

您可以像这样创建一个AES密钥:

$KeyFile = "C:\AES.key"
$Key = New-Object Byte[] 16   # You can use 16 (128-bit), 24 (192-bit), or 32 (256-bit) for AES
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($Key)
$Key | Out-File $KeyFile

创建新的SecureString对象:

$PasswordFile = "C:\Password.txt"
$KeyFile = "C:\AES.key"
$Key = Get-Content $KeyFile
$Password = "P@ssword1" | ConvertTo-SecureString -AsPlainText -Force
$Password | ConvertFrom-SecureString -key $Key | Out-File $PasswordFile

在另一台计算机或用户上创建PSCredential对象:

$User = "MyUserName"
$PasswordFile = "C:\Password.txt"
$KeyFile = "C:\AES.key"
$key = Get-Content $KeyFile
$MyCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $PasswordFile | ConvertTo-SecureString -Key $key)

获得AES.key文件的任何人都可以解密SecureString对象,所以请注意它![/ p>