使用PowerShell在AD中生成唯一的用户名

时间:2017-04-13 18:10:41

标签: powershell active-directory

我正在编写一个脚本供服务台员工用来通过输入基本员工信息来快速(并准确地)创建AD用户帐户。我们使用人名的一部分来创建samAccountName。我通过以下方式实现了这一目标。

$GivenName = "Joe"
$Surname = "Smith"
$SamAccountName = $Surname.substring(0, [System.Math]::Min(5, $Surname.Length)) + $GivenName.Substring(0,1)

只要还没有" Joe Smith" (或John或Jennifer Smithers等)。解决方案是在最后添加一个数字。手动创建帐户时,服务台会搜索AD,查看必要时使用的数字后缀。我试图弄清楚PowerShell如何为我们做到这一点。我在网上找到的帮助下经历了几个想法,但到目前为止,我还没有成功。

我的第一个想法是做这样的事情。

$SamSuffix = 2
If ((Get-ADUser -LDAPFilter "(SamAccountName=$samAccountName)")-eq $Null)
    {
        "$SamAccountName does not exist in AD" #out result for testing. 
    }
Else{
    do 
      {
      Get-ADUser -LDAPFilter "(SamAccountName=$SamAccountName + $SamSuffix++)"
      }
    until (Get-ADUser -LDAPFilter "(SamAccountName=$SamAccountName + $SamSuffix)")-eq $Null)
    }

这显然不起作用。即使它确实如此,我也不知道我将如何进入下一步的步骤。创建帐户。

我也尝试将现有名称拉入列表

$SamExist = (Get-ADUser -LDAPFilter "(SamAccountName=$SamAccountName*)" | Select SamAccountName)

    do  {$SamAccountName + $SamSuffix++}
    until ($SamExist -notcontains $SamAccountName -or $SamAccountName + $SamSuffix)

这也不起作用,但如果确实如此,即使不需要,它也会自动添加后缀。

1 个答案:

答案 0 :(得分:0)

你接近所有现有比赛的地方就是我要开始的地方。让我们假设$SamAccountName是smithj

$existingAccounts = Get-ADUser -Filter "samaccountname -like '$SamAccountName*'" -ErrorAction SilentlyContinue | Select-Object -ExpandProperty samaccountname

所以$existingaccounts有一个以smithj开头的samaccountname。如果没有,那么$existingAccounts将为null,我们可以测试它。

if($existingAccounts){
    # Figure out what the suffix will be
    $highestValue = $existingAccounts -replace "^$SamAccountName" | 
        ForEach-Object{[int]$_} | 
        Measure-Object -Maximum | 
        Select-Object -ExpandProperty Maximum
} else {
    # Create the user as normal.
}

假装存在一些帐户,我们会修剪samaccountname中的前导字符,将剩余的字符转换为整数并从中选择最高字符。因此,$highestValue是冲突帐户中使用的最后一个号码。

添加一个,你可以创建一个保证用户名,假设那些时刻没有任何变化,即两个用户向smithj账户进行更改。

如果您希望填补用户可能已离开的空白,并且您希望在1之后使用下一个可用,那么您可以执行此操作。

$existingAccounts = "smithj1", "smithj5", "smithj10", "smithj2", "smithj3"
# Figure out what the next unused suffix will be
$existingSuffixes = $existingAccounts -replace "^$SamAccountName" | ForEach-Object{[int]$_}
# Once again determine the maximum one in use
$highestValue = $existingSuffixes |  Measure-Object -Maximum | Select-Object -ExpandProperty Maximum
# Find the first gap between 1 and the max suffix
$nextAvailableSuffix = 1..($highestValue + 1) | Where-Object{$existingSuffixes -notcontains $_} | Sort-Object desc | Select -First 1
使用上面的示例

$nextAvailableSuffix将包含4。如果唯一的另一个是2,我们将1加到最高值,这样只会得到$nextAvailableSuffix的答案