Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] AD - Добавление в группу на основе атрибутов (http://forum.oszone.net/showthread.php?t=242536)

rudimko 12-09-2012 19:13 1987525

[решено] AD - Добавление в группу на основе атрибутов
 
Добрый день, всем гуру PowerSell'a!
Прошу помощи в написании скрипта, цель которого будет следующей:
В зависимости от того как заполнен атрибут "Организация" в AD у пользователя, добавлять его в соответствующую группу. Т.е., я так понимаю, надо как-то сначала задать какая организация будет приравниваться какой группе (например для Организации "Организация 1" должна быть добавлена группа "Пользователи-1" если она еще не добавлена и т.д.
Заранее огромное спасибо...

Kazun 13-09-2012 08:58 1987775

Код:

$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}
        }
}


rudimko 19-09-2012 08:44 1991303

Спасибо. Небыло времени еще разобраться, но мысль ясна. Позже отпишусь.

rudimko 01-10-2012 08:08 1997536

Супер, все отлично работает. Только атрибут organization сменил на company.
Возник следующий вопрос:

Можно ли исключить пользователя сразу из нескольких групп по маске?
Игрался с командлетом "Remove-ADGroupMember -Identity Group -Members $user -Confirm:$False", так ничего и не вышло...

Kazun 01-10-2012 09:04 1997554

$user.memberof |Where {!($_ -like "Of*")} | Remove-ADGroupMember -Members $user

rudimko 01-10-2012 14:16 1997717

Супер! Ну а для того чтобы совсем автоматизировать процесс... как бы сделать так, чтобы не плодить условия, а поставить в цикл из расчета компаний и групп?

Что имеем на текущий момент, условие для одной компании и группы:
читать дальше »
Код:

$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 01-10-2012 15:26 1997754

И что это за условие?

rudimko 01-10-2012 15:36 1997763

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"
                        }
                }


Kazun 01-10-2012 15:51 1997769

Код:

$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"
        }
}


rudimko 01-10-2012 15:56 1997775

Здорово! Премного благодарен!

rudimko 02-10-2012 12:31 1998305

Еще маленький вопросик:
Возможно ли, при исключении из групп по маске "Пользователи-*", сделать вывод информации из каких именно групп был исключен пользователь?

Kazun 02-10-2012 12:32 1998307

У командлета Remove-ADGroupMember есть параметр PassThru.

rudimko 02-10-2012 13:14 1998325

А как этот параметр можно применить\отобразить через Write-Host?

Kazun 02-10-2012 13:40 1998339

Добавить в Foreach

rudimko 02-10-2012 15:54 1998396

Вроде бы работает, но т.к. я совсем неопытный, прошу посмотреть и поправить, правильно ли?
Код:

$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 2544025

Всем доброго времени суток.
Пришел сюда просить о помощи. Я только приступаю к изучению PowerShell, а посоветоваться в реале мне к сожалению не с кем.
В общем проблема заключается в следующем. Необходимо пользователей из определенной OU добавить в группы. Но сделать это так, что бы если атрибут пользователя (department) совпадал с именем группы(name), то пользователь автоматически становился её участником.

Kazun 21-08-2015 09:07 2544210

Код:

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 2544250

Огромное Вам спасибо! Сейчас буду пробовать.

Paul_ritch 26-08-2015 09:40 2546058

Доброго времени суток.

Пришлось внести некоторые изменения в скрипт. Выяснилось, что значение атрибута 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


Kazun 26-08-2015 09:52 2546063

Пригласите более грамотного специалиста к компьютеру, который сможет правильно скопировать мой пост выше, а не как вздумается, все в одну строку(знак разделения между командами ; ).

Paul_ritch 26-08-2015 11:05 2546098

Kazun, прошу прощенья за мою неграмотность в PS и прошу не судить меня строго, все когда то приходится делать в первый раз.
Запустил скрипт через ISE, однако снова ошибка. Подскажите плз, что делать.
Код:

Get-ADGroup : Фильтр поиска не опознан
строка:2 знак:19
+    $gr = Get-ADGroup <<<<  -Filter "Name -eq '$($_.Name)'"
    + CategoryInfo          : NotSpecified: (:) [Get-ADGroup], ADException
    + FullyQualifiedErrorId : Фильтр поиска не опознан,Microsoft.ActiveDirectory.Management.Commands.Get
  ADGroup


Kazun 26-08-2015 11:16 2546103

Код:

Get-ADUser -Filter "department -notlike 'департамент*'" -SearchBase "OU=Test,DC=CB,DC=LS" -Properties Department | Group-Object Department | Foreach {
        $gr = Get-ADGroup -Filter "Name -eq '$($_.Name)'"
        if($gr) {Add-ADGroupMember -Identity $gr  -Members $_.Group}
}


Paul_ritch 26-08-2015 12:31 2546142

Большое спасибо Kazun! Просто огромное! Не сочтите за наглость подскажите пожалуйста ещё один момент. Оказалось, что в значении атрибута department в конце стоит пробел. Из за этого значения атрибутов department(у пользователей) и name (у групп) отличаются. Попытался решить это путем добавления подстановочного символа *. Однако ничего не получилось, в разных вариантах скрипт либо не отрабатывает либо выдает ошибку.
Код:

Правил здесь
$gr = Get-ADGroup -Filter "Name -like '$($_.Name)'*"


Kazun 26-08-2015 12:58 2546160

$gr = Get-ADGroup -Filter "Name -like '$($_.Name.TrimEnd())'"

Paul_ritch 26-08-2015 13:20 2546169

Моей благодарности нет предела! Спасибо огромное!


Время: 06:29.

Время: 06:29.
© OSzone.net 2001-