Показать полную графическую версию : [решено] AD - Добавление в группу на основе атрибутов
Добрый день, всем гуру PowerSell'a!
Прошу помощи в написании скрипта, цель которого будет следующей:
В зависимости от того как заполнен атрибут "Организация" в AD у пользователя, добавлять его в соответствующую группу. Т.е., я так понимаю, надо как-то сначала задать какая организация будет приравниваться какой группе (например для Организации "Организация 1" должна быть добавлена группа "Пользователи-1" если она еще не добавлена и т.д.
Заранее огромное спасибо...
$users = Get-ADUser -Filter * -Properties organization
foreach($user in $users)
{
switch($user.Organization)
{
"Org1" {Add-ADGroupMember -Identity Group1 -Members $user;break}
"Org2" {Add-ADGroupMember -Identity Group2 -Members $user;break}
"Org3" {Add-ADGroupMember -Identity Group3 -Members $user;break}
"Org4" {Add-ADGroupMember -Identity Group4 -Members $user;break}
}
}
Спасибо. Небыло времени еще разобраться, но мысль ясна. Позже отпишусь.
Супер, все отлично работает. Только атрибут organization сменил на company.
Возник следующий вопрос:
Можно ли исключить пользователя сразу из нескольких групп по маске?
Игрался с командлетом "Remove-ADGroupMember -Identity Group -Members $user -Confirm:$False", так ничего и не вышло...
$user.memberof |Where {!($_ -like "Of*")} | Remove-ADGroupMember -Members $user
Супер! Ну а для того чтобы совсем автоматизировать процесс... как бы сделать так, чтобы не плодить условия, а поставить в цикл из расчета компаний и групп?
Что имеем на текущий момент, условие для одной компании и группы:
$Company_01 = 'Компания-01'
$Company_02 = 'Компания-02'
$Company_03 = 'Компания-03'
$Group_01 = 'Пользователи-01'
$Group_02 = 'Пользователи-02'
$Group_03 = 'Пользователи-03'
$users = Get-ADUser -Filter {(name -like "Иванов Иван Иванович") -and (Enabled -eq "True")} -Properties "Company","MemberOf"
foreach ($user in $users)
{
switch ($user.Company) {
$Company_01 {
if ($user.MemberOf -match $Group_01) {
"$($user.Name) уже находится в группе $Group_01"
}
else {
if ($user.MemberOf -match "Пользователи-*") {
$user.MemberOf | Where {($_ -match "Пользователи-*")} | Remove-ADGroupMember -Members $user
"$($user.Name) удален из всех пользовательских групп"
}
Add-ADGroupMember -Identity $Group_05_MO -Members $user
"$($user.Name) добавлен в группу $Group_01"
}
}
}
}
Kazun, прошу прощения, не тот кусок вставил... =\ Смысл такой, что если пользователь еще не в "нужной" группе, тогда исключаем его из всех групп по маске "Пользователи-*" и назначаем ему "нужную" группу. Хотелось бы как-то автоматизировать процесс для остальных компаний и групп, чтобы не дублировать тоже самое, изменяя переменные компании и группы... Это возможно?
$Company_01 {
if ($user.MemberOf -match $Group_01) {
"$($user.Name) уже находится в группе $Group_01"
}
else {
if ($user.MemberOf -match "Пользователи-*") {
$user.MemberOf | Where {($_ -match "Пользователи-*")} | Remove-ADGroupMember -Members $user
"$($user.Name) удален из всех пользовательских групп"
}
Add-ADGroupMember -Identity $Group_05_MO -Members $user
"$($user.Name) добавлен в группу $Group_01"
}
}
$hash = @{"Company1" = "gr1";"Company2"="gr2"}
if($gr = $hash[$user.company])
{
if ($user.MemberOf -match $gr) {
"$($user.Name) уже находится в группе $gr"
}
else {
$user.MemberOf | Where {$_ -match "Пользователи-*"} | Remove-ADGroupMember -Members $user
"$($user.Name) удален из всех пользовательских групп"
Add-ADGroupMember -Identity $gr -Members $user
"$($user.Name) добавлен в группу $gr"
}
}
Здорово! Премного благодарен!
Еще маленький вопросик:
Возможно ли, при исключении из групп по маске "Пользователи-*", сделать вывод информации из каких именно групп был исключен пользователь?
У командлета Remove-ADGroupMember есть параметр PassThru.
А как этот параметр можно применить\отобразить через Write-Host?
Вроде бы работает, но т.к. я совсем неопытный, прошу посмотреть и поправить, правильно ли?
$grdel = $user.MemberOf | Where {$_ -match "Пользователи-*"} | Remove-ADGroupMember -Members $user -Confirm:$false -PassThru
foreach ($grdel_str in $grdel)
{
"$($user.Name) удален из группы $($grdel_str.Name)"
}
Paul_ritch
20-08-2015, 18:10
Всем доброго времени суток.
Пришел сюда просить о помощи. Я только приступаю к изучению PowerShell, а посоветоваться в реале мне к сожалению не с кем.
В общем проблема заключается в следующем. Необходимо пользователей из определенной OU добавить в группы. Но сделать это так, что бы если атрибут пользователя (department) совпадал с именем группы(name), то пользователь автоматически становился её участником.
Get-ADUser -Filter {department -like '*'} -SearchBase "OU=MyOY,DC=Contoso,DC=Com" | Group-Object Department | Foreach {
$gr = Get-ADGroup -Filter "Name -eq '$($_.Name)'"
if($gr) {Add-ADGroupMember -Identity $gr -Members $_.Group}
}
Paul_ritch
21-08-2015, 10:35
Огромное Вам спасибо! Сейчас буду пробовать.
Paul_ritch
26-08-2015, 09:40
Доброго времени суток.
Пришлось внести некоторые изменения в скрипт. Выяснилось, что значение атрибута departament отличается от имени группы наличием в конце пробела. Попытался решить это путем добавления подстановочного символа.
$gr = Get-ADGroup -Filter "Name -eq '$($_.Name)*'" (Подскажите пожалуйста, верно ли я вставил подстановочный символ "*" ?)
Так же внес некоторые изменения в фильтр поиска пользователей, исключив от туда "ненужных".
Однако при запуске скрипта, он ругается на позиционный параметр, нашел на форуме идентичную проблему, однако символа переноса строки (удаления которого решило проблему) не нашел. Подскажите пожалуйста, в чем может быть причина.
Get-ADGroup : Не удается найти позиционный параметр, принимающий аргумент "if".
строка:1 знак:155
+ Get-ADUser -Filter {department -ne 'департамент*'} -SearchBase "OU=Test,DC=CB,DC=LS" | Group-Object Department | Foreach {$gr = Get-ADGroup <
<<< -Filter "Name -like '$($_.Name)'"if($gr) {Add-ADGroupMember -Identity $gr
-Members $_.Group}}
+ CategoryInfo : InvalidArgument: (:) [Get-ADGroup], ParameterBin
dingException
+ FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.ActiveDire
ctory.Management.Commands.GetADGroup
Пригласите более грамотного специалиста к компьютеру, который сможет правильно скопировать мой пост выше, а не как вздумается, все в одну строку(знак разделения между командами ; ).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.