在 powershell Invoke-Expression 中使用 cmd 管道
Using cmd pipe in the powershell Invoke-Expression
我正在尝试使用 powershell
从特定的 Organization Unit
获取 Active Directory
的所有电子邮件和用户名。这是我的代码:
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 failed:Value for 'Target object for this command' has incorrect
format. type dsget /? for help.
我能做什么?
正如上面评论中所指出的,使用 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 的服务器版本上:
Import-Module ServerManager
Add-WindowsFeature RSAT-AD-PowerShell
如果您要做的只是来自 Active Directory 的电子邮件和用户名,ActiveDirectory
模块中包含的 Get-ADUser
是首选途径。
-SearchBase
将允许您确定要开始的 OU 的范围。您需要使用 -Properites
指定要包含在 Get-ADUser
中的属性。 Select
将仅显示您希望使用的属性。
以下示例将获取所有用户的用户名 (samaccountname) 和主要电子邮件地址:
Get-ADUser -filter * -Properties SamaccountName, mail -SearchBase "DC=domain,DC=local" | Select SamaccountName, Mail
我正在尝试使用 powershell
从特定的 Organization Unit
获取 Active Directory
的所有电子邮件和用户名。这是我的代码:
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 failed:Value for 'Target object for this command' has incorrect format. type dsget /? for help.
我能做什么?
正如上面评论中所指出的,使用 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 的服务器版本上:
Import-Module ServerManager
Add-WindowsFeature RSAT-AD-PowerShell
如果您要做的只是来自 Active Directory 的电子邮件和用户名,ActiveDirectory
模块中包含的 Get-ADUser
是首选途径。
-SearchBase
将允许您确定要开始的 OU 的范围。您需要使用 -Properites
指定要包含在 Get-ADUser
中的属性。 Select
将仅显示您希望使用的属性。
以下示例将获取所有用户的用户名 (samaccountname) 和主要电子邮件地址:
Get-ADUser -filter * -Properties SamaccountName, mail -SearchBase "DC=domain,DC=local" | Select SamaccountName, Mail