当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何在 PowerShell 中使用 New-ADUser cmdlet

作者:精品下载站 日期:2024-12-14 03:45:51 浏览:13 分类:玩电脑

如何在 PowerShell 中使用 New-ADUser cmdlet


在 Active Directory 中创建新用户是系统管理员的一项常见任务。您可以在 ADUC 中手动执行此操作,但更好更快的方法是在 PowerShell 中使用 New-ADUser cmdlet。

此 cmdlet 允许您创建具有所有必需属性的新用户。我更喜欢使用入门脚本来创建新用户。这不仅允许您创建用户,还可以分配组和许可证等。

在本文中,我们将了解如何使用 New-ADUser cmdlet,并将解释如何创建自己的 PowerShell 脚本来创建新用户,首先包括免费脚本

新 ADUser cmdlet

要使用 PowerShell 创建新的 AD 用户,您需要安装 Active Directory PowerShell 模块。该模块默认安装在域控制器上,但您也可以将其安装在您自己的工作站上。查看这篇文章以获取有关如何安装它的更多信息。

New-ADUser cmdlet 带有很多选项。当我们创建一个新帐户时,我们基本上可以设置用户的每个属性。现在您不需要指定每个属性,您甚至可以通过指定名称来创建新的用户帐户:

New-ADuser -name "Z.Vance"

但这将在默认的用户 OU 中创建不带任何属性的用户帐户。所以这并不是一个现实的选择。

创建可用的新用户帐户所需的最少信息是:

  • 给定的名称
  • 姓名
  • Sam 帐户名
  • 用户主体名称
  • 路径(组织单位)
  • 密码(账号密码)
  • 已启用 - 真
  • 登录时更改密码 - True

在下面的示例中,我们对信息进行了硬编码,但当然我们也可以使用 Read-Host cmdlet 使其更加动态。我建议使用哈希表和展开来使代码更具可读性:

$firstName = "Zoe"
$lastName = "Vance"
$accountName = "zoevance"
$dnsroot = '@' + (Get-ADDomain).dnsroot
$OU = "OU=Users,OU=Amsterdam,OU=Sites,DC=a-d,DC=nl"
$password = "lazyPass123"

$userDetails = @{
    GivenName             = $firstName 
    Surname               = $lastName 
    Name                  = "$firstName $lastName" 
    SamAccountName        = $accountName 
    UserPrincipalName     = $accountName + $dnsroot 
    Path                  = $OU
    AccountPassword       = (ConvertTo-SecureString -AsPlainText $password -Force)
    Enabled               = $true
    ChangePasswordAtLogon = $true
}

New-ADUser @userDetails 

通常,当您创建用户帐户时,您还需要输入联系信息等详细信息,这些信息可以在电子邮件签名中使用,例如用户的经理以及可能的组成员身份。

创建具有属性的用户帐户

New-ADUser cmdlet 允许您指定创建用户帐户时所需的所有属性。例如,您可以通过添加相关参数来输入用户的所有地址详细信息和电话号码:

$userDetails = @{
    GivenName             = $firstName 
    Surname               = $lastName 
    Name                  = "$firstName $lastName" 
    SamAccountName        = $accountName 
    UserPrincipalName     = $accountName + $dnsroot 
    Path                  = $OU
    AccountPassword       = (ConvertTo-SecureString -AsPlainText $password -Force)
    Enabled               = $true
    ChangePasswordAtLogon = $true
    StreetAddress         = "Karl Johans gate 1"  
    PostalCode            = "0010"
    City                  = "Oslo"
    OfficePhone           = "010 000 458 456"
}

New-ADUser @userDetails

该 cmdlet 允许您直接输入常用参数,但 Active Directory 中的用户帐户也可以具有扩展或自定义属性。这些也可以通过 PowerShell 使用 OtherAttributes 参数来填充。

例如,要在扩展属性1中输入信息,我们可以添加以下参数:

