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

Powershell 2: добавить несколько участников в группу рассылки одним звонком?

Предположим, у меня есть группа рассылки в Exchange, которая существует в настоящее время и насчитывает около 20 участников.

В Powershell 2 я получил список из семи сотня больше людей, которых нужно добавить в группу. Единственный способ сделать это - по одному пользователю за раз:

Add-DistributionGroupMember -Idneity GROUP-NAME -Member Member1
Add-DistributionGroupMember -Idneity GROUP-NAME -Member Member2
....
Add-DistributionGroupMember -Idneity GROUP-NAME -Member MemberN

Есть ли механизм, который позволяет мне добавлять всех пользователей одним вызовом функции, как это представлено в следующем псевдокоде?

SOME-CMDLET-TO-ADD-LOTS-AT-ONCE -Identity GROUP-NAME -Member COLLECTION-OF-PEOPLE

Я не ищу конструкции цикла. Я ищу функцию или командлет, которые могут добавлять всех членов сразу, в идеале принимая только один аргумент, ссылающийся на весь список. Боюсь думать, что Powershell будет делать с более чем 700 аргументами командной строки ...

(Я надеюсь, что, если это возможно, я смогу передать массив или коллекцию добавляемых объектов.)

Какие-либо предложения? Я не вижу команды под названием «set-distributiongroupmember», и я также не вижу ничего многообещающего в «set-distributiongroup».

Я не уверен, почему вы не хотите использовать конструкцию цикла; это своего рода одна из главных особенностей PS. Простой:

Import-CSV FileName.csv | ForEach {Add-DistributionGroupMember -Identity "GROUP-NAME" -Member $_.Name}

легко добьется цели. Однако в противном случае не будет командлета, который бы делал именно то, что вы хотите. Вы могли бы сделать

Remove-DistributionGroup GROUP-NAME; New-DistributionGroup -Name GROUP-NAME -Members memberlist

но это немного дрянно.

Успешно заполнили группу рассылки, создав текстовый файл, заполнив псевдонимами учетных записей участников, а затем выполнив команду:

% Get-Content <path\filename.txt> | Add-DistributionGroupMember "<Display Name of Distribution Group>"

См. Эти URL-адреса для получения дополнительной информации:

Попробуйте это, мне кажется, это работает:

Get-Content | Добавить-DistributionGroupMember

Текстовый файл просто содержит псевдонимы пользователей, которых вы хотите добавить.

Не понимаю, почему команды Microsoft сделали это так сложно. Иногда нужно просто думать.

"user1","user2","user3" | Add-DistributionGroupMember -Identity "SomeMailbox"

Я знаю, что это старый пост, но он по-прежнему занимает первое место в Google при попытке найти, как добавить нескольких пользователей в DL, поэтому я решил опубликовать свое решение.

Предыдущие решения будут работать нормально для небольшого списка пользователей, но, как указывалось в исходном плакате, при вызове возникают проблемы с производительностью и масштабированием. Add-DistributionGroupMember для каждого члена при больших изменениях членства, и это усугубляется при работе с O365.

Для решения этих проблем вы можете использовать Update-DistributionGroupMember для замены всех членов DL вместо добавления их по одному.

например для исходного запроса вы должны сделать это:

Update-DistributionGroupMember -Identity GroupName -Members user1@domain,user2@domain,usern@domain

или

Update-DistributionGroupMember -Identity GroupName -Members $ArrayOfMemberEmailAddresses

Это заменяет членство в DL, поэтому, если вы хотите сохранить существующее членство, вам нужно сначала получить его, используя Get-DistributionGroupMember затем создайте массив существующих и новых членов и передайте его Update-DistributionGroupMember вроде следующего:

$NewMembers = Get-Content <path to member list text file>
$CurrentMembers = (Get-DistributionGroupMember -Identity GroupName).PrimarySmtpAddress | where {$_ -ne ""}
$NewMemberList = $CurrentMembers + $NewMembers
Update-DistributionGroupMember -Identity GroupName -Members $NewMemberList -Confirm:$false

Наконец, если вы пытаетесь обновить членство в тонне списков рассылки в O365, как мне было нужно, вы можете добавить переключатель -AsJob в Update-DistributionGroupMember в вашем цикле, чтобы она запускала все обновления параллельно, а не дожидалась завершения каждого обновления членства, прежде чем двигаться дальше. Это значительно ускорит ваш скрипт, но не забудьте сначала прочитать об удаленном взаимодействии PowerShell и использовать задания, если вы еще не знакомы с ними, так как вам нужно будет выполнить дополнительную работу, чтобы получить результаты, проверьте на наличие ошибок и т. д.

Делая это таким образом вместо использования Add-DistributionGroupMemberуменьшил количество команд, отправляемых в O365 для миграции DL, с примерно 150 КБ до примерно 2,5 КБ и сократил время выполнения сценария с нескольких дней до вечера для миграции членства в 1200 DL.

Похоже, командлеты Quest Active Directory PowerShell могут добавлять нескольких пользователей в группу одновременно за один раз. эта страница вики. В моем кратком тестировании я смог использовать командлет Add-QADGroupMember для добавления небольшого массива пользователей в тестовую группу в Active Directory.

Также может быть полезно добавить AD следующим образом:

import-module ActiveDirectory

Тогда просто используйте:

Add-AdgroupMember MyList -member user.alias,user2.alias,user3.alias,...

Для этого вам необходимо установить RSAT (продукт MS, и бесплатно), иначе он не будет работать.

Если производительность является проблемой, Add-ADGroupMember на сегодняшний день является самым быстрым и, как уже упоминалось, может принимать массив в качестве входных данных для параметра -Member.

Что-то вроде того, не уверен, хорошо ли это написано или работает - просто идея.

Function Add-DistributionGroupMembers_Safe {
Param (
    [Parameter(Mandatory=$true)]
    [String]$Identity,
    [Parameter(Mandatory=$true)]
    [String[]]$Member
)
    $local:groupADSI = [ADSI]"LDAP://${$(Get-DistributionGroup -Identity $Identity).DistinguishedName}"
    $local:DGUsers = @( @( Get-DistributionGroupMember -Identity $Identity ).Name )
    $local:UsersToAdd = @( $Member | Where-Object { $local:DGUsers -notcontains $_ } | ForEach-Object { return (Get-ADUser -Name $_}).DistinguishedName )
    ForEach ($user in $local:UsersToAdd) {
        try {
            $local:GroupADSI.Properties["member"].Add($user) | Out-Null
        } catch {
            #Error processing, text in $_.Exception.Message
        }
    }
    $group.CommitChanges()
}

Для добавления массовых пользователей из текстового файла используйте приведенный ниже скрипт, он очень прост в использовании, и этот парень написал довольно аккуратно

https://gallery.technet.microsoft.com/Add-Bulk-Users-to-6f3014b2