Пользователи создаются более одного раза - PullRequest
2 голосов
/ 27 марта 2020

Я пытаюсь создать скрипт для создания групп, пользователей и подразделений для моего D C. Предполагается добавить 250 пользователей и поместить первые 60 пользователей в ROD C, а затем случайным образом разделить остальные 250 на подразделения, но после размещения первых 60 пользователей в подразделении ROD C он попытается добавить тех же пользователей в другие подразделения с этой ошибкой:

Ошибка dsadd: cn = amohn1, ou = DB_Engineers, ou = программисты, ou = BRAAN, dc = BRAAN, dc = COM: указанная учетная запись уже существует.

Я не уверен, почему он это делает. Вот мой сценарий:

$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent ##Grabs the directory path of the script to be used as a relevant path.##
$domainname = (Get-ADDomain -Current LocalComputer).NetBIOSName ##Grabs the computers domainname##
$filecontent = Get-Content $scriptDir\Users.txt ##Reads the .txt file##

##Setting global variables.##
$itteration = 0
$AdminCount = 0
$ComputerName = "default"
$ComputerNumber = 1
$ComputerType = "default"
$ServicePack = ""

if($domainname -eq "BRAAN") ##Is the computer on the BRAAN domain?##
{
    ##Build OU and Group Structure inside the domain.##
    dsadd ou "ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd ou "ou=CustomDom,dc=BRAAN,dc=COM"
    dsadd ou "ou=BRAANComputers,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd ou "ou=IT,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd ou "ou=HR,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd ou "ou=Sales,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd ou "ou=Executive,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd ou "ou=Programmers,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd ou "ou=DB_Engineers,ou=Programmers,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd ou "ou=Content_Experts,ou=Programmers,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd ou "ou=Animators,ou=Programmers,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd ou "ou=Operations,ou=CustomDom,dc=BRAAN,dc=COM"
    dsadd ou "ou=RODC,dc=BRAAN,dc=COM"
    dsadd group "cn=IT_Staff,ou=IT,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd group "cn=HR_Staff,ou=HR,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd group "cn=Sales_Staff,ou=Sales,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd group "cn=Executive_Staff,ou=Executive,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd group "cn=DB_Engineers_Staff,ou=BRAAN,dc=BRAAN,dc=COM"
    dsadd group "cn=Content_Experts_Staff,ou=BRAAN,dc=BRAAN,dc=COM" 
    dsadd group "cn=Animators_Staff,ou=BRAAN,dc=BRAAN,dc=COM"  
    dsadd group "cn=Operations_Staff,ou=Operations,ou=CustomDom,dc=BRAAN,dc=COM" 
    dsadd group "cn=RODC_Staff,ou=RODC,dc=BRAAN,dc=COM" 

    ##Sets the computer name##
    $ComputerName = "Braan-"
    while($itteration -ne 80) ##While loop used to create ComputerObjects.##
    {
        $random = Get-Random -Minimum 1 -Maximum 3 ##Random number used to randomly assign OperatingSystem to the computers.##
        if($random -eq 1)
        {
            $ComputerType = "Windows 10"
        }
        ##Creation of PCs.##
        $Computer = $ComputerName+$ComputerNumber
        New-ADComputer -Name $Computer -OperatingSystem $ComputerType -OperatingSystemServicePack $ServicePack -Path "ou=BRAANComputers,ou=BRAAN,dc=BRAAN,dc=COM"
        $itteration++
        $ComputerNumber++
    }
    ##Resetting the itteration variable.##
    $itteration = 0
    ##Resetting the random variable.##
    $random = 0
    while($itteration -ne 250) ##Begins loop for user creation.##
    {     
        while($itteration -lt 60) ##Places first 60 users into the RODC OU.##
        {
            ##Splits the values in the .txt file via spaces.##
            $values = $filecontent[$itteration] -split(' ')
            $usrname = $values[0]
            dsadd user "cn=$usrname,ou=RODC,dc=BRAAN,dc=COM" -fn $values[1] -ln $values[2] -disabled no -pwd "Password1" -memberof "cn=RODC_Staff,ou=RODC,dc=BRAAN,dc=com" ##Create user and add to group.##
            $itteration++
        }

        $values = $filecontent[$itteration] -split(' ')
        ##Random used to determine which OUs a user is put in.##
        $random = Get-Random -Minimum 1 -Maximum 9
        $usrname = $values[0]
        ##Sets itteration to 70 above zero so we have no repeat accounts.##
        $itteration = 70

        while($itteration -ne 180)##Begins loop for user creation.##
        {
            if($random -eq 1) ##IT OU.##
            {
                dsadd user "cn=$usrname,ou=IT,ou=BRAAN,dc=BRAAN,dc=COM" -fn $values[1] -ln $values[2] -disabled no -pwd "Password1" -memberof "cn=IT_Staff,ou=IT,ou=BRAAN,dc=BRAAN,dc=com" ##Create user and add to group.##
            }elseif($random -eq 2) ##HR OU.##
            {
                dsadd user "cn=$usrname,ou=HR,ou=BRAAN,dc=BRAAN,dc=COM" -fn $values[1] -ln $values[2] -disabled no -pwd "Password1" -memberof "cn=HR_Staff,ou=HR,ou=BRAAN,dc=BRAAN,dc=com" ##Create user and add to group.##
            }elseif($random -eq 3) ##Sales OU.##
            {
                dsadd user "cn=$usrname,ou=Sales,ou=BRAAN,dc=BRAAN,dc=COM" -fn $values[1] -ln $values[2] -disabled no -pwd "Password1" -memberof "cn=Sales_Staff,ou=Sales,ou=BRAAN,dc=BRAAN,dc=com" ##Create user and add to group.##
            }elseif($random -eq 4) ##Finance OU.##
            {
                dsadd user "cn=$usrname,ou=Finance,ou=BRAAN,dc=BRAAN,dc=COM" -fn $values[1] -ln $values[2] -disabled no -pwd "Password1" -memberof "cn=Finance_Staff,ou=Finance,ou=BRAAN,dc=BRAAN,dc=com" ##Create user and add to group.##
            }elseif($random -eq 5) ##Executives OU.##
            {
                dsadd user "cn=$usrname,ou=Executives,ou=BRAAN,dc=BRAAN,dc=COM" -fn $values[1] -ln $values[2] -disabled no -pwd "Password1" -memberof "cn=Executives_Staff,ou=Executives,ou=BRAAN,dc=BRAAN,dc=com" ##Create user and add to group.##
            }elseif($random -eq 6) ##DB_Engineers Group.##
            {
                dsadd user "cn=$usrname,ou=DB_Engineers,ou=Programmers,ou=BRAAN,dc=BRAAN,dc=COM" -fn $values[1] -ln $values[2] -disabled no -pwd "Password1" -memberof "cn=DB_Engineers_Staff,ou=DB_Engineers,ou=Programmers,ou=BRAAN,dc=BRAAN,dc=com" ##Create user and add to group.##
            }elseif($random -eq 7) ##Content_Experts Group.##
            {
                dsadd user "cn=$usrname,ou=Content_Experts,ou=Programmers,ou=BRAAN,dc=BRAAN,dc=COM" -fn $values[1] -ln $values[2] -disabled no -pwd "Password1" -memberof "cn=Content_Experts_Staff,ou=Content_Experts,ou=Programmers,ou=BRAAN,dc=BRAAN,dc=com" ##Create user and add to group.##
            }
            elseif($random -eq 8)##Animators Group.##
            {
                dsadd user "cn=$usrname,ou=Animators,ou=BRAAN,dc=BRAAN,dc=COM" -fn $values[1] -ln $values[2] -disabled no -pwd "Password1" -memberof "cn=Animators_Staff,ou=Animators,ou=Programmers,ou=BRAAN,dc=BRAAN,dc=com" ##Create user and add to group.##
            }
            ##Checks if admin accounts are needed, if so then adds one admin account given that they are also in the Management OU.##
            if($AdminCount -ne 2 -and $random -eq 2)
            {
                $AdminCount++
                dsmod group "cn=Domain Admins,cn=Users,dc=BRAAN,dc=COM" -addmbr "cn=$usrname,ou=Management,ou=BRAAN,dc=BRAAN,dc=com"    ##Adds account to Domain Admins.##
                dsmod group "cn=Enterprise Admins,cn=Users,dc=BRAAN,dc=COM" -addmbr "cn=$usrname,ou=Management,ou=BRAAN,dc=BRAAN,dc=com" ##Adds account to Enterprise Admins.##
            }
            $itteration++
        }
    }
}else ##Computer is not on any of the above domains and script will exit.##
{
    Write-Host "Domain not listed, exiting script."
}

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Поскольку вы продолжаете сбрасывать переменную $itteration на 70!

