我对PowerShell相当陌生,我正在尝试完成以下任务:
我有一个PS命令,使用Get-ADUser
从AD获取用户,并在部门中过滤。
然后,我使用Get-DistributionGroupMember
从特定通讯组获取另一批用户。
Get-ADuser
输出为:
- John
- 琳 达
- 戴夫
- 弗兰克
Get-DistributionGroupMember
输出为:
- John
- 琳 达
- 戴夫
- 罗伯特
- 莱恩
我要做的是查看通过Get-ADUser
获得的所有用户是否与通讯组成员相同。
如果Get-ADUser
输出中有不在通讯组中的用户,我希望将其添加到通讯组中。因此,在这种情况下,必须使用Add-DistributionGroupMember将Frank添加到通讯组。
我要做的第二件事是从通讯组中删除成员,如果他们在组中但不在Get-ADUser
输出中。因此,在这种情况下,必须使用Remove-DistributionGroupMember
从分发组中删除Robert & Ryan。
我正在考虑清空通讯组并用Get-ADUser
命令中的数据重新填充它,但应该有更好的方法来完成上述方案,而无需实际清除通讯组对吗?我不想冒着人们在我的脚本清除通讯组时使用通讯组的风险。
这是我用来清除组并重新填充它的方法:
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn
$users = Get-ADUser -Filter * -Properties Department | Where-Object {$_.Department -eq "ICT"} | Select-Object sAMAccountName
$group = "DG_ICT"
Get-DistributionGroupMember $group | Remove-DistributionGroupMember $group -Confirm:$False
foreach($u in $users) { Add-DistributionGroupMember -Identity $group -Member $u.sAMAccountName }
我只是不知道足够的PowerShell atm来思考在不清空组的情况下执行此操作的正确方法,因此任何帮助将不胜感激...
谢谢!
我解决这个问题的方法是利用Compare-Object
。
在通讯组中添加和删除成员时,不需要进行交换。您可以通过 AD 控制成员资格。
以下示例应使您朝着正确的方向开始:
#get users
$users = Get-ADUser -Filter {Darpartment -like "*"}
#get group object
$group = Get-ADGroup -Filter {Name -eq ".TEST Group"} -Properties Members
#compare by DN
$compare = Compare-Object $users.distinguishedName $group.members
#users not in group
$notInGroup = ($compare | Where-Object {$_.SideIndicator -eq "<="}).InputObject
#users in group
$notInGetAD = ($compare | Where-Object {$_.SideIndicator -eq "=>"}).InputObject
#Add to group -- only if true
if($notInGroup)
{
$group | Add-ADGroupMember -Members $notInGroup -Confirm:$false
}
#remove from group -- only if true
if($notInGetAD)
{
$group | Remove-ADGroupMember -Members $notInGetAD -Confirm:$false
}