我有一个调用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文件中调用它时,它不适用于上面的错误。
感谢
答案 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)
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
}