在 Active Directory 中生成唯一用户名时,数字不会正确递增

When generating a unique username in Active Directory, numbers do not increment correctly

我正在更新我们用来生成新用户的脚本,并根据每晚从提要下载的 csv 更新用户。我需要为每个用户生成一个唯一的用户名,使用首选或名字和姓氏。当我生成用户名时,我在末尾使用了一个数字,该数字应该为每个新用户递增 1。不过,我 运行 遇到了增量数字部分的问题。当用户名生成时,它们生成像 username1、username12、username123 而不是 username1、username2、username3 等。当我构建函数时,它看起来像这样:

function NewAdUser ($hruser)
{
    $stat = @('Create')
    
    # First, Last, and EEID fields must exist
    if (-not $hruser.First -or -not $hruser.Last -or -not $hruser.EEID)
    {
        Write-Host -fore Cyan -back Red '- First, Last, and/or EEID not found in HR feed - cannot create user'
        $stat += 'CreateFail-NoFirstLastEeid'
        return ($stat -join '/')
    }

    if ($hruser.HrlyOrSal -eq 'H') { $tgt_ou = $hrly_ou }
    else { $tgt_ou = $emp_ou }

    $empID = $hruser.EmployeeID.PadLeft(5,"0")
    
    if ($hruser.PreferredName) { $userDisplayName = $hruser.PreferredName + ' ' + $hruser.Last }
    else { $userDisplayName = $hruser.First + ' ' + $hruser.Last }

#Generate Unique sAMAccountName based on Preferred or First and Last

    if ($hruser.PreferredName){
         
            $userSAM = $hruser.PreferredName + '.' + $hruser.Last}
    else{ 
            $userSAM = $hruser.First + '.' +  $hruser.Last}

    $g = 1
 

    While ((Get-ADUser -Filter {sAMAccountName -eq $userSAM}) -ne $null)
        {
            $userSAM = $userSAM + $g
            $g++
        }
    
#Generate Unique Common Name based on Preferred or First and Last

    if ($hruser.PreferredName){

            $name = $hruser.PreferredName + ' ' + $hruser.Last}

    else{ 

            $name = $hruser.First + ' ' +  $hruser.Last}
    
    $j = 1

        While((Get-ADUser -Filter {Name -eq $name}) -ne $null)
        {
            $name = $name + $j
            $j++
        }



    #$userSAM = $hruser.First.ToLower() + '.' + $hruser.Last.ToLower()
    $userUPN = $userSAM + "@domain.com"
    $userDisplayName = (Get-Culture).TextInfo.ToTitleCase($userDisplayName.ToLower())
    $userLast = (Get-Culture).TextInfo.ToTitleCase($hruser.Last.ToLower())
    $userFirst = (Get-Culture).TextInfo.ToTitleCase($hruser.First.ToLower())
    
    try
    {
        $newaduser_params = @{
            'Name' = $name
            'Path' = $tgt_ou
            'Enabled' = $false
            'sAMAccountName' = $userSAM
            'displayName' = $userDisplayName
            'Surname' = $userLast
            'givenName' = $userFirst
            'UserPrincipalName' = $userUPN
            'EmployeeID' = $empID
            'ErrorAction' = 'Stop'
        }
        New-ADUser @newaduser_params
    }
    catch 
    {
        Write-Host -fore Cyan -back Red '- Failed to create new user'
        $stat += 'CreateFail'
    }

    return ($stat -join '/')
}

我做错了什么?

你的问题出在你的循环中:

While((Get-ADUser -Filter {Name -eq $name}) -ne $null)
{
    $name = $name + $j
    $j++
}

您正在使用 $name 创建新用户名,但您每次都会覆盖 $name。因此,您将 $name 设置为 "username1"。然后在循环的下一次迭代中,将 $name 设置为 $name + $j,相当于 "username1" + "2".

您需要将原始 non-numbered 用户名存储在一个单独的变量中,并在每次增加数字时使用它:

$j = 1

$originalName = $name

While((Get-ADUser -Filter {Name -eq $name}) -ne $null)
{
    $name = $originalName + $j
    $j++
}