-OtherAttributes @{'extensionattribute1'="Special"}

添加经理

例如,将经理添加到 Active Directory 中的用户帐户后,您和您的用户就可以在组织视图中查看某人的经理和该经理的直接下属。要将经理添加到新用户帐户,我们首先需要从经理处获取 SamAccountName

最简单的选择是根据全名找到经理。这样我们就可以在创建新帐户时简单地将 SamAccountName 添加到 manager 参数中:

$manager = Get-AdUser -Filter {name -like "Adel Bowen"}

New-ADUser "<Add other properties>" -Manager $manager.SamAccountName

使用模板

我们还可以使用现有的用户帐户作为模板,而不是在创建新用户帐户时提供所有属性。这样,我们只需提供正在更改的属性,而无需重新输入地址信息或组成员身份等信息。

第一步是获取要用作模板的用户帐户。您需要使用 -Properties 参数指定要复制的属性。

$templateUser = Get-ADUser -Identity a.bowen -Properties Citry,StreetAddres,PostalCode

接下来,我们将创建一个新的用户帐户。我们需要提供我之前在文章中提到的最少信息,包括 OU(路径)。然后,您可以使用 -Instance 参数指定要从中复制信息的模板用户:

New-ADUser -Instance $templateUser -SamAccountName $accountName -Name $fullName -otherproperties

虽然这个方法听起来不错,但我不太喜欢。您仍然需要提供主要信息并选择要复制的每个字段。最好花一些时间创建一个合适的脚本来为您做最多的工作。

创建新用户 PowerShell 脚本

当您需要经常创建新用户帐户时,最好花一些时间创建一个好的 PowerShell 脚本。使用脚本的优点是您可以自动执行完全加入新用户所需执行的每个步骤。

[玩转系统] 如何在 PowerShell 中使用 New-ADUser cmdlet

每个组织都是不同的,所以我认为我的脚本并不适合您。这意味着您需要根据需要修改脚本。这就是为什么我将首先解释该脚本的确切用途,并解释一些重要步骤。然后您可以下载脚本并对其进行修改。

因此,在创建新用户帐户时,我们需要完成以下操作:

  • 获取新用户的个人详细信息。我们只需要姓名、电话号码、职位、公司(如果有多个办事处)和经理
  • 从配置文件中获取地址信息等
  • 创建用户帐户
  • 从具有相同职位且在同一家公司工作的现有用户复制组成员身份
  • 强制 Microsoft Entra Sync(如果您有混合环境)
  • 向经理发送电子邮件,告知帐户已创建

正如您在上面的步骤中看到的,我们正在使用配置文件。这只不过是一个包含所有静态信息的 JSON 文件。它允许我们定义多个分支机构,每个分支机构都有自己的地址信息。我们还使用它来定义一些设置,例如密码。

