Powershell + AD,根据用户名的第一个字母更改输出

时间:2018-05-30 08:56:21

标签: powershell active-directory

我正在构建一个PowerShell脚本来创建一个Active Directory帐户。用户的主目录基于某个范围之间的用户名的第一个字母:

  • A-C = Users_01 $ \ username
  • D-H = Users_02 $ \ username
  • ..等等。

我正在努力实现输出所需目录的东西。我设法让它使用一个目录集,但我无法弄清楚如何根据其名字的第一个字母更改输出。

$SAMAccountName = $Surname+$Initial
$SAMAccountLower = $SAMAccountName.ToLower()
$UserPrincipalName = $Surname+$Initial
$HD = "U"
$HDir = "\\RBHFILRED002\"
$AC = "Users_01$\"
$DH = "Users_02$\"
$IM = "Users_03$\"
$NS = "Users_04$\"
$TZ = "Users_05$\"

New-ADUser -path "REDACTED" -SamAccountName $Surname$Initial -Name $DisplayName -DisplayName $DisplayName -GivenName $GivenName -Surname $Surname -EmailAddress $Mail -UserPrincipalName $Surname$Initial@REDACTED -Title $title -HomeDrive $HD -HomeDirectory $HDir$Surname$Initial -Description $Description -ChangePasswordAtLogon $true -PasswordNeverExpires $false -AccountPassword $defpassword -Enabled $true -PassThru

我认为我基本上需要通过姓氏的第一个字母进行优化,然后将其排序到其中一个组中,然后输出主目录的正确用户文件夹。

1 个答案:

答案 0 :(得分:1)

你可以这样做:

$AC = 97..99 | ForEach-Object { [char]$_ }
$DH = 100..104 | ForEach-Object { [char]$_ }
$IM = 105..109 | ForEach-Object { [char]$_ }
$NS = 110..115 | ForEach-Object { [char]$_ }
$TZ = 116..122 | ForEach-Object { [char]$_ }

$HomePath = Switch ($Surname[0]) {
    {$_ -in $AC} { 'Users_01$\' }
    {$_ -in $DH} { 'Users_02$\' }
    {$_ -in $IM} { 'Users_03$\' }
    {$_ -in $NS} { 'Users_04$\' }
    {$_ -in $TZ} { 'Users_05$\' }
}

这使用ASCII字符代码(小写)a..z来创建不同的字母数组,然后使用Switch块来比较$Surname的第一个字母(通过使用数组运算符[0])到每个数组以指定主目录路径(然后将其分配给$HomePath)。

或者您也可以这样做:

$HomePath = Switch ([byte][char]$Surname[0]) {
    {$_ -in 97..99} { 'Users_01$\' }
    {$_ -in 100..104} { 'Users_02$\' }
    {$_ -in 105..109} { 'Users_03$\' }
    {$_ -in 110..115} { 'Users_04$\' }
    {$_ -in 116..122} { 'Users_05$\' }
}

这会将姓氏的第一个字母转换为其ASCII代码编号,然后使用ascii代码范围来确定哪个路径正确。对于可能需要在将来修改/维护代码的任何其他人来说,此解决方案更短,但可能更不透明/清晰。

另外(FYI)如果您使用的是PowerShell Core,现在可以直接使用..运算符创建一个字符数组。例如,你可以在PowerShell Core中执行:'a'..'z'