Измените ADGroup, если описание пользователя меняется - Powershell - PullRequest
0 голосов
/ 17 октября 2019

Я все еще довольно новичок в 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 = $ Desferences))) возможно я не прав, но я понятия не имею, как это сделать.

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Поскольку вы используете оператор -like без символов wilcard, вы не получите никакой выгоды от использования -like. При сравнении одного значения с коллекцией следует рассмотреть использование оператора -in. Однако операторы сравнения содержания , такие как -in и -contains, не поддерживаются в -filter командлетов ActiveDirectory. Вам остается либо перебирать свои коллекции и использовать -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
0 голосов
/ 17 октября 2019

Это больше о LDAP, чем PowerShell. Запросы LDAP не могут принимать массив. Если вы хотите, чтобы «описание было одним из них», то вам нужно получить что-то вроде этого:

(|(description=Supporter)(description=System Eng)(description=etc.))

Обратите внимание на | для «ИЛИ».

Чтобы сделать это из вашего массива, вы можете использовать оператор -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}
...