【问题标题】:Powershell + AD, Change Output Based On First Letter Of UsernamePowershell + AD,根据用户名的第一个字母更改输出
【发布时间】:2018-05-30 08:56:20
【问题描述】:

我正在构建一个 PowerShell 脚本来创建一个 Active Directory 帐户。用户的主目录基于其用户名的首字母在一定范围内:

  • A-C = 用户_01$\用户名
  • D-H = 用户_02$\用户名
  • ..等等。

我正在努力实现输出他们所需目录的东西。我设法让它与一个目录集一起工作,但是我不知道如何根据他们名字的第一个字母来更改输出。

$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

我想我基本上需要通过他们姓氏的第一个字母进行细化,并将其分类到其中一个组中,然后为主目录输出正确的用户文件夹。

【问题讨论】:

    标签: powershell active-directory


    【解决方案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$\' }
    }
    

    这使用(小写)a..z 的 ASCII 字符代码来创建不同的字母数组,然后使用 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 码范围来确定哪个路径是正确的。此解决方案更短,但对于将来可能需要修改/维护您的代码的任何其他人来说可能不太透明/清晰。

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

    【讨论】:

    • 我最终做的是$HD = "U" $HDir = "\\RBHFILRED002\" $AC = "Users_01$\" $DH = "Users_02$\" $IM = "Users_03$\" $NS = "Users_04$\" $TZ = "Users_05$\" $SInitial = $Surname[0] $Folder = if ($SInitial -eq "A" -or "B" -or "C"){$AC} ElseIf ($SInitial -eq "D" -or "E" -or "F" -or "G" -or "H"){$DH} ElseIf ($SInitial -eq "I" -or "J" -or "K" -or "L" -or "M"){$IM} ElseIf ($SInitial -eq "N" -or "O" -or "P" -or "Q" -or "R" -or "S"){$NS} Else {$TZ} 但是,这仍然将它们放在Users_01中
    • 你不能这样使用-or。它需要是$SInitial -eq "D" -or $SInitial -eq "E".. 等等。但是您可以使用$SInitial -in 'a','b','c'。此外,您将姓氏设为小写,并与大写字母进行比较(这可能没问题,因为我认为比较不区分大小写,但为了完整起见,我建议保持一致)。
    • 姓是大写的,我试试看告诉你
    • 在您的问题中,您使用了.tolower(),但我想您已经在当前代码中更改了它。
    • 我现在实际上并没有使用 $SAMAccountLower,它只是在我需要的情况下在那里
    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2019-05-07
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多