Предположим, у меня есть группа рассылки в 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