Назад | Перейти на главную страницу

Powershell для добавления пользователей в группу

Я написал этот бит PS, чтобы добавлять пользователей из текстового файла в группу AD, которую вводит пользователь. Работает нормально, кроме if заявление. Оператор if должен проверять группу, чтобы увидеть, являются ли пользователи в текстовом файле уже членами группы. Так что $item переменная инициализируется с помощью jdoe, а $member переменная инициализируется так:

$member=Get-ADGroupMember -identity $group | select SamAccountName

Проблемный член будет инициализирован с помощью @{SamAccountName=JDoe}, @{SamAccountName=bsmith}и т. д. По сути, все участники одним махом инкапсулируют дополнительные данные, таким образом скрывая данные, используемые для сравнения. Вот мой код целиком. Буду признателен за любую помощь. Спасибо

#User input group name
$group=read-host -prompt "Enter group name:"

#Loop through each item in text file
foreach ($item in Get-Content C:\addusers.txt) {
    #If user is already a member of group...
    $member = Get-ADGroupMember -identity $group | select SamAccountName
    if ($member -eq $item) {
         Write-Host $item "is already a member of" $group
    }

    #add to group
    Add-ADGroupMember -Identity $group -Member $item
}

Первая проблема - это ваше сравнение. Строка, которая присваивает значение $ member, возвращает список, а не отдельный элемент. Таким образом, вы в основном спрашиваете в тесте, «равен ли этот большой список одному элементу». Это условие никогда не будет истинным, за исключением, возможно, того, что в группе есть только один член (я не уверен, получите ли вы в этом случае один элемент или объект массива с одним членом).

Вторая проблема заключается в том, что вы ничего не делаете с результатами этого теста - вы все равно запускаете добавление группы, даже если пользователь уже находится в группе (при условии, что ваш тест был написан правильно). Зачем?

Он также имеет много накладных расходов, так как он будет запускать этот дамп содержимого группы каждый раз, когда вы его запускаете. Лучше было бы получить членов группы один раз, вне цикла foreach, а затем использовать поиск по массиву в этом списке внутри цикла foreach. Это не беспокоит, но, возможно, стоит исправить.

PS - вы можете добавить пользователя в группу, даже если он уже является участником группы. Так что вы можете вообще удалить это сравнение:

foreach ($user in get-content $userspath) {
    Add-ADGroupMember -Identity $group -Member $user
}

Изменить: если вы все еще хотите найти члена в группе, вы можете сделать это так:

$u = get-aduser $user -properties "memberof"
if ($u.memberOf -contains (get-adgroup $group) ) 
    ...