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

Modify ADGroup if the Description of a User changes - Powershell

我对 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)) 也许我错了但我不知道该怎么做。

与其说是 PowerShell,不如说是 LDAP。 LDAP 查询不能接受数组。如果你想要 "description is one of these" 的等价物,那么你需要以这样的方式结束:

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

由于您使用的是不带通配符的 -like 运算符,因此使用 -like 不会给您带来任何好处。将单个值与集合进行比较时,您应该考虑使用 -in 运算符。但是,Containment Comparison Operators like -in and -contains are not supported in the -filter of the ActiveDirectory cmdlets. You are left with either iterating over your collections and using -filter comparing single values or relying on Where-Object 确实支持所有比较运算符。

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

$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