网站搜索

如何使用 CSV 导入 Active Directory 中的用户


当您需要将新用户批量添加到 Active Directory 时,最简单的方法就是导入它们。为此,我们可以使用 CSV 文件并借助 PowerShell 将用户导入到 Active Directory 中。

使用 CSV 文件导入 AD 用户的优点是,您可以快速填写必填字段(或让人力资源部门填写详细信息)并轻松创建新用户帐户。

在本文中,我将向您展示如何从 CSV 文件导入 Active Directory 中的用户,在文章末尾,我为您提供了完整的脚本。

从 CSV 导入 AD 用户

将用户导入 Active Directory 的最简单方法是获取 CSV 文件,您已在其中设置所有标头以完全匹配 New-ADUser cmdlet 属性,并使用 Import-CSV 和 New-ADUser cmdlet。

要创建具有正确标头的 CSV 文件,我建议您使用所需的属性从 AD 中导出一些当前用户:

Get-Aduser -Filter * -SearchBase 'OU=Users,OU=Oslo,DC=lazyadmin,DC=nl' -Properties DisplayName,EmailAddress,Title | Select Name,GivenName,SurName,DisplayName,Title,SamAccountName,UserPrincipalName,EmailAddress | Export-CSV "C:\users.csv"

当然,如果需要,您可以向导出添加更多属性。从 CSV 文件中删除现有用户帐户并向其中添加新用户。然后只需导入 CSV 文件并创建新用户:

Import-CSV c:\users.csv | New-ADUser -Enabled $True -Path 'OU=Users,OU=Oslo,DC=lazyadmin,DC=nl' -AccountPassword (ConvertTo-SecureString 'Pass123!' -AsPlainText -force)

建议

在实际创建新用户之前始终测试操作。您可以通过在 New-User cmdlet 后面添加 -WhatIf 参数来完成此操作

上面的方法非常基本,例如不会进行任何错误检查。

创建导入脚本

当您要批量创建新用户帐户时,您需要考虑一些事项。例如,您至少需要检查您的 Active Directory 中是否尚不存在该用户帐户。

而且当您创建用户时,某些字段的格式也会根据用户的名称进行设置。例如,电子邮件地址、登录名和用户主体名称。我更喜欢在 PowerShell 脚本中对它们进行格式化,以确保它们一致。

例如,对于电子邮件地址,我们可以使用以下 PowerShell 小函数来格式化用户的电子邮件地址:

# Format the email address
$emailAddressFormat = $givenName + "." + $surName

# Replace hyphens, apostrophe and whitespace, format to lowercase.
return $emailAddressFormat.Replace('-','').Replace(' ','').Replace("'",'').ToLower() + $domain

## Input: Mary-Ann O'Sullivan
## Result
maryann.osullivan@lazyadmin.nl

使用 CSV 导入 Active Directory 中的用户时出现的另一个常见问题是尾随空格。如果您不修剪它们,可能会导致用户名或电子邮件地址出现问题。

导入 AD 用户脚本

您将在下面找到一个完整的脚本,它允许您轻松地将用户批量导入到您的 Active Directory 中。在脚本中,我们首先设置几个默认值:

  • 路径 - 这是需要存储新用户的 OU 的路径

  • 密码 - 新用户的默认密码

  • 已启用 - 新帐户将在创建后启用

  • 域 - 这是用于电子邮件地址的域。

在脚本中,您还会发现几个函数。例如,这些函数用于创建 samAccountName(也是登录名)(建议保持在 20 个字符以内)以及电子邮件地址函数。您当然可以将它们修改为您喜欢的格式。

您将在脚本中找到的另一个功能是查找用户的经理。如果您在 CSV 文件中提供经理的姓名,则脚本将查找经理的专有名称。

param(
  [Parameter(
    Mandatory = $false,
    HelpMessage = "Enter the path to the CSV file"
  )]
  [string]$CSVpath
)

# ----
# Default values
# ----

# Default OU for new users
$path = 'OU=Users,OU=Oslo,OU=Sites,DC=lazyadmin,DC=nl'

# Default password for new users
$password = 'welcome@lazyadmin2024'

# Enable new accounts
$enabled = $true

# Email domain (you can also use a column in the CSV file for this)
$domain = '@lazyadmin.nl'

