为来自不同域Powershell的多个成员添加ADGroupMember

为来自不同域Powershell的多个成员添加ADGroupMember,powershell,Powershell,我在添加来自不同域的多个用户时遇到问题: $nazwa = 'test' $lista = Import-CSV "\test.csv" ForEach ($user in $lista) {Add-ADGroupMember -Identity $nazwa -Members $user.username} 我可以键入端口,但主目录中没有所有内容,因此我使用SAMAccountName从其他域获取用户: Get-ADUser -Server "test.pl:3

我在添加来自不同域的多个用户时遇到问题:

$nazwa = 'test'
$lista = Import-CSV "\test.csv"
ForEach ($user in $lista)
{Add-ADGroupMember -Identity $nazwa -Members $user.username}
我可以键入端口,但主目录中没有所有内容,因此我使用SAMAccountName从其他域获取用户:

Get-ADUser -Server "test.pl:3268" -LDAPFilter "(SAMAccountName=$User.username)"
如何使用此带端口的域来正确创建ForEach。或者我必须单独搜索每个域吗

我必须单独搜索每个域吗

是的-但是您不必为每个用户查询每个域

LDAP的筛选器语法支持
|
(OR)子句,因此我们可以构造一个与任何相关用户名匹配的筛选器:

$filterClauses = $lista |ForEach-Object {
  "(SAMAccountName=$($_.username))"
}
$ldapFilter = "(|$(-join $filterClauses))"
现在,
$ldapFilter
字符串看起来像
(|(SAMAccountName=username1)(SAMAccountName=username2)(…)
,我们可以对每个域执行一次查询:

$userTable = @{}

foreach($domain in 'domain1.fqdn','domain2.fqdn','domain3.fqdn'){
    Get-ADUser -Server "$domain`:3268" -LDAPFilter $ldapFilter |ForEach-Object {
        $userTable[$_.SAMAccountName] = $_
    }
}
此时,我们可以将您的循环重写为:

foreach($user in $lista){
    if($userTable.ContainsKey($user.username)){
        Add-ADGroupMember -Identity $nazwa -Members $userTable[$user.username]
    }
    else {
        Write-Warning "No user with username $($user.username) was found!"
    }
}
我必须单独搜索每个域吗

是的-但是您不必为每个用户查询每个域

LDAP的筛选器语法支持
|
(OR)子句,因此我们可以构造一个与任何相关用户名匹配的筛选器:

$filterClauses = $lista |ForEach-Object {
  "(SAMAccountName=$($_.username))"
}
$ldapFilter = "(|$(-join $filterClauses))"
现在,
$ldapFilter
字符串看起来像
(|(SAMAccountName=username1)(SAMAccountName=username2)(…)
,我们可以对每个域执行一次查询:

$userTable = @{}

foreach($domain in 'domain1.fqdn','domain2.fqdn','domain3.fqdn'){
    Get-ADUser -Server "$domain`:3268" -LDAPFilter $ldapFilter |ForEach-Object {
        $userTable[$_.SAMAccountName] = $_
    }
}
此时,我们可以将您的循环重写为:

foreach($user in $lista){
    if($userTable.ContainsKey($user.username)){
        Add-ADGroupMember -Identity $nazwa -Members $userTable[$user.username]
    }
    else {
        Write-Warning "No user with username $($user.username) was found!"
    }
}

您的列表中有多少个用户名?你可以构造一个LDAP过滤器来查找其中的任何一个,然后你只需查询每个域一次。大约50个用户名显示在你的列表中?你可以构造一个LDAP过滤器来查找其中的任何一个,然后你只需要查询每个域一次。大约50个,有时更少