Во время первого запуска внешнего while($itteration -ne 250) l oop:

while ($itteration -ne 250) {

    # runs 60 times ($itteration -in 0..59)
    while ($itteration -lt 60) {
        $itteration++
    }

    # $itteration is reset (to a higher value)
    $itteration = 70

    # runs 110 times ($itteration -in 70..179)
    while ($itteration -ne 180) {
        $itteration++
    }
}

Хорошо, так пока все хорошо - $itteration - это не 250, поэтому тело l oop снова запускается:

while ($itteration -ne 250) {

    # $itteration is now 180, so we skip this loop
    while ($itteration -lt 60) {
        $itteration++
    }

    # $itteration is reset (this time to a lower value!)
    $itteration = 70 # <-- endless loop detected

    # runs another 110 times ($itteration -in 70..179)
    while ($itteration -ne 180) {
        $itteration++
    }
}
1 голос
/ 28 марта 2020

Ваша математика здесь не складывается. Вы говорите ...

Предполагается добавить 250 пользователей и поместить первые 60 в стержень c, а затем случайным образом разделить остальные 250 на

... но нет "других 250". Начальные 60 потребуют «другие 190» для всего из 250.

Далее, учитывая этот скелетный код ...

##Resetting the itteration variable.##
$itteration = 0
$userCount = 0

