在Powershell Invoke-Expression中使用cmd管道

时间:2018-10-23 15:22:14

标签: powershell cmd active-directory dsquery

我正在尝试使用Active Directory从特定的Organization Unit获取powershell的所有电子邮件和用户名。这是我的代码:

function Invoke-CmdCommand {
    Param(
        [parameter(position = 0)]
        $Cmd , 
        [parameter(position = 1)]
        $RunFolder = $PSScriptRoot
    )
    try {
        $cmdToRun = "cmd /c cd `"$RunFolder`" `"&`" $Cmd";
        Write-Host "$RunFolder> $Cmd";
        Invoke-Expression "& $($cmdToRun.Replace("^","^^"))";
    }
    catch {
        Write-Error "********** Function $($MyInvocation.MyCommand.Name) failed **********";
        Write-Error $_.Exception.Detail.InnerText;
        exit 1;
    }
}


$cmd = "dsquery user `"OU=Disabled Users,DC=microfinancial,DC=com`" -limit 10000 | dsget user -samid -email"

$test = Invoke-CmdCommand -Cmd $cmd

我遇到以下错误:

  

dsget失败:“此命令的目标对象”的值不正确   格式。输入dsget /?寻求帮助。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

正如上面的评论所指出的,使用Get-ADUser会更好。这将为您提供一系列仅包含用户名和电子邮件地址的对象:

Import-Module ActiveDirectory
Get-ADUser -Filter * -SearchBase "OU=Disabled Users,DC=microfinancial,DC=com" `
    -Properties SamAccountName,EmailAddress `
  | Select-Object SamAccountName,EmailAddress

如果Import-Module ActiveDirectory对您不起作用,请安装RSAT(假设您使用的是Windows 10):https://www.microsoft.com/en-ca/download/details.aspx?id=45520

或者,如果您正在Windows的Server版本上运行它,

Import-Module ServerManager
Add-WindowsFeature RSAT-AD-PowerShell

答案 1 :(得分:1)

如果您要做的只是来自Active Directory的电子邮件和用户名,则Get-ADUser模块中包含的ActiveDirectory是首选路由。

-SearchBase将允许您确定要开始使用的OU的范围。您将需要使用Get-ADUser指定要包含在-Properites中的属性。 Select将仅显示您要使用的属性。

以下示例将获取所有用户的用户名(samaccountname)和主电子邮件:

Get-ADUser -filter * -Properties SamaccountName, mail -SearchBase "DC=domain,DC=local" | Select SamaccountName, Mail