Пытаясь создать сценарий создания пользователя powershell, хотите добавить номер к имени пользователя, если он уже существует - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь создать сценарий создания пользователя, чтобы научить себя больше Powershell. В настоящее время я работаю только над созданием только имени пользователя и хочу убедиться, что каждое имя пользователя уникально.

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

Получить имя Получите средний инициал Получить фамилию Объедините первую букву имени + средняя буква + 6 символов от фамилии Если пользователи уже существуют, добавьте число, начинающееся с 1, пока имя пользователя не станет уникальным. В настоящее время я застрял на шаге 5. Если имя пользователя не уникально, оно добавляет номер один. И.Е. Пользователь Brenda T Follower имеет имя пользователя BTFollow, и если это имя пользователя уже существует, оно становится BTFollow1.

Однако, если BTFollow и BTFollow1 уже существуют вместо создания BTFollow2, это делает BTFollow12.

И, наконец, хотя это и не является большой проблемой, я хочу, чтобы мои параметры отображали то, что следует за Read-Host, но в этом тексте отображается не только имя переменной.

Вот мой код.

Param(
#Gather users first name, required input and must not be empty or null
[Parameter(Mandatory=$True)]
[ValidateNotNullOrEmpty()]
[string]
$FirstName = (Read-Host -Prompt 'Please input the users first name.'),

#Gather users middle initial, required input and must not be empty or null and must only be one character
[Parameter(Mandatory=$True)]
[ValidateNotNullOrEmpty()]
[ValidateLength(1,1)]
[string]
$MiddleInitial = (Read-Host -Prompt 'Please input the users middle initial.'),

#Gather users last name, required input and must not be empty or null
[Parameter(Mandatory=$True)]
[ValidateNotNullOrEmpty()]
[string]
$LastName = (Read-Host -Prompt 'Please input the users last name.'),

#Gathers user phone extension, required input, mustn ot be empty or null, and must only user numbers
[Parameter(Mandatory=$True)]
[ValidateNotNullOrEmpty()]
[ValidatePattern("[0-9][0-9][0-9][0-9]")]
[ValidateLength(4,4)]
[String]
$PhoneExtension = (Read-Host -Prompt 'Please input the users 4 digit exension, numbers only')
)

$i = 0



#Create user name
$Username = $FirstName.Substring(0,1) + $MiddleInitial + $LastName.Substring(0,6)

#Check username does not exist, if it does add numbers

Do {
    Try {
        Get-ADUser $UserName | Out-Null
        $UserName = $Username + ++$i
        Continue
    }
    Catch {
        Break
    }
} While ($True)

Write-Host "Username is $Username"

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Разобрался с помощью Reddit. Мне нужно было заменить мой текущий код.

Do {
    Try {
        Get-ADUser $UserName | Out-Null
        $UserName = $Username + ++$i
        Continue
    }
    Catch {
        Break
    }
} While ($True)

Новый код, который работает.

#Check username does not exist, if it does add numbers
$UniqueUserName = $Username 
while (Get-ADUser -Filter "SamAccountName -like '$UniqueUserName'"){
  $UniqueUserName = $Username + ++$i
}
0 голосов
/ 13 ноября 2018

Поскольку вы итеративно модифицировали $UserName в цикле, вы добавили дополнительное число в каждую итерацию:

$UserName = $Username + ++$i

При исходном значении BTFollow значение равно BTFollow1 после первой итерации, а во второй итерации вы затем добавляете 2 к , что , что приводит к BTFollow12, и и так далее.

Ваш собственный ответ работает (хотя -like следует заменить на -eq) и, учитывая его привлекательную краткость и предполагаемую относительную редкость повторяющихся имен, вероятно, является подходящим вариантом.

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


Вы можете избежать дорогостоящего цикла вокруг Get-AdUser в целом , предварительно отфильтровав потенциальные дубликаты с помощью Get-ADUser -Filter, а затем обработав кандидатов локально:

$highestIndexSoFar =
  Get-ADUser -Filter "SamAccountName -like '$UserName*'" | 
    ForEach-Object { if ($_.SamAccountName -match '\d*$') { [int] $Matches[0] } } |
      Sort-Object -Descending | Select-Object -First 1

if ($null -eq $highestIndexSoFar) { # no duplicates -> use as-is
    $UniqueUserName = $UserName
} else { # increment the highest index to date to make the username unique
    $UniqueUserName = $UserName + (1 + $highestIndexSoFar)
}

Еще одним преимуществом вышеупомянутого решения является то, что оно определяет суффикс наибольшего числа в фактических именах, который надежно использует суффикс, который является самым высоким на сегодняшний день + 1 , тогда как Подход call- Get-AdUser-in-a-loop использует первый индекс, который не принимается (хотя это будет проблемой, если пользователи будут удалены со временем или если суффиксы вне последовательности были созданный вручную).

  • Get-ADUser -Filter "SamAccountName -like '$UserName*'" извлекает потенциальных дубликатов; синтаксис -Filter не достаточно сложен, чтобы разрешить сопоставление на основе регулярных выражений, поэтому эта предварительная фильтрация может найти только все имена пользователей с одинаковым префиксом, которые могут включать ложные срабатывания (например, jdoet для jdoe, тогда как в конечном итоге следует учитывать только суффикс числовой , такой как jdoe1).

  • Regex '\d*$' затем используется для отсеивания таких ложных срабатываний, и фактический, потенциально пустой числовой суффикс (\d*) отражается в записи [0] автоматической переменной $Matches.

  • Числовой суффикс, если он присутствует или пуст, затем приводится к [int] и выводится.

    • Обратите внимание, что изначально неиндексированное имя пользователя, такое как BTFollow, приведет к тому, что $Matches[0] будет пустой строкой, а приведение [int] преобразуется в 0, поэтому первый добавленный индекс будет 1.
  • Sort-Object -Descending сортирует результирующие числа в порядке убывания, а Select-Object -First 1 затем извлекает первое - то есть наибольшее найденное суффиксное число, если оно есть.

  • Если совпадений не найдено вообще, то есть, если имя пользователя еще не занято, сортировать нечего, и Select-Object -First 1 эффективно дает $null; в противном случае 1 должен быть добавлен к наибольшему номеру для формирования нового уникального имени пользователя.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...