我似乎无法将一个securestring传递给我的cmdlet

时间:2014-12-23 18:02:03

标签: powershell-v3.0 securestring

我有一个调用cmdlet的函数

Function connect-app([string]$host, [string]$user, [SecureString]$password, [switch]$passwordfile, [switch][alias("q")]$quiet)

在此功能内部,我检查了是否提供了$passwordfile$password

if ( -Not $passwordfile -and ($password -eq $null -or $password -eq "")) 
{
    # prompt for a password
    [SecureString]$passwordenc = Read-Host -AsSecureString "Password";
} 
else 
{
    $hash = Hash($host + "-" + $user);
    [SecureString]$passwordenc = Get-Content "$env:USERPROFILE\$hash" | ConvertTo-SecureString;
}

最终,如果提供$quiet,则下面的cmdlet的变体称为

$expression = "Connect-Appliance -host " + $host + " -user " + $user + " -Password " + $passwordenc  + " -Quiet";
Invoke-Express $expression

但出于某种原因,我一直在讨论这个问题

  

Connect-Appliance:无法绑定参数'Password'。无法转换   “System.String”类型的“System.Security.SecureString”值   输入“System.Security.SecureString”。在线:1字符:69   + Connect-Appliance -host 172.25.2.110 -user admin -Password System.Secur ...   + ~~~~~~~~~~~~       + CategoryInfo:InvalidArgument:(:) [Connect-Appliance],ParameterBindingException       + FullyQualifiedErrorId:CannotConvertArgumentNoMessage,CPowerCLI.ConnectAppliance

我无法弄清楚原因。我首先想到的是,因为我提供了一个字符串,但该变量被声明为SecureString。

是否可以这样做?

我能做的是

$password = Read-Host -AsSecureString "Pass"
Connect-Appliance -host 172.25.2.110 -user admin -password $password -quiet

这似乎工作得很好。但是当我从psm1文件中调用它时,它不适用于上面的错误。

感谢

3 个答案:

答案 0 :(得分:1)

你应该将安全字符串转换回Bstring

$Password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($passwordenc))

Connect-Appliance -host 172.25.2.110 -user admin -password $password -quiet

我希望这会有所帮助。

答案 1 :(得分:0)

我不需要

  

调用-表达

参与代码

这很好用

  

Connect-Appliance -host $ host -user $ user -Password $ passwordenc   -Quiet

由于我没有捕获输出,所以我不需要Invoke-Expression

答案 2 :(得分:0)

anoopb,我以前遇到过同样的问题。更多的是一个FYI,但这里基本上是一个包含在函数中的答案:

function ConvertFrom-SecureToPlain {

        param(
            [Parameter(Mandatory=$true)][System.Security.SecureString] $SecurePassword
        )

        # Create a "password pointer"
        $PasswordPointer = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)

        # Get the plain text version of the password
        $PlainTextPassword = [Runtime.InteropServices.Marshal]::PtrToStringAuto($PasswordPointer)

        # Free the pointer
        [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($PasswordPointer)

        # Return the plain text password
        return $PlainTextPassword

}