function Get-SamAccountName{
  PARAM(
    [parameter(Mandatory=$true)]
    [string]$givenName,
    [parameter(Mandatory=$true)]
    [string]$surName
  )

  # Create SamAccountName from given- and surname
  return (($givenName.Substring(0,1)) + $surName).Replace('-','').Replace(' ','').Replace("'",'').ToLower()
}

function Get-EmailAddress{
  PARAM(
    [parameter(Mandatory=$true)]
    [string]$givenName,
    [parameter(Mandatory=$true)]
    [string]$surName
  )
  # Format the email address
  $emailAddressFormat = $givenName + "." + $surName

  # Replace hyphens and whitespace, format to lowercase.
  return $emailAddressFormat.Replace('-','').Replace(' ','').Replace("'",'').ToLower() + $domain
}

function Get-Manager{
  PARAM(
    [parameter(Mandatory=$true)]
    [string]$name
  )

  # Get the manager 
  Get-AdUser -Filter {name -like $name} -Properties * | select -ExpandProperty DistinguishedName
}

# Import CSV file and create users
ForEach ($user in (Import-Csv -Path $CSVpath)) {

  # Create the samAccountName and userPrincipalName
  $samAccountName = Get-SamAccountName -givenName $user.givenName -surName $user.surName
  $userPrincipalName = $samAccountName + $domain

  # Set Display Name
  $displayName = $user.givenName.Trim() + " " + $user.surName.Trim()

  # Make sure that user doesn't already exists
  if ((Get-ADUser -Filter {UserPrincipalName -eq $userPrincipalName} -ErrorAction SilentlyContinue)) {
    Write-Host "User $($displayName) already exists" -ForegroundColor Yellow
    continue
  }

  # Get Email address
  $emailAddress = Get-EmailAddress -givenName $user.givenName -surName $user.surName

  # Create all the user properties
  $newUser = @{
    AccountPassWord = (ConvertTo-SecureString -AsPlainText $password -force)
    ChangePasswordAtLogon = $true
    City = $user.city
    Company = $user.company
    Country = $user.country
    Department = $user.department
    Description = $user.description
    DisplayName = $displayName
    EmailAddress = $emailAddress
    Enabled = $enabled
    GivenName = $user.givenName.Trim()
    Manager = if ($user.manager) {Get-Manager -name $user.manager} else {$null}
    Mobile = $user.mobile
    Name = $displayName
    Office = $user.office
    OfficePhone = $user.phone
    Organization = $user.organization
    Path = $path 
    PostalCode = $user.postalcode
    SamAccountName = $samAccountName
    StreetAddress = $user.streetAddress
    Surname = $user.surname.Trim()
    Title = $user.title
    UserPrincipalName = $userPrincipalName
  }

  # Create new user
  try {
    New-ADUser @newUser
    Write-Host "- $displayName account is created" -ForegroundColor Green
  }
  catch {
    Write-Host "Unable to create new account for $displayName" -ForegroundColor red
    Write-Host "Error - $($_.Exception.Message)" -ForegroundColor red
  }
}

要使用该脚本,您可以使用此 Excel 文件作为模板,或使用前面描述的方法创建一个。确保输入环境的默认值并运行脚本:

Import-ADUsers.ps1 -CSVpath c:\temp\users.csv

导入用户之前的一个好选择是在实际创建用户之前查看结果。您可以通过在第 127 行的 New-ADUser cmdlet 后面添加 -WhatIf 参数来完成此操作。

我还创建了一个更高级的 PowerShell 脚本,您可以使用它来创建单个用户。该脚本中有更多的错误检查,并且还会通过电子邮件将新帐户详细信息发送给经理等。

包起来

当您需要批量创建新的 AD 用户时,最简单的方法是从 CSV 文件导入 AD 用户。您可以使用具有精确标题的 CSV 文件,并在 Excel 中填写所有内容,包括 SamAccountName、OU 路径和电子邮件地址。

但另一种选择是使用 PowerShell 自动格式化它们。后者的优点是您可以包括一些错误检查,同时确保所有格式一致。

希望这篇文章对您导入 AD 用户有所帮助,如果您有任何疑问,请在下面发表评论。

相关文章