在 PowerShell 中清理 DistributionGroup
Cleaning up DistributionGroup in PowerShell
我是 PowerShell 的新手,我正在努力完成以下任务:
我有一个 PS 命令可以使用 Get-ADUser
从 AD 中获取用户,并且它是按部门过滤的。
然后我使用 Get-DistributionGroupMember
从特定的 DistributionGroup 获取另一批用户。
Get-ADuser
输出为:
- 约翰
- 琳达
- 戴夫
- 弗兰克
Get-DistributionGroupMember
输出为:
- 约翰
- 琳达
- 戴夫
- 罗伯特
- 瑞安
我想做的是查看通过 Get-ADUser
获得的所有用户是否与 DistributionGroup 成员相同。
如果 Get-ADUser
输出中有不在 DistributionGroup 中的用户,我想将他们添加到组中。因此,在这种情况下,必须使用 Add-DistributionGroupMember.
将 Frank 添加到 DistributionGroup
我想做的第二件事是从 DistributionGroup 中删除成员,如果他们在组中但不在 Get-ADUser
输出中。因此,在这种情况下,Robert & Ryan 必须使用 Remove-DistributionGroupMember
.
从 DistributionGroup 中删除
我正在考虑清空 DistributionGroup 并用 Get-ADUser
命令中的数据重新填充它,但是应该有更好的方法来完成上述场景而不必实际清除 DistributionGroup 对吗?我不想冒险让人们在我的脚本清除它时使用 DistributionGroup。
这是我用来清除组并重新填充它的方法:
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
}
我是 PowerShell 的新手,我正在努力完成以下任务:
我有一个 PS 命令可以使用 Get-ADUser
从 AD 中获取用户,并且它是按部门过滤的。
然后我使用 Get-DistributionGroupMember
从特定的 DistributionGroup 获取另一批用户。
Get-ADuser
输出为:
- 约翰
- 琳达
- 戴夫
- 弗兰克
Get-DistributionGroupMember
输出为:
- 约翰
- 琳达
- 戴夫
- 罗伯特
- 瑞安
我想做的是查看通过 Get-ADUser
获得的所有用户是否与 DistributionGroup 成员相同。
如果 Get-ADUser
输出中有不在 DistributionGroup 中的用户,我想将他们添加到组中。因此,在这种情况下,必须使用 Add-DistributionGroupMember.
我想做的第二件事是从 DistributionGroup 中删除成员,如果他们在组中但不在 Get-ADUser
输出中。因此,在这种情况下,Robert & Ryan 必须使用 Remove-DistributionGroupMember
.
我正在考虑清空 DistributionGroup 并用 Get-ADUser
命令中的数据重新填充它,但是应该有更好的方法来完成上述场景而不必实际清除 DistributionGroup 对吗?我不想冒险让人们在我的脚本清除它时使用 DistributionGroup。
这是我用来清除组并重新填充它的方法:
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
}