我正在通过PowerShell运行空间在c#中执行PowerShell脚本。我们将凭证包装在凭证对象中。但是,当我们编写以下语句时,密码将公开。
$Credential = Get-Credential
$Password = $credential.GetNetworkCredential().Password
此处$ Password将具有纯文本形式的密码,我想防止用户编写任何旨在从凭据对象中检索密码的语句。
我可以想到的一种方法是,在执行脚本之前先扫描脚本文本,如果找到这样的语句,则报告。是否有更好的方法可以通过原生PowerShell 或任何其他方式来实现?
答案 0 :(得分:1)
一旦PsCredential
被Get-Credential
cmdlet捕获:
$Credential = Get-Credential
$Credential
变量具有两个属性:
Username
Password
Password
属性的类型为SecureString
:
$Credential.Password.GetType() --> SecureString
因此已加密。现在,我们可以使用这两个cmdlet将密码作为普通字符串传输/保存,而无需透露实际密码:
ConvertFrom-SecureString
ConvertTo-SecureString
假设我们在弹出myuser
之后向提示符提供了mypassword
用户名和Get-Credential
密码。
下面的代码会将密码转换为加密的String
对象:
$Credential.Password | ConverFrom-SecureString
#输出
01000000d08c9ddf0115d1118c7a00c04fc297eb01000000f9ae07907bbc82458b25fd92b2dae62e0000000002000000000003660000c000000010000000e1d56e48520215b461e09a24c53375660000000004800000a0000000100000008eeb7cf1234bac1806b5b624f4dcef0a18000000c8062d946ab9605dfcaaba9a20d7a7486c54010451c2dd0714000000ce000956b190d080f2c5eae9e159a78916d88e98
您现在可以将此输出保存到文件中,并在以后用Get-Content
读取,或将其保存到PowerShell
变量中:
$EncryptedPassword = $Credential.Password | ConverFrom-SecureString
您可以使用`ConvertTo-SecureString将普通的String
转换回SecureString
:
$Password = $EncryptedPassword | ConvertTo-SecureString
然后构造新的PsCredential
对象:
$CredentialNew = New-Object System.Management.Automation.PsCredential('myuser', $Password)
我希望这就是你的追求。
答案 1 :(得分:0)
为了清楚起见:$credential.GetNetworkCredential().Password
仅在注册密码的帐户下有效。
关于这个问题,你也可以问:
不要使用密码(又名 SecureString
类),但验证用户基于(帐户)的机制,例如single sign on。
引自SecureString shouldn't be used:
<块引用>处理凭证的一般方法是避免它们并且 而是依靠其他方式进行身份验证,例如证书或 Windows 身份验证。