Поиск по сайту:

Как использовать командлет New-ADUser в PowerShell


Создание новых пользователей в Active Directory является обычной задачей для системных администраторов. Вы можете сделать это вручную в ADUC, но лучший и более быстрый способ - использовать командлет New-ADUser в PowerShell.

Этот cmdlet позволяет вам создать нового пользователя со всеми необходимыми свойствами. Я предпочитаю использовать сценарий начальной настройки для создания новых пользователей. Это позволяет вам не только создать пользователя, но и назначить группы и лицензии, например.

В этой статье мы рассмотрим, как использовать командлет New-ADUser, и я объясню, как вы можете создать свой собственный скрипт PowerShell для создания новых пользователей, включая бесплатный скрипт, с которого можно начать.

cmdlet New-ADUser

Чтобы создать нового пользователя AD с помощью PowerShell, вам необходимо установить модуль Active Directory PowerShell. Этот модуль установлен по умолчанию на контроллерах домена, но вы также можете установить его на своем рабочем месте. Ознакомьтесь с этой статьей для получения дополнительной информации о том, как его установить.

Cmdlet New-ADUser имеет много параметров. Мы можем задать практически каждое свойство пользователя при создании новой учетной записи. Теперь вам не нужно указывать каждое свойство, вы даже можете создать новую учетную запись пользователя, указав только имя:

New-ADuser -name "Z.Vance"

Но это создаст учетную запись пользователя в стандартном OU пользователей без каких-либо атрибутов. Так что это не совсем реалистичный вариант.

Минимальная информация, необходимая для создания нового пользовательского аккаунта:

  • Имя
  • Фамилия
  • Имя
  • Имя учетной записи Sam
  • УчетнаяЗаписьПользователя
  • Путь (OU)
  • Пароль (Пароль учетной записи)
  • Включено – Истина
  • СменаПароляПриВходе - Истина

В приведённом ниже примере мы зашили информацию в код, но мы также можем использовать командлет Read-Host, чтобы сделать это немного более динамичным, разумеется. Я рекомендую использовать хэш-таблицу и сплэшинг, чтобы сделать код немного более читаемым:

$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 позволяет вам указывать все свойства, которые вам нужны при создании учетной записи пользователя. Вы можете, например, ввести все адресные данные и номера телефонов пользователя, добавив соответствующие параметры:

$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.

Чтобы ввести информацию в extensionattribute1, например, мы можем добавить следующий параметр:

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

Добавление менеджера

Добавление менеджера в учетную запись пользователя в Active Directory позволяет вам, а также вашим пользователям, видеть менеджера человека и прямые подчиненные менеджера, например, в представлениях организации. Чтобы добавить менеджера в новую учетную запись пользователя, нам сначала нужно получить SamAccountName менеджера.

Самый простой вариант - найти менеджера по полному имени. Таким образом, мы можем просто добавить SamAccountName в параметр менеджера при создании новой учетной записи:

$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. Преимущество использования скрипта заключается в том, что вы можете автоматизировать каждый шаг, который необходимо выполнить для полноценного ввода нового пользователя.

Каждая организация уникальна, поэтому я не думаю, что мой скрипт подойдет вам без изменений. Это означает, что вам нужно будет адаптировать скрипт под свои нужды. Именно поэтому я сначала объясню, что именно делает скрипт, и расскажу о некоторых важных шагах. Затем вы сможете скачать скрипт и внести в него изменения.

Итак, при создании новой учетной записи пользователя необходимо выполнить следующее:

  • Получите личные данные нового пользователя. Нам нужны только имя, номер телефона, должность, компания (в случае нескольких офисов) и руководитель.
  • Получите информацию об адресе и т.д. из файла конфигурации
  • Создайте учетную запись пользователя
  • Скопируйте членство в группе от существующего пользователя, который имеет ту же должность и работает в той же компании.
  • Принудительно синхронизируйте Microsoft Entra (если у вас гибридная среда)
  • Отправьте электронное письмо менеджеру, что аккаунт был создан.

Как вы можете видеть из вышеуказанных шагов, мы используем файл конфигурации. Это ничто иное, как файл JSON со всей статической информацией. Он позволяет нам определить несколько филиалов, каждый из которых имеет свою информацию об адресе. Мы также используем его для определения некоторых настроек, таких как пароли.

{
  "SMTP": {
    "address": "lazydev-onmicrosoft-com.mail.protection.outlook.com",
    "from": "Lazy IT Desk <it@a-d.site>",
    "serviceDesk": "it@a-d.site",
    "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.

Мы используем несколько командлетов Read-Host и командлеты Write-Host, чтобы дать несколько рекомендаций:

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) имело такой же формат, как и в адресах электронной почты. Текущий принцип для имени - это имя + фамилия. Например:

  • Джон Доу > johndoe
  • Класс де Врис > klaasdevries

Имя SamAccountName также должно быть уникальным в Active Directory. Если имя уже существует, будет создан следующий альтернативный вариант:

  • Джон Доу > дждо
  • Класс де Врис > кдеврис

Теперь вы можете изменить это, чтобы соответствовать вашей среде.

Если 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 является пользовательской функцией, но она не делает ничего особенного. Она использует распакованную хеш-таблицу, как я показал вам в начале статьи, и командлет New-ADUser для создания пользователя.

Копирование членства в группе

Создав учетную запись пользователя, нам необходимо установить членство группы для нового пользователя. Лучший способ сделать это - скопировать его из существующего пользователя, который имеет ту же должность и работает в той же компании (отделе/филиале).

Первый шаг — получить только что созданную учетную запись пользователя и пользователя, от которого нужно копировать. Функция Get-UserToCopyGroupsFrom будет искать в Active Directory всех пользователей на основании должности и в том же OU. Она, конечно, исключит только что созданного пользователя.

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 или воспользоваться 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 довольно просто, но требует ввода большого количества информации. Поэтому настоящая сила этой команды проявляется при использовании ее в скрипте по вводу в должность.

Вы можете использовать мой скрипт как отправную точку для вашей собственной среды. Убедитесь, что вы запускаете его в тестовом режиме пару раз. Скрипт выведет то, что он делает, чтобы вы могли проверить каждый шаг.

Надеюсь, вам понравилась эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.