如果用户的描述发生更改,请修改 ADGroup - Powershell



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

加:

$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
}

我想错误就在这里"(&(!描述=$Descriptions((也许我错了,但我不知道该怎么做。

由于您使用的-like运算符没有 wilcard 字符,因此使用-like没有任何好处。将单个值与集合进行比较时,应考虑使用-in运算符。但是,在 ActiveDirectory cmdlet 的-filter中不支持包含比较运算符(如-in-contains(。您只能循环访问集合并使用-filter比较单个值,或者依赖于 Where-Object,它确实支持所有比较运算符。

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

它更多的是关于LDAP而不是PowerShell。LDAP 查询不能接受数组。如果你想要等效的"描述是其中之一",那么你将需要这样的东西结束:

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

请注意"OR"的|

要从数组中执行此操作,您可以使用-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}

最新更新