如何使用 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 用户有所帮助,如果您有任何疑问,请在下面发表评论。
