Функция для создания имени samaccount в PowerShell - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь написать функцию PS, которая может генерировать SamAccountName определенным образом c, я нашел другой вопрос здесь , но это не похоже на то, что я пытаюсь сделать. Мне нужно, чтобы SamAccountName было сгенерировано следующим образом:

UNIT + initial_of_firstName + initial_of_lastName

например, сотрудник Джейн Доу в единице FLN может иметь FLNjd как SamAccountName , и функция должна проверить, что ID занято другим пользователем, и если true, то SamAccountName должно быть:

UNIT + initial_of_firstName + first_two_initials_of_lastName, например FLNjdo

, и если это также принято, то SamAccountName должно быть:

UNIT + first_two_initials_of_firstName + first_two_initials_of_lastName, например FLNjado

, и если это также принято, то SamAccountName должно быть:

UNIT + first_two_initials_of_firstName + first_two_initials_of_lastName + 1 такой как FLNjado1

и отсюда начинается добавление чисел 2, 3, 4...., пока функция обнаружит, что существует ID.

Мне удалось извлечь только необходимые инициалы:

$first_of_fname = ($_.Fname).Substring(0,1).ToLower() 

$first_of_lname = ($_.Lname).Substring(0,1).ToLower() 

$FirstandSecond_of_fname = ($_.Fname).Substring(0,2).ToLower() 

$FirstandSecond_of_lname = ($_.Lname).Substring(0,2).ToLower() 

Теперь мне нужно знать, как сгенерировать SamAccountName в приведенном выше Форма и порядок.

Любая помощь будет очень ценится.

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Чтобы использовать другой подход, вместо нескольких операторов if, вы можете использовать оператор switch "назад", чтобы узнать, что является $null или недоступно, и вернуться к переключателю по умолчанию, который является окончательным while итерация l oop увеличение числа.

#Get substrings
$first_of_fname = ($_.Fname).Substring(0,1).ToLower() 
$first_of_lname = ($_.Lname).Substring(0,1).ToLower() 
$FirstandSecond_of_fname = ($_.Fname).Substring(0,2).ToLower() 
$FirstandSecond_of_lname = ($_.Lname).Substring(0,2).ToLower() 

#create patters to match on
$pattern1 = $UNIT + $first_of_fname + $first_of_lname
$pattern2 = $UNIT + $first_of_fname + $FirstandSecond_of_lname
$pattern3 = $UNIT + $FirstandSecond_of_fname + $FirstandSecond_of_lname

#evaluate what is available
switch($null){
    (Get-ADUser -Filter "samAccountName -like '$pattern1'"){
        Write-Host "$pattern1 - Free"
        break
    }
    (Get-ADUser -Filter "samAccountName -like '$pattern2'"){
        Write-Host "$pattern2 - Free"
        break
    }
    (Get-ADUser -Filter "samAccountName -like '$pattern3'"){
        Write-Host "$pattern3 - Free"
        break
    }
    default {
        $cnt  = 1
        while (Get-ADUser -Filter "SamAccountName -like '$pattern3$cnt'") {
            $cnt++
        }
        Write-Host "$pattern3$cnt - Free"
        break
    }
}
0 голосов
/ 15 января 2020

Вы можете сделать следующее:

Function Get-SamAccountName {

    Param(
        [Parameter(Position=0,ValueFromPipelineByPropertyName)]
        $Unit,  
        [Parameter(Position=1,ValueFromPipelineByPropertyName)]
        $First,
        [Parameter(Position=2,ValueFromPipelineByPropertyName)]
        $Last
    )

    $fcount = 1
    $lcount = 1
    $inc = 1
    $Sam = "{0}{1}{2}" -f $unit,$first.substring(0,$fcount).ToLower(),$last.substring(0,$lcount++).ToLower()
    while (Get-AdUser -Filter "SamAccountName -eq '$Sam'") {
        if ($fcount -le 2) {
            $Sam = "{0}{1}{2}" -f $unit,$first.substring(0,$fcount++).ToLower(),$last.substring(0,$lcount).ToLower()
        } else {
            $Sam = "{0}{1}{2}{3}" -f $unit,$first.substring(0,2).ToLower(),$last.substring(0,2).ToLower(),$inc++
        }
    }
    $Sam
}

Вариант использования 1: использование именованных параметров

Get-SamAccountName -Unit 'FLN' -First 'Sam' -Last 'Wise'

Использование Вариант 2: Использование позиционных параметров (без имени)

Get-SamAccountName 'FLN' 'Sam' 'Wise'

Использование Вариант 3: Текстовый список единиц и имен

$users = Get-Content users.txt
$users

FLN,Sam,Wise
HRS,John,Doe
COM,Jane,Doe

$users | ConvertFrom-Csv -Header 'Unit','First','Last' | Foreach {
    $_ | Get-SamAccountName
}

Канал до ConvertFrom-Csv можно пропустить здесь, если ваш файл уже является CSV с правильными заголовками.


Объяснение:

Функция возвращает Строка, представляющая доступное значение SamAccountName.

$fcount - это число символов имени первого имени, которое мы хотим получить. $lcount - это число символов фамилии, которое мы хотим получить. $inc - это число, которое мы хотим добавить к имени пользователя, если необходимо.

$var++ нотация увеличивает значение $var на единицу после его строка казнены. Синхронизация $fcount++ и $lcount++ позволяет нам извлекать (1,1), (1,2), (2,2) символов из (первого, последнего) при минимизации кода. $inc++ будет увеличиваться после получения текущего $inc значения.

-f - строка оператор форматирования .

while l oop будет выполняться только в том случае, если будет найдено текущее созданное значение SamAccountName.

Примечание: Сложность сокращения кода может или не может стоить этого. С точки зрения производительности он не сильно выигрывает, но я чувствую, что сложность кода на этом уровне просто относительная.

...