我正在通过 PowerShell 运行空间在 C# 中执行我的 PowerShell 脚本。我们将凭证包装在凭证对象中。但是,当我们编写以下语句时,密码就会暴露。
$Credential = Get-Credential
$Password = $credential.GetNetworkCredential().Password
这里 $Password 将有明文密码,我想防止用户编写任何旨在从凭据对象检索密码的语句
我能想到的一种方式是,在执行脚本之前扫描脚本文本,如果发现这样的语句,我会报告。在 native PowerShell 或任何其他方式中是否有更好的方法来实现这一目标?
最佳答案
使用 Get-Credential
cmdlet 捕获 PsCredential
后:
$Credential = Get-Credential
$Credential
变量有两个属性:
用户名
密码
Password
属性的类型是SecureString
:
$Credential.Password.GetType() --> SecureString
所以它是加密的。现在我们可以使用这两个 cmdlet 将密码传输/保存为普通字符串,而不会泄露实际密码:
ConvertFrom-SecureString
ConvertTo-SecureString
假设我们在 Get-Credential
弹出窗口后向提示提供了 myuser
用户名和 mypassword
密码。
下面会将密码转换为加密的 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)
希望这就是您所追求的。
关于c# - 防止密码泄露(GetNetworkCredential 方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55700896/