3

我有一个调用 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:无法绑定参数“密码”。无法将“System.String”类型的“System.Security.SecureString”值转换为“System.Security.SecureString”类型。在 line:1 char: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 文件中调用它时,它不适用于上面的错误。

谢谢

4

3 回答 3

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

我希望这有帮助。

于 2015-01-04T12:14:13.650 回答
0

我不需要

调用表达式

部分代码

这工作得很好

连接设备 -host $host -user $user -Password $passwordenc -Quiet

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

于 2014-12-23T19:06:05.770 回答
0

anoopb,我以前遇到过同样的问题。更多仅供参考,但本质上是包含在函数中的答案:

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

}
于 2015-02-02T04:46:26.770 回答