2014-12-23 72 views
3

我有它調用cmdlet的我似乎無法爲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被供給,然後在下面的小命令的變化被稱爲

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

但由於某些原因,我一直運行到這個問題

連接家電:無法綁定參數「密碼」。無法將 類型爲「System.String」的「System.Security.SecureString」值轉換爲 類型「System.Security.SecureString」。在線:1 char:69 + Connect-Appliance -host 172.25.2.110 -user admin -Password System.Secur ... + ~~~~~~~~~~~~ + CategoryInfo:InvalidArgument:(: )[連接家電],ParameterBindingException + FullyQualifiedErrorId:CannotConvertArgumentNoMessage,CPowerCLI.ConnectAppliance

而且我想不通爲什麼。起初,我認爲這是因爲我提供了一個字符串,但該變量被聲明爲SecureString。

可以做到這一點嗎?

什麼我能做的就是

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

這似乎工作得很好。但是當我從psm1文件中調用它時,它不適用於上面的錯誤。

感謝

回答

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 

我希望這會有所幫助。

0

我並不需要

調用,表達

部分代碼

這工作就好

連接 - 器具-host $主機-user $用戶-Password $ passwordenc -Quiet

由於我沒有捕獲它的輸出,我並不需要調用,表達

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 

} 
相關問題