Добавьте «Следующий доступный компьютер AD» в сценарий оболочки Power - PullRequest
0 голосов
/ 11 июля 2019

В настоящее время я пытаюсь добавить функцию в свой сценарий powershell со следующей целью:

На компьютере, который еще не добавлен в домен (необходимо), выполнить поиск на локальном сервере AD.(Не Azure) для следующего доступного имени, основанного на вводе пользователя.

В прошлом я пытался и не смог использовать массивы, и я хочу использовать командлет Get-ADComputer в этом, но яне уверен, как это реализовать.

$usrinput = Read-Host 'The current PC name is $pcname , would you like to rename it? (Y/N)'
if($usrinput -like "*Y*") {
    Write-Output ""
    $global:pcname = Read-Host "Please enter the desired PC Name"
    Write-Output ""

    $userinput = Read-Host "You've entered $pcname, is this correct? (Y/N)"
    if($usrinput -like "*N*") {
    GenName
    #name of the parent function
}
Write-Output ""

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

Наша схема именованияработает следующим образом: BTS-ONE-LAP-000

Так оно и есть: Отдел - Расположение - Тип устройства - Количество устройств

Затем код примет первую часть "BTS-ONE" ипроанализируйте его для правильного OU, к которому это должно пойти, и затем назначьте это, используя командлет Add-Computer.Он также будет переименовывать компьютер в соответствии с тем, что набрал пользователь ($ pcname).

Поэтому, прежде чем он проанализирует имя, я бы хотел, чтобы он искал все текущие имена в AD.

Таким образом, пользователь может ввести: «BTS-ONE-LAP», и он автоматически найдет следующий доступный счетчик устройств и добавит его к имени.Таким образом, он автоматически сгенерирует «BTS-ONE-LAP-041».

Добавлено примечание:

Я использовал Get-ADComputer -Filter 'Name -like "BTS-ONE-LAP-*"' | FT Name, а на выходе будет

Name           
----           
BTS-ONE-LAP-001
BTS-ONE-LAP-002
BTS-ONE-LAP-006
BTS-ONE-LAP-007
BTS-ONE-LAP-009
BTS-ONE-LAP-010
BTS-ONE-LAP-022
BTS-ONE-LAP-024
BTS-ONE-LAP-025
BTS-ONE-LAP-028
BTS-ONE-LAP-029
BTS-ONE-LAP-030
BTS-ONE-LAP-031
BTS-ONE-LAP-032
BTS-ONE-LAP-034
BTS-ONE-LAP-035
BTS-ONE-LAP-036
BTS-ONE-LAP-037
BTS-ONE-LAP-038
BTS-ONE-LAP-039
BTS-ONE-LAP-040
BTS-ONE-LAP-041
BTS-ONE-LAP-050
BTS-ONE-LAP-051

Я не знаю, как разобрать это, поэтому код знает, что BTS-ONE-LAP-003 доступен (я ужасен с массивами).

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Другим способом может быть создание функции многократного использования, как показано ниже:

function Find-FirstAvailableNumber ([int[]]$Numbers, [int]$Start = 1) {
    $Numbers | Sort-Object -Unique | ForEach-Object {
        if ($Start -ne $_) { return $Start }
        $Start++
    }
    # no gap found, return the next highest value
    return $Start
}

# create an array of integer values taken from the computer names
# and use the helper function to find the first available number
$numbers = (Get-ADComputer -Filter 'Name -like "BTS-ONE-LAP-*"') | 
            ForEach-Object { [int](([regex]'(\d+$)').Match($_.Name).Groups[1].Value) }

# find the first available number or the next highest if there was no gap
$newNumber = Find-FirstAvailableNumber $numbers

# create the new computername using that number, formatted with leading zero's
$newComputerName = 'BTS-ONE-LAP-{0:000}' -f $newNumber

Используя ваш список примеров, $newComputerName станет BTS-ONE-LAP-003

Обратите внимание, что не все, что пользователь может ввести с Read-Host, является допустимым именем компьютера. Вам следует добавить несколько проверок, чтобы увидеть, является ли предложенное имя приемлемым, или пропустить предлагаемое имя alltogehter, поскольку все ваши машины называются «BTS-ONE-LAP-XXX».
См. Соглашения об именах в Active Directory для компьютеров, доменов, сайтов и подразделений

1 голос
/ 11 июля 2019
$list = (Get-ADComputer -Filter 'Name -like "BTS-ONE-LAP-*"' | Sort-Object Name[-1])

$i = 1
$found = $false
Foreach($Name in $list.Name)
{
    while($i -eq [int]$Name.Split("-")[3].Split("-")[0])
    {
        $i++
    }
}
$i

Приведенный выше код будет проходить через каждое имя в списке и остановится, когда обнаружит, что третий компьютер в наборе НЕ является компьютером № 3.

Пример:

BTS-ONE-LAP-001 | $i = 1
BTS-ONE-LAP-002 | $i = 2
BTS-ONE-LAP-006 | $i = 3

Он разделяет BTS-ONE-LAP-006 на 006 и преобразует его в целое число, делая его 6. Поскольку 6 не равно 3, мы знаем, что BTS-ONE-LAP-003 доступен.

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