none
Скрипт PS заполнение поля в засисимости от OU RRS feed

  • Вопрос

  • Добрый день коллеги! 

    Помогите с написанием скрипта на powershell плиз, логика его выполнения следующая:

    Имеется AD Company с внутренней структурой OU по филиалам фирмы. Грубо говоря верхний уровень это Company, и дальше идут OU fil1, fil2, fil3 и тд.

    В каждой из OU fil внутри есть пользователи и нужно сделать так чтобы заполнить поле Company у пользователя исходя из названия корневой OU.

    То есть, если пользователь находится в Company/fil1/ то вставить в поле Company "Филиал 1" , если находится в OU fil2 то вставить "Филиал 2" и тд . Причем если поле уже заполнено чем то, то заменить принудительно.

    Спасибо за помощь!

Ответы


  • Ну fil это было дано для примера, реальные названия конечно другие, я скрипт разобрал, примерно понял его содержание, его можно упростить под мою задачу, вот примерно так:

    get-aduser | foreach {
        if ($_.Distinguishedname -match "OU=Center"){
           $company = "Производственный участок"
          write-host "[$($_.samaccountname)] : $company"
          set-aduser $_.samaccountname -company $company
       } else {
          write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red
       }
    Убрал лишнее просто, мне нужны жесткие связки, если OU называется "так", то вписать в поле юзеру "такое значение", и так далее в зависимости от OU мне на каждую надо написать жесткий цикл. Как продолжить этот скрипт?

    у меня небыло задачи упростить так как при желании можно это все сделать в одну нечитаемую но рабочую строку. вы удалили 1 элемент который для тз1 был необходим а для тз2 не имеет смысла так как не используется (это не упрощение)

    исходя из тз 2 вам стоит сменить if/else на switch, и выглядеть это будет приблизительно так:

    get-aduser | foreach { $company = switch -match ($_.Distinguishedname){ "OU=Center" { "Производственный участок"} "OU=Branch1" { "Отдел бабы Люси"} default {write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red "" } } if ($company){ write-host "[$($_.samaccountname)] : $company"

    set-aduser $_.samaccountname -company $company

    }

    }



    The opinion expressed by me is not an official position of Microsoft


    • Изменено Vector BCOModerator 6 мая 2019 г. 7:10
    • Помечено в качестве ответа Art Tom 6 мая 2019 г. 9:19
    Модератор
  • добавьте звездочку после get-aduser * | ....

    -wildcard замените на -regex

    upd: и звездочки в свитчах не нужны для regex


    The opinion expressed by me is not an official position of Microsoft

    • Изменено Vector BCOModerator 6 мая 2019 г. 8:58
    • Помечено в качестве ответа Art Tom 6 мая 2019 г. 9:18
    Модератор

Все ответы

  • get-aduser | foreach {
        if ($_.Distinguishedname -match ",OU=fil (?''nm''
    \d+),"){
          $nm = $matches['nm']
          $company = "Филиал $nm"
          write-host "[$($_.samaccountname)] : $company"
          set-aduser $_.samaccountname -company $company
       } else {
          write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red
       }


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • get-aduser | foreach {
        if ($_.Distinguishedname -match ",OU=fil (?''nm''
    \d+),"){
          $nm = $matches['nm']
          $company = "Филиал $nm"
          write-host "[$($_.samaccountname)] : $company"
          set-aduser $_.samaccountname -company $company
       } else {
          write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red
       }


    The opinion expressed by me is not an official position of Microsoft

    Спасибо за ответ, а как организовать этот цикл при 5-7 объектах выбора? Каждый раз прописыть else .....

    esle ..... ?

  • get-aduser | foreach {
        if ($_.Distinguishedname -match ",OU=fil (?''nm''
    \d+),"){
          $nm = $matches['nm']
          $company = "Филиал $nm"
          write-host "[$($_.samaccountname)] : $company"
          set-aduser $_.samaccountname -company $company
       } else {
          write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red
       }


    The opinion expressed by me is not an official position of Microsoft

    Спасибо за ответ, а как организовать этот цикл при 5-7 объектах выбора? Каждый раз прописыть else .....

    esle ..... ?

    скрипт находит fil # и этот # подставляет в Филиал #

    что до логики то без тз вам сложно предложить оптимальное решение


    The opinion expressed by me is not an official position of Microsoft


    Модератор
  • get-aduser | foreach {
        if ($_.Distinguishedname -match ",OU=fil (?''nm''
    \d+),"){
          $nm = $matches['nm']
          $company = "Филиал $nm"
          write-host "[$($_.samaccountname)] : $company"
          set-aduser $_.samaccountname -company $company
       } else {
          write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red
       }


    The opinion expressed by me is not an official position of Microsoft

    Спасибо за ответ, а как организовать этот цикл при 5-7 объектах выбора? Каждый раз прописыть else .....

    esle ..... ?

    скрипт находит fil # и этот # подставляет в Филиал #

    что до логики то без тз вам сложно предложить оптимальное решение


    The opinion expressed by me is not an official position of Microsoft


    Ну fil это было дано для примера, реальные названия конечно другие, я скрипт разобрал, примерно понял его содержание, его можно упростить под мою задачу, вот примерно так:

    get-aduser | foreach {
        if ($_.Distinguishedname -match "OU=Center"){
           $company = "Производственный участок"
          write-host "[$($_.samaccountname)] : $company"
          set-aduser $_.samaccountname -company $company
       } else {
          write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red
       }
    Убрал лишнее просто, мне нужны жесткие связки, если OU называется "так", то вписать в поле юзеру "такое значение", и так далее в зависимости от OU мне на каждую надо написать жесткий цикл. Как продолжить этот скрипт?


  • Ну fil это было дано для примера, реальные названия конечно другие, я скрипт разобрал, примерно понял его содержание, его можно упростить под мою задачу, вот примерно так:

    get-aduser | foreach {
        if ($_.Distinguishedname -match "OU=Center"){
           $company = "Производственный участок"
          write-host "[$($_.samaccountname)] : $company"
          set-aduser $_.samaccountname -company $company
       } else {
          write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red
       }
    Убрал лишнее просто, мне нужны жесткие связки, если OU называется "так", то вписать в поле юзеру "такое значение", и так далее в зависимости от OU мне на каждую надо написать жесткий цикл. Как продолжить этот скрипт?

    у меня небыло задачи упростить так как при желании можно это все сделать в одну нечитаемую но рабочую строку. вы удалили 1 элемент который для тз1 был необходим а для тз2 не имеет смысла так как не используется (это не упрощение)

    исходя из тз 2 вам стоит сменить if/else на switch, и выглядеть это будет приблизительно так:

    get-aduser | foreach { $company = switch -match ($_.Distinguishedname){ "OU=Center" { "Производственный участок"} "OU=Branch1" { "Отдел бабы Люси"} default {write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red "" } } if ($company){ write-host "[$($_.samaccountname)] : $company"

    set-aduser $_.samaccountname -company $company

    }

    }



    The opinion expressed by me is not an official position of Microsoft


    • Изменено Vector BCOModerator 6 мая 2019 г. 7:10
    • Помечено в качестве ответа Art Tom 6 мая 2019 г. 9:19
    Модератор
  • исходя из тз 2 вам стоит сменить if/else на switch, и выглядеть это будет приблизительно так:

    get-aduser | foreach { $company = switch -match ($_.Distinguishedname){ "OU=Center" { "Производственный участок"} "OU=Branch1" { "Отдел бабы Люси"} default {write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red "" } } if ($company){ write-host "[$($_.samaccountname)] : $company"

    set-aduser $_.samaccountname -company $company

    }

    }



    The opinion expressed by me is not an official position of Microsoft


    Да, извиняюсь, изначально видимо неправильно довел требуемое.

    Попробовал этим способом, ругается на опратор -match 

    At line:2 char:23
    +     $company = switch -match ($_.Distinguishedname){
    +                       ~~~~~~
    The parameter match is not valid for the switch statement.
        + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : InvalidSwitchFlag

    Почитал про switch, заменил на параметр -Wildcard, в итоге скрипт прошел без ошибок, но запрашивает теперь какой-то ввод.

    PS C:\Windows\system32> get-aduser | foreach {
        $company = switch -Wildcard ($_.Distinguishedname){
          "*Center branch*" {"Производственный участок"}
          default {write-host "User with DN '$($_.distinguishedname)' would be skipped" -foregroundcolor red
          ""
          }
       }
       if ($company){
          
    
    write-host "[$($_.samaccountname)] : $company"
          set-aduser $_.samaccountname -company $company
    
       }
    }
    cmdlet Get-ADUser at command pipeline position 1
    Supply values for the following parameters:
    (Type !? for Help.)
    Filter: 



    • Изменено Art Tom 6 мая 2019 г. 7:49
  • добавьте звездочку после get-aduser * | ....

    -wildcard замените на -regex

    upd: и звездочки в свитчах не нужны для regex


    The opinion expressed by me is not an official position of Microsoft

    • Изменено Vector BCOModerator 6 мая 2019 г. 8:58
    • Помечено в качестве ответа Art Tom 6 мая 2019 г. 9:18
    Модератор
  • добавьте звездочку после get-aduser * | ....

    -wildcard замените на -regex


    The opinion expressed by me is not an official position of Microsoft

    Спасибо большое, внес еще некоторые правки по синтаксису, и все завелось! Благодарю!