Powershell将Object和String传递给invoke-expression

时间:2016-04-14 10:43:22

标签: powershell

我正在尝试使用Invoke-Expression将对象和字符串变量传递给“Get-ADUser”命令行开关。

凭据的构建方式如下:

$secpasswd = ConvertTo-SecureString $pwd -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($uid, $secpasswd)

然后一个字符串由其他参数组成:

if ($dc)
{
    $newVar = " -server $dc"
}

if ($ou) 
{
    $newVar = $newvar + " -Serchbase $ou"
 }

最后执行以下内容

$AllADUsers = iex "Get-ADUser $newVar -Credential $($mycreds) -Filter * -Properties *"    | Where-Object {$_.info -NE 'Migrated'}

但如果我点击确定

,则会显示凭据对话框并出现错误

Get-ADUser:无法验证参数'Credential'的参数。参数为null或空。提供非null或空的参数,然后再次尝试该命令。 在行:1字符:54 + Get-ADUser -server srv-v-hh001.bwg.corp -Credential System.Management.Automatio ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo:InvalidData :( :) [Get-ADUser],ParameterBindingValidationException     + FullyQualifiedErrorId:ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.GetADUser

我认为这是因为iex将$ mycreds解析为字符串,有没有办法告诉Powershell这是一个对象?

1 个答案:

答案 0 :(得分:0)

为什么你需要IEX?使用哈希表为Get-ADUser构建参数,然后只为splat构建参数:

$secpasswd = ConvertTo-SecureString $pwd -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($uid, $secpasswd)

$Splat = @{
    Credential = $mycreds
    Filter = '*'
    Properties = '*'
}

if ($dc)
{
    $Splat.Server = $dc
}

if ($ou) 
{
    $Splat.SearchBase = $ou
}

$AllADUsers = Get-ADUser @Splat | Where-Object {$_.info -NE 'Migrated'}

顺便说一句,您的SearchBase参数名称中有拼写错误。