如果用户描述发生更改,则修改 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
我对 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