2014-12-23 2 views
3

У меня есть функция, которая вызывает командлет,не передать SecureString моего командлету

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 

Но по какой-то причине, я продолжаю работает в этом вопросе

Connect-Appliance: Невозможно привязать параметр 'Password'. Невозможно преобразовать значение «System.Security.SecureString» типа «System.String» в типа «System.Security.SecureString». В строке: 1 char: 69 + Connect-Appliance -host 172.25.2.110 -user admin -Password System.Secur ... + ~~~~~~~~~~~~ + Категория: 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, он не работает с ошибкой выше.

благодаря

ответ

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

я не нуждался в

Invoke-Expression

часть в коде

Это работало просто отлично

замыкающийся прибор -host $ хозяина -user $ пользователя -Password $ passwordenc -QUIET

Поскольку я не захватывая выход, я не нуждался в Invoke-Expression

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 

} 
Смежные вопросы