0

我对powershell还是很陌生。我现在有创建每周更新的组/邮件分发的命令。它查找用户的描述。我有一个 Arraylist,其中列出了应该在其中的所有描述。添加用户不是问题,但我还希望如果某人的描述发生变化,他会从组中删除。我从这里尝试了一些示例,但它不起作用。我很高兴每一个答案。

添加:

$Descriptions =  @("Supporter","System Eng", "etc.","etc.")
Foreach($Description in $Descriptions){
$user = Get-ADUser -Filter * –SearchBase "OU=Int,OU=user,OU=1,DC=test,DC=me,DC=nl" -properties *| Where-Object {$_.Description -like $Description}
$group = Get-ADGroup "CN=testgroup,OU=Dirs,OU=Global,OU=group,OU=1,DC=test,DC=me,DC=nl"

Add-ADGroupMember $group -Members $user

}

消除:

$groupname = 'testgroup'
$members = Get-ADUser -LDAPFilter "(&(!(description=$Descriptions))(memberOf=CN=testgroup,OU=Dirs,OU=Global,OU=group,OU=1,DC=test,DC=me,DC=nl))"

foreach($member in $members)
{
    Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname-Confirm:$false
}

我想错误在这里“(&(!(description = $Descriptions))也许我错了,但我不知道该怎么做。

4

2 回答 2

0

它更多地是关于 LDAP 而不是 PowerShell。LDAP 查询不能接受数组。如果您想要“描述是其中之一”的等价物,那么您最终需要得到这样的结果:

(|(description=Supporter)(description=System Eng)(description=etc.))

请注意|“或”。

要从您的数组中执行此操作,您可以使用-join运算符:

$members = Get-ADUser -LDAPFilter "(&(!(|(description=$(($Descriptions -join ')(description=')))))(memberOf=CN=testgroup,OU=Dirs,OU=Global,OU=group,OU=1,DC=test,DC=me,DC=nl))"

关于添加用户的代码:它可以工作,但是-like因为您的匹配字符串没有任何通配符,所以这是不必要的。您可以-eq改用,这将节省一点处理能力。你可能甚至没有注意到它。

Where-Object {$_.Description -eq $Description}
于 2019-10-17T12:49:26.497 回答
0

由于您使用的-like运算符没有通配符,因此您不会从使用-like. 将单个值与集合进行比较时,应考虑使用-in运算符。但是,ActiveDirectory cmdlet中不支持包含比较运算符。你要么迭代你的集合并使用比较单个值,要么依赖Where-Object,它支持所有的比较运算符。-in-contains-filter-filter

Get-ADGroupMember和Remove -ADGroupMember -Members参数支持数组。如果您创建要添加或删除的用户数组,则可以使用一个命令执行添加/删除。

$Descriptions =  @("Supporter","System Eng", "etc.","etc.")
$group = Get-ADGroup "CN=testgroup,OU=Dirs,OU=Global,OU=group,OU=1,DC=test,DC=me,DC=nl"

$UsersToAdd = Get-ADUser -Filter "MemberOf -ne '$($group.DistinguishedName)'" –SearchBase "OU=Int,OU=user,OU=1,DC=test,DC=me,DC=nl" -properties MemberOf,Description |
    where Description -in $Descriptions
$UsersToRemove = Get-ADUser -Filter "MemberOf -eq '$($group.DistinguishedName)'" -properties MemberOf,Description |
    where Description -notin $Descriptions

Add-ADGroupMember $group -Members $UsersToAdd
Remove-ADGroupMember $group -Members $UsersToRemove

-Properties开关确实允许您有选择地选择要显示的属性(多个属性的数组格式和单个属性的字符串格式)。我不建议使用*,因为这会增加查询和数据检索期间对系统的资源需求。

注意:该解决方案假定您的$Descriptions数组包含您希望在用户对象上看到的确切描述。


如果$Descriptions包含要匹配的部分字符串-match,则可以选择使用运算符。而不是一个数组,只需创建一个分隔(由 分隔|)字符串。

$Descriptions =  "Supporter|System Eng|etc\."
$group = Get-ADGroup "CN=testgroup,OU=Dirs,OU=Global,OU=group,OU=1,DC=test,DC=me,DC=nl"

$UsersToAdd = Get-ADUser -Filter "MemberOf -ne '$($group.DistinguishedName)'" –SearchBase "OU=Int,OU=user,OU=1,DC=test,DC=me,DC=nl" -properties MemberOf,Description |
    where Description -match $Descriptions
$UsersToRemove = Get-ADUser -Filter "MemberOf -eq '$($group.DistinguishedName)'" -properties MemberOf,Description |
    where Description -notmatch $Descriptions

Add-ADGroupMember $group -Members $UsersToAdd
Remove-ADGroupMember $group -Members $UsersToRemove
于 2019-10-17T13:07:07.060 回答