Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如何在自定义编写的PowerShell cmdlet中安全地处理密码?_C# 4.0_Powershell_Cmdlets - Fatal编程技术网

C# 4.0 如何在自定义编写的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

假设我有一个自定义PowerShell Cmdlet,可以导出数据并使用密码对其进行加密

[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 

一旦我有了密码,这就很有用了。你是怎么使用它的?我也有类似的问题。