while ($itteration -ne 250) { ##Begins loop for user creation.##     
    while ($itteration -lt 60) { ##Places first 60 users into the RODC OU.##
        $itteration++
        $userCount++
    }

    ##Sets itteration to 70 above zero so we have no repeat accounts.##
    $itteration = 70

    while ($itteration -ne 180) { ##Begins loop for user creation.##
        $itteration++
        $userCount++
    }
}

... если только одна итерация while ($itteration -ne 250) должна выполняться, во-первых, она вообще не должна быть al oop, но на этой первой итерации счет идет следующим образом ...

  • while ($itteration -lt 60): 60 итераций (0..59)
    • 60 всего пользователей, 60 ROD C пользователей
  • $itteration = 70: 0 итераций (60 .. 69 пропущено )
    • 60 всего пользователей, 60 ROD C пользователей
  • while ($itteration -ne 180): 110 итераций (70..179) * Всего 1035 *
  • 170 пользователей, 60 ROD C пользователей

Как видите, это позволяет нам всего 170 пользователей. Из-за ошибки, указанной в ответе @MathiasR.Jessen , внешний while является бесконечным l oop. На каждой последующей итерации while ($itteration -lt 60) l oop вводиться не будет, а while ($itteration -ne 180) l oop, поэтому количество пользователей будет увеличиваться на 70. 179 = 110 пользователей каждый раз: 170, 280, 390 и др. c; ни один из которых не равен 250.

Короче говоря, не делайте этого . Он не должен требовать этого уровня сложности (то есть вложенных циклов с итератором, который пропускает) для подсчета от 0..60 и 60..250, ни этого уровня анализа, чтобы подтвердить, действительно ли это то, что он делает. Вместо этого одним простым исправлением является преобразование внутренних циклов while в ветви if / else и изменение $itteration только в конце l oop ...

while ($itteration -ne 250) { ##Begins loop for user creation.##     
    if ($itteration -lt 60) {
        ##Places first 60 users into the RODC OU.##
        # dsadd user "cn=$usrname,ou=RODC,dc=BRAAN,dc=COM" ...
    } else {
        ##Begins user creation.##
        # dsadd user ...
    }
    $itteration++
}

