【问题标题】:I can't seem to pass a securestring to my cmdlet我似乎无法将安全字符串传递给我的 cmdlet
【发布时间】:2015-02-02 12:46:26
【问题描述】:

我有一个调用 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”。在行: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 文件中调用它时,它不适用于上面的错误。

谢谢

【问题讨论】:

    标签: powershell-3.0 securestring


    【解决方案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
    

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我不需要

      调用表达式

      部分代码

      效果很好

      连接设备 -host $host -user $user -Password $passwordenc -安静

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

      【讨论】:

        【解决方案3】:

        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
        
        }
        

        【讨论】:

          猜你喜欢
          • 2012-06-13
          • 1970-01-01
          • 2012-03-07
          • 2019-02-05
          • 1970-01-01
          • 2018-10-29
          • 1970-01-01
          • 2021-05-01
          • 1970-01-01
          相关资源
          最近更新 更多