{
  "SMTP": {
    "address": "lazydev-onmicrosoft-com.mail.protection.outlook.com",
    "from": "Lazy IT Desk <[email protected]>",
    "serviceDesk": "[email protected]",
    "subject": "User Account details for {{user.fullname}}",
    "attachment": """la-srv-dc01\scripts\assets\new user manual.pdf"
  },
  "Settings": {
    "mailTemplateManager": "MailTemplateUserCreated.html",
    "mailTemplateServiceDesk": "MailTemplateServiceDesk.html",
    "password": "lazyPass123",
    "AccountSkuId": "lazydev:DEVELOPERPACK_E5"
  },
  "Companies": {
    "a-d": {
      "City": "Amsterdam",
      "Name": "LazyAdmin",
      "OU": "OU=Users,OU=Amsterdam,OU=Sites,DC=Lazyadmin,DC=nl",
      "Phone": "088 11 33 33 77",
      "PostalCode": "1337 AB",
      "WebSite": "a-d.site",
      "StreetAddress": "Handelsplein 1"
    }
  }
}

正如您在 JSON 中看到的,我们还定义了两个邮件模板和一个附件。附件是有关如何开始、需要了解什么等的说明。

获取个人信息

第一步是获取新用户的个人信息。该脚本旨在一次创建一个用户,但您也可以使用 Import-CSV cmdlet 对其进行修改以进行批量创建。

我们使用几个 Read-Host cmdlet,并使用 Write-Host cmdlet 提供一些指导:

Write-Host "Enter the name of the user."

$user.givenName = Read-Host "Firstname"
$user.surName = Read-Host "LastName"

Write-Host "Enter the phonenumber of the user when known"

$user.telephoneNumber = Read-Host "Phone number"
$user.mobilePhone = Read-Host "Mobile phone number"
      
$user.fullName = ($user.givenName + ' ' + $user.surName)

选择公司

如果您在大型环境中工作,您经常需要与不同的分支机构或部门打交道。在 JSON 文件中,我们可以定义多个公司,每个公司都有自己的地址详细信息等。

我们想选择其中一家公司。为此,我们正在构建一个选择菜单,允许用户(您)选择其中一个选项。

If ($companyList.Count -gt 1) {
  $title = "Select the company"
  $message = "Which company does $usersName work for?"

  # Build the choices menu
  $choices = @()
  For ($index = 0; $index -lt $companyList.Count; $index++) {
    $choices += New-Object System.Management.Automation.Host.ChoiceDescription ($companyList[$index]), ($companyList[$index])
  }

  $options = [System.Management.Automation.Host.ChoiceDescription[]]$choices
  $result = $host.ui.PromptForChoice($title, $message, $options, 1) 
  $company = $companies.($companyList[$result])
}

获得经理

我们需要的最后一条信息是用户的管理者。我们只需搜索经理的姓名即可选择经理。这可以是名字、姓氏或全名。现在我们总有可能找到多个同名的用户。

$managerName = Read-Host "Who is the manager of the user. Search on first, last or fullname"
$manager = Get-Manager -name $managerName

我们在函数Get-Manager中处理这个问题。我不打算在这里展示该函数的完整代码,你可以在 Github 上查看,但是如果我们找到多个用户,那么脚本将创建另一个选择菜单,这样你就可以选择正确的管理员。

创建 SamAccountName 和 UserPrincipalName

利用我们现在拥有的信息,我们可以创建 SamAccountName 和 UserPrincipalName。 SamAccountName 有一些我们需要牢记的要求。例如,它不能超过 20 个字符,并且您需要定义格式。

我更喜欢使登录名 (SamAccountName) 与电子邮件地址中的格式保持相同。该名称的当前主体是 firstname + lastname。例如:

  • 约翰·多伊 > johndoe
  • 克拉斯德弗里斯 > 克拉斯德弗里斯

SamAccountName 在 Active Directory 中也必须是唯一的。如果该名称已经存在,它将创建以下替代名称:

  • 约翰·多伊 > jdoe
  • 克拉斯·德弗里斯 > kdevries

现在您当然可以更改它以适应您的环境。

如果创建了 SamAccountName,我们可以使用该名称来创建 UserPrincipalName。这是 SamAccountName + 公司域名。

职称

职位名称可能看起来像一个简单的属性,但我们需要确保该职位名称存在于我们要创建用户的 OU 中。原因是,我们稍后将根据用户的职位和 OU 复制组成员身份。

write-host "What is the job title of the new user."

$title = Read-Host "Title"

write-host "`n"
write-host "Checking if job title exists...." -ForegroundColor Cyan

$user.title = Get-JobTitle -title $title -company $company

因此,我们在脚本中请求职位名称,并检查函数 Get-JobTitle 中是否存在该职位名称。这还可以防止同一标题出现多种变体(和拼写错误)。如果脚本找不到匹配的职位,它将返回同一 OU 内用户的所有职位,并允许您选择一个。

创建新用户帐户

收集到所有信息后,我们可以创建新的用户帐户。该脚本支持测试模式 (WhatIf),因此您无需创建实际用户即可尝试。

Write-Host 'Creating User account in AD....' -ForegroundColor Cyan
if ($whatIf) {
  Write-Host "Running in test mode, user won't be created" -ForegroundColor Yellow
}

$userCreated = New-DomainUserAccount -user $user -manager $manager -company $company -whatIf:$whatIf

# Only continue when account is created or when running in whatif (test) mode
If ($userCreated -or $whatIf -eq $true) {
  Write-Host 'User succesfully created' -ForegroundColor Green

New-DomainUserAccount 函数是一个自定义函数,但它没有什么特别的作用。正如我在文章开头所示,它使用 splatted 哈希表和 New-ADUser cmdlet 来创建用户。

复制组成员身份

创建用户帐户后,我们需要设置新用户的组成员身份。最好的方法是从具有相同职称并为同一家公司(部门/分支机构)工作的现有用户复制它。

第一步是获取新创建的用户帐户和要从中复制的用户。函数 Get-UserToCopyGroupsFrom 将根据职务在同一 OU 中搜索 Active Directory 中的所有用户。它当然会排除新创建的用户。

# Copy Group Membership
  $createdUser = Get-AdUser -Identity $user.SamAccountName -Properties *

  # Find user to copy group membership from
  $userToCopyFrom = Get-UserToCopyGroupsFrom -user $createdUser -company $company

它仅返回一个用户,选择最后创建的帐户并在复制组成员身份之前要求确认。

  If ($userToCopyFrom) {
    # Copy group membership from user?

    $title = "Copy group membership?"
    $message = "Do you want to copy the group membership from " + $userToCopyFrom.name + " ?"

    $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Yes"
    $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "No"

    $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no)
    $copyMembership = $host.ui.PromptForChoice($title, $message, $options, 0) 

    if ($copyMembership -eq 0 -and $whatIf -eq $false) {
      Set-GroupMemberShip -user $user.SamAccountName -copyFrom $userToCopyFrom.SamAccountName -whatIf $whatIf
    }
    if ($whatIf) {
      Write-Host "Copy group memberships from $userToCopyFrom.SamAccountName"
    }
  }

发送电子邮件

创建新用户帐户过程的一部分也是通知管理员帐户已创建。如果需要,您甚至可以将其扩展到人力资源部门和服务台。

为了发送电子邮件,我们使用电子邮件模板,它是一个包含占位符的 HTML 文件。我们可以获取 HTML 文件的内容,并通过使用 PowerShell 中的字符串替换功能,我们可以使用新用户帐户的详细信息修改内容。

$emailBody = Get-EmailTemplate -user $user -Manager $manager
Send-MailtoManager -user $user -manager $manager -EmailBody $emailBody -whatIf $whatIf

强制 Entra Connect 同步

最后一步是强制 Entra Connect 同步,以便新用户帐户立即同步到 Microsoft 365。根据运行脚本的位置,我们可以使用 Start-AdSynSyncCyle cmdlet 或使用 Invoke-Command 运行命令在域控制器上。

  Write-Host "Syncing Azure AD Connect...." -ForegroundColor Cyan
  
  # Run command on local domain controller
  Start-ADSyncSyncCycle -PolicyType Delta

  # Run sync command on remote domain controller
  # Invoke-Command -ComputerName lazy-srv-dc02 -ScriptBlock {Start-ADSyncSyncCycle -PolicyType Delta}

总结

使用 New ADUser cmdlet 创建新用户帐户非常简单,但确实需要输入大量信息。因此,当在入门脚本中使用此 cmdlet 时,它的真正威力就会体现出来。

您可以使用我的脚本作为您自己的环境的起点。确保前几次在测试模式下运行它。该脚本将输出它所做的事情,因此您可以检查每个步骤。

希望您喜欢这篇文章,如果您有任何疑问,请在下面发表评论。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