Это также можно легко перевести на for l oop.

Еще лучше, поскольку в логах c минимальное перекрытие диапазонов 0..60 и 60..250, им даже не нужно занимать одно и то же l oop. Я также думаю, что это делает намерение более явным, и это хорошо. Если вы хотите 60 пользователей ROD C, то напишите al oop, чтобы сделать это ...

for ($rodcUserCount = 0; $rodcUserCount -lt 60; $rodcUserCount++)
{
    ##Places first 60 users into the RODC OU.##
    # dsadd user "cn=$usrname,ou=RODC,dc=BRAAN,dc=COM" ...
}

Если вы хотите еще 190 обычных пользователей, то добавьте еще один l oop. ..

for ($generalUserCount = 0; $generalUserCount -lt 190; $generalUserCount++)
{
    ##Begins user creation.##
    # dsadd user ...
}

Там у вас есть два простых и простых цикла для создания 250 пользователей. Обратите внимание, что я называю переменную итерации, чтобы прояснить, что подсчитывается.

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


Несколько других вещей, которые я нашел, что я считаю ошибками ...

  • Вы устанавливаете $random вне создания пользователя l oop ...

    $random = Get-Random -Minimum 1 -Maximum 9
    $usrname = $values[0]
    ##Sets itteration to 70 above zero so we have no repeat accounts.##
    $itteration = 70
    
    while ($itteration -ne 180) { ##Begins loop for user creation.##
    

    Это означает, что каждая из 110 итераций этого l oop будет иметь одинаковое значение для $random и, следовательно, создайте этих пользователей в одном отделе. Вместо этого я думаю, что вы хотите установить $random в начале тела l oop.

  • Когда $random -eq 8, вы создаете пользователя на cn=$usrname,ou=Animators,ou=BRAAN,dc=BRAAN,dc=COM, но добавляете его в cn=Animators_Staff,ou=Animators,ou=Programmers,ou=BRAAN,dc=BRAAN,dc=com группа (обратите внимание на дополнительные ou=Programmers). В этом и заключается опасность дублирования кода.

Во втором пункте вместо длинной цепочки операторов if / elseif, которые проверяют $random, вы можете определить это в верхней части script ...

$departmentBaseDN = 'ou=BRAAN,dc=BRAAN,dc=COM'
$departments = @(
    'IT',
    'HR',
    'Sales',
    'Finance',
    'Executives',
    'Programmers\DB_Engineers',
    'Programmers\Content_Experts',
    'Animators'
)

... и затем настроить ваш вызов Get-Random так, чтобы он возвращал индекс в пределах этого массива ...

$random = Get-Random -Maximum $departments.Length # 0 ≤ $random < $departments.Length

... и затем используйте это в вашем l oop для динамического построения отличительных имен пользователя, подразделения OU и группы отделов ...

# This returns a one-element array for departments with no \
$departmentParts = $departments[$random] -split '\\'
# The last part is the department name
$departmentName = $departmentParts[-1]

$departmentUnitDN = $departmentBaseDN
# Prepend to the base DN the OU for each part in order
foreach ($departmentPart in $departmentParts)
{
    $departmentUnitDN = "ou=$departmentPart,$departmentUnitDN"
}
$departmentGroupDN = "cn=$departmentName`_Staff,$departmentUnitDN"
$userDN = "cn=$usrname,$departmentUnitDN"

dsadd user "$userDN" -fn $values[1] -ln $values[2] -disabled no -pwd "Password1" -memberof "$departmentGroupDN"  ##Create user and add to group.##

Вы можете использовать одну и ту же переменную $departments для замены некоторые из повторяющихся команд dsadd ou и dsadd group в начале скрипта тоже.

Наконец, имейте в виду, что для PowerShell есть ActiveDirectory модуль , который в дополнение к уже используемому New-ADComputer командлету предоставляет множество других командлетов, которые можно использовать здесь ...

...