【问题标题】:Creating a Script to import users from a CSV to AD创建脚本以将用户从 CSV 导入 AD
【发布时间】:2016-02-25 17:57:24
【问题描述】:

我正在尝试构建一个脚本,该脚本将使用包含字段的 CSV

名字、姓氏、密码

并使用该信息在特定 OU 中的 AD 中创建用户。我做了一堆谷歌搜索,这就是我想出的(来自this blog):

Import-Csv .\userImport.csv | ForEach-Object {
  New-ADUser 
    -Name $_.DisplayName 
    -UserPrincipalName $_.UserPrincipalName 
    -SamAccountName $_.Username 
    -FirstName $_.FirstName 
    -DisplayName $_.DisplayName 
    -LastName $_.Lastname 
    -Path $_.Path 
    -AccountPassword (ConvertTo-SecureString $_.Password -AsPlainText -force) 
    -Enabled $True 
    -PasswordNeverExpires $True 
    -PassThru 
}

我有几个问题:

  1. 我想在我的命令中指定 OU,而不是让它在 CSV 中。我可以将其更改为:

    -Path OU=MyOU,DC=Domain,DC=Local
    
  2. -PassThru 行是干什么用的?

  3. -AccountPassword 行是否正确?我从一个博客中得知这是获取密码并将其设置为我的 AD 用户密码的正确方法。

  4. 我需要将PrincipalNameSamAccountNameDisplayName 都作为单独的字段吗?这可以尽可能小,至少现在是这样。

  5. 您有什么建议或改变吗?这是我第一次做这样的脚本,所以我愿意学习。

【问题讨论】:

    标签: powershell active-directory windows-server-2012


    【解决方案1】:
    1. 是的,您可以随意指定参数,它们不需要来自输入文件。

    2. -PassThru 使New-ADUser 回显创建的用户对象。默认情况下,该 cmdlet 不返回任何内容。

    3. 是的,-AccountPassword 参数是正确的,前提是 CSV 中的 password 字段包含明文密码。

    4. 如果您可以从现有字段值构造参数,则不必为每个参数参数设置单独的 CSV 字段。例如,您很可能可以根据名字和姓氏创建像 DisplayNameSamAccountName 这样的值,例如像这样:

      -SamAccountName ($_.firstname.Substring(0,1) + $_.lastname).ToLower()
      -DisplayName ('{0} {1}' -f $_.firstname, $_.lastname)
      

      您也不需要指定每个参数。例如,省略时会自动生成UPN(用户主体名称),显示名称默认为名称。

    5. 您不能像以前那样换行。 PowerShell 无法读懂您的想法,并且不会知道您打算在下一行中继续该语句,除非您告诉它或者该语句显然不完整。使用反引号来避开换行符。另外,名字和姓氏的参数是-GivenName-Surname,而不是-FirstName-LastName

    $csv = '.\userImport.csv'
    $ou  = 'OU=MyOU,DC=Domain,DC=Local'
    
    Import-Csv $csv | ForEach-Object {
      $name = '{0} {1}' -f $_.firstname, $_.lastname
      $acct = ($_.firstname.Substring(0,1) + $_.lastname).ToLower()
      $pw   = ConvertTo-SecureString $_.password -AsPlainText -Force
    
      New-ADUser -Name $name `
        -SamAccountName $acct `
        -GivenName $_.firstname `
        -Surname $_.lastname `
        -Path $ou `
        -AccountPassword $pw `
        -Enabled $true `
        -PasswordNeverExpires $true `
        -PassThru
    }
    

    【讨论】:

      【解决方案2】:
      1. OU - 如果您希望它们都在同一个 OU 中,您可以对其进行硬编码(记住引号)

        -Path "OU=MyOU,DC=Domain,DC=Local"

      2. -PassThru

        -PassThru 参数允许您从默认情况下不返回任何输出的 cmdlet 请求输出。 (The PassThru Parameter: Gimme Output)

        即而不是 New-ADUser 只是执行然后将您返回到下一行,它实际上会将新用户创建的信息打印到提示符。

      3. 是的,-AccountPassword 采用 SecureString 作为参数。命令ConvertTo-SecureString 将纯文本字符串转换为SecureString,然后可以将其传递给-AccountPassword 参数

      4. 您不需要-UserPrincipalName。你确实需要-SamAccountName-DisplayName可以改成:

        -DisplayName "$($_.FirstName) $($_.Lastname)"
        
      5. 这是一个非常标准的批量生产帐户脚本,所以它的方式非常好。我会看到的唯一更改是-PasswordNeverExpires $True您通常只在服务帐户上真正设置密码永不过期,因此如果您正在创建普通的旧用户帐户,则不需要它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-10
        • 2017-09-12
        • 1970-01-01
        • 2020-05-09
        • 2018-06-22
        • 1970-01-01
        • 2021-07-09
        相关资源
        最近更新 更多