在 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++
}
我正在更新我们用来生成新用户的脚本,并根据每晚从提要下载的 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++
}