我对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}