C# 4.0 如何在自定义编写的PowerShell cmdlet中安全地处理密码?
假设我有一个自定义PowerShell Cmdlet,可以导出数据并使用密码对其进行加密C# 4.0 如何在自定义编写的PowerShell cmdlet中安全地处理密码?,c#-4.0,powershell,cmdlets,C# 4.0,Powershell,Cmdlets,假设我有一个自定义PowerShell Cmdlet,可以导出数据并使用密码对其进行加密 [Cmdlet(VerbsData.Export, "SampleData")] public class ExportSampleData : PSCmdlet { [Parameter(Mandatory = true)] public string Password { get; set; } /* additional par
[Cmdlet(VerbsData.Export, "SampleData")]
public class ExportSampleData : PSCmdlet
{
[Parameter(Mandatory = true)]
public string Password
{
get;
set;
}
/* additional parameters */
}
如何适当地安全地处理密码?例如,我想防止管理员在控制台中键入值时显示该值。其他选项包括读取包含加密密码的文件
[Cmdlet(VerbsData.Export, "SampleData")]
public class ExportSampleData : PSCmdlet
{
[Parameter(Mandatory = true)]
public string Password
{
get;
set;
}
/* additional parameters */
}
我知道PSCredential,但它需要用户名,在这种情况下没有任何意义。如果您只想获得密码,可以使用
Read-Host
cmdlet和–asSecureString
参数
此参数屏蔽输入。您可以找到一种使用计算机密码加密的方法(在安全机器上工作)
使用@Christian response,您可以将密码放入磁盘,如下所示:
PS > $cred.Password | ConvertFrom-SecureString | Set-Content c:\temp\password.txt
并用以下内容检索:
$password = Get-Content c:\temp\password.txt | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PsCredential "UserName",$password
将密码参数的类型更改为SecureString;如果管理员省略了-Password参数,PowerShell将通过提示管理员输入必需参数并在键入时显示Astrisk来做正确的事情 理想情况下,cmdlet的实现会将SecureString传递给某些本机支持SecureString(最安全)的API;如果没有,则必须从SecureString中提取密码。这里有一篇很好的文章介绍如何做到这一点:如果您正在编写C#PowerShell Cmdlet,并且其中一个参数要求用户输入密码,则应该对其进行模糊处理 要做到这一点,您需要
使用System.Security代码>
然后您的参数类型应该是SecureString
以你的例子来说:
[Cmdlet(VerbsData.Export, "SampleData")]
public class ExportSampleData : PSCmdlet
{
[Parameter(Mandatory = true)]
public SecureString Password
{
get;
set;
}
/* additional parameters */
}
SecureString处理让您感觉更加安全,即使情况并非如此。您可以像这样轻松地加密任何SecureString
$mrsh = [System.Runtime.InteropServices.Marshal]
$ptr = $mrsh::SecureStringToBSTR($secureString)
$pass = $mrsh::PtrToStringAuto($ptr)
$cred = Get-Credential
$web = [Net.WebClient]::new()
$web.Credentials = [System.Net.NetworkCredential]::new($cred.UserName,$cred.Password)
$pass = $web.Credentials.Password
或者,即使没有编组,也只需要像这样的webclient对象
$mrsh = [System.Runtime.InteropServices.Marshal]
$ptr = $mrsh::SecureStringToBSTR($secureString)
$pass = $mrsh::PtrToStringAuto($ptr)
$cred = Get-Credential
$web = [Net.WebClient]::new()
$web.Credentials = [System.Net.NetworkCredential]::new($cred.UserName,$cred.Password)
$pass = $web.Credentials.Password
因此,总之,密码和SecureString密码都不应永久存储为文件或其他任何内容。一生
尽可能短的信息,例如,从输入密码到清除密码变量及其所有继承变量,如下所示:
Remove-Variable pass, cred, web -ea 0
一旦我有了密码,这就很有用了。你是怎么使用它的?我也有类似的问题。