Работа с утилитами командной строки RSAT

Для управления контроллерами домена на базе Эллес в удаленном режиме могут использоваться утилиты командной строки, развернутые в составе набора компонентов Remote Server Administration Tools (RSAT) на участниках домена под управлением ОС Windows Server или ОС Windows.

Их применение в скриптах PowerShell вместо командлетов, предоставляемых модулем ActiveDirectory, позволяет администраторам автоматизировать задачи управления объектами службы каталогов Эллес, в том числе путем доработки существующих скриптов для работы с Active Directory.

Установка компонентов RSAT

Компоненты RSAT доступны на ОС Windows Server 2012 R2, 2016, 2019, 2022 (с ограничениями на Windows Server 2008 R2 и 2012) и ОС Windows 10 и 11 редакций Professional и Enterprise.

Установка на ОС Windows Server

Компоненты RSAT входят в состав дистрибутива серверных ОС семейства Windows.

Утилиты командной строки доступны по умолчанию после установки на сервере роли Active Directory Domain Services (AD DS).

Для установки набора компонентов RSAT на сервере с помощью Server Manager:

  1. В строке меню Server Manager нажмите Manage и выберите Add Roles and Features.

  2. В окнах шагов мастера нажимайте Next до шага Features.

  3. На шаге Features в списке компонентов установите флажок в строке AD DS and AD LDS Tools.

    install rsat server
    Рис. 1. Добавление компонентов RSAT в Server Manager на ОС Windows Server
  4. Нажмите Next.

  5. Нажмите Install в окне подтверждения.

Также для установки компонентов RSAT на сервере с ОС Windows Server может использоваться командлет Install-WindowsFeature. Для этого выполните в консоли PowerShell:

Install-WindowsFeature -Name "RSAT-AD-PowerShell" -IncludeAllSubFeature

Установка на ОС Windows

Для установки компонентов RSAT на ОС Windows 10 (версии 1809 и выше) и 11 редакций Professional и Enterprise добавьте соответствующую возможность в настройках системы (требуется подключение к интернету):

  1. Нажмите Windows Key + I, чтобы открыть окно настроек Windows.

  2. В поле поиска наберите "Add an optional features" и нажмите на ссылку в результатах поиска.

  3. В окне Optional features нажмите на область Add a feature.

  4. В поле ввода наберите "RSAT" и выберите пункт RSAT: Active Directory Domain Services and Lightweight Directory Services.

    install rsat feature
    Рис. 2. Добавление компонентов RSAT в настройках Windows
  5. Нажмите Install и следуйте инструкциям.

Также для установки компонентов RSAT на ОС Windows может использоваться командлет Add-WindowsCapability. Для этого выполните в консоли PowerShell, запущенной от имени администратора:

Add-WindowsCapability –online –Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0

Для установки на ОС Windows 10 версий до 1809 скачайте пакет компонентов RSAT из Microsoft Download Center, запустите файл .msu и следуйте инструкциям.

Состав утилит, поддерживаемые объекты, синтаксис

В частности, вместе с оснастками для управления службами Active Directory в составе компонентов RSAT устанавливается следующий набор утилит командной строки:

  • dsquery — поиск объекта в каталоге по заданным условиям;

  • dsadd — добавление объекта в каталог;

  • dsget — получение атрибутов объекта;

  • dsmod — изменение атрибутов объекта;

  • dsmove — перемещение объекта внутри домена;

  • dsrm — удаление объекта из каталога.

В таблице Табл. 1 приводится список объектов каталога, с которыми работает каждая утилита.

Табл. 1. Поддерживаемые утилитами объекты каталога
Объект dsquery dsadd dsget dsmod dsmove dsrm

Computer

+

+

+

+

+

+

Contact

+

+

+

+

+

+

Group

+

+

+

+

+

+

OU

+

+

+

+

+

+

Server

+

-

+

+

+

+

User

+

+

+

+

+

+

Subnet

+

-

+

-

+

+

Site

+

-

+

-

+

+

Quota

+

+

+

+

+

+

Partition

+

-

+

+

+

+

Пример синтаксиса вызова утилиты командной строки:

dsadd user “cn=Ivan Ivanov,ou=HQEmployees,dc=domain,dc=name” -disabled no –pwd KtfdKqhu6x -mustchpwd yes -memberof cn=Sales,ou=HQEmployees,dc=domain,dc=name -acctexpires never

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

В примере используются параметры:

  • -disabled — признак возможности входа в домен с использованием созданной учетной записи (no в примере — вход разрешен);

  • –pwd — пароль для учетной записи;

  • -mustchpwd — признак необходимости смены пароля при входе в домен (yes в примере – смена обязательна);

  • -memberof — добавление учетной записи в указанные группы (в примере пользователь добавляется в группу Sales в подразделении HQEmployees);

  • -acctexpires — период действия учетной записи (never в примере — период действия не ограничен).

Для получения информации о доступных подкомандах и их параметрах используйте следующий синтаксис:

dsrm /?
dsadd group /?

Автоматизация типовых задач администрирования

В таблице Табл. 2 приводятся примеры некоторых типов задач администрирования, для автоматизации которых вместо командлетов PowerShell могут использоваться утилиты командной строки.

Табл. 2. Примеры замены командлетов PowerShell вызовами утилит командной строки
Типовая задача администрирования Командлет PowerShell Команда для вызова утилиты командной строки

Создание нового пользователя

New-ADUser -Name <User>

dsadd user <UserDN>

Поиск пользователя по атрибуту sAMAccountName или уникальному имени (DN) и просмотр его атрибутов

Get-ADUser -Identity <User>

dsquery user <UserDN>

Разблокировка учетной записи пользователя

Unlock-ADAccount -Identity <User>

dsmod user <UserDN> -disabled no

Отключение учетной записи пользователя

Disable-ADAccount -Identity <User>

dsmod user <UserDN> -disabled yes

Удаление учетной записи пользователя

Remove-ADUser –Identity <User>

dsrm <UserDN> -noprompt

Сброс пароля пользователя

Set-ADAccountPassword -Identity <UserDN> -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "<New Password>" -Force) | Set-ADuser -ChangePasswordAtLogon $True

dsmod user <UserDN> -pwd <New Password> -mustchpwd yes

Получение информации о группах, в которые входит пользователь

Get-ADUser -Identity <User> -Properties memberof | Select memberof -expandproperty memberof

dsget user <UserDN> -memberof -expand

Добавление пользователя в группу

Add-ADGroupMember -Identity <Group> -Members <Member>

dsadd group <GroupDN> -members <Member>

Получение информации о составе группы

Get-ADGroupmember -Identity <Group> | select samaccountname,name,sid

dsget group <GroupDN> -members -expand

Перемещение пользователя в подразделение

Get-ADUser <User> | Move-ADObject -TargetPath <NewOuDN>

dsmove <UserDN> -newparent <NewOuDN>

Получение списка подсетей леса

Get-ADReplicationSubnet -Filter * -Properties Name,site,location,description

dsquery * "CN=Subnets,CN=Sites,CN=Configuration,<RootDomainDN>" -limit 0 -attr cn siteObject description location

Пример использования в скрипте PowerShell

Для демонстрации возможных замен командлетов PowerShell вызовами утилит командной строки далее приводится скрипт, который создает в каталоге учетные записи пользователей.

Скрипт автоматизирует следующие операции:

  1. Считывает информацию о новых пользователей из указанного файла в текстовом формате.

  2. Создает учетные записи пользователей на основе информации из файла.

  3. Добавляет пользователей в указанные в файле группы.

В процессе работы скрипта формируется файл отчета о результатах работы в том же каталоге, в котором находится файл со списком пользователей.

Скрипт может работать в двух режимах — используя командлеты PowerShell модуля ActiveDirectory или вызывая утилиты командной строки RSAT.

Перед использованием скрипта:

  1. Создайте текстовый файл в кодировке UTF-8, в котором каждая строка содержит следующий набор полей, разделенных символами табуляции: Ф. И. О., имя учетной записи (sAMAccountName), компания, email, пароль, группа.

    Пример файла users.txt:

    Иван Иванович Иванов	IvanovII	"ООО ""Дивный сад"""	Ivan.Ivanov@divnysad.ru	KtfdKqhu6x	INNO-Sputnik-Russia-Users-SRC
    Ахмедова Диана Расуловна	AkhmedovaDR	"ООО ""TEMIR QAHRAMON"""	Diana.Akhmedova@temirqahramon.uz	T8YnJzqtir	INNO-Sputnik-Uzbekistan-Users-SRC
    Роман Романович Романов	RomanovRR	"ООО ""Минск-13"""	Roman.Romanov@minsk13.ru	4WE5pTUTNH	INNO-Sputnik-Belarus-Users-SRC
  2. Создайте в корне домена подразделение с двумя дочерними подразделениями Users и Groups любым доступным способом.

    Например, используйте утилиту dsadd на участнике домена под управлением ОС Windows с установленными компонентами RSAT, указав при необходимости адрес сервера контроллера домена и данные учетной записи с правами администратора домена:

    PS C:\Users\Administrator> dsadd ou ou=INNOTECH,dc=domain,dc=name -s 172.19.172.147 -u Administrator -p P@ssw0rd
    dsadd succeeded:ou=INNOTECH,dc=domain,dc=name
    PS C:\Users\Administrator> dsadd ou ou=Groups,ou=INNOTECH,dc=domain,dc=name -s 172.19.172.147 -u Administrator -p P@ssw0rd
    dsadd succeeded:ou=Groups,ou=INNOTECH,dc=domain,dc=name
    PS C:\Users\Administrator> dsadd ou ou=Users,ou=INNOTECH,dc=domain,dc=name -s 172.19.172.147 -u Administrator -p P@ssw0rd
    dsadd succeeded:ou=Users,ou=INNOTECH,dc=domain,dc=name
  3. Убедитесь, что подразделения созданы корректно:

    • на участнике домена под управлением ОС Windows:

      PS C:\Users\Administrator> dsquery ou ou=INNOTECH,dc=domain,dc=name -s 172.19.172.147 -u Administrator -p P@ssw0rd
      "OU=INNOTECH,DC=domain,DC=name"
      "OU=Groups,OU=INNOTECH,DC=domain,DC=name"
      "OU=Users,OU=INNOTECH,DC=domain,DC=name"
    • на контроллере домена Эллес:

      samba-tool ou listobjects OU=INNOTECH -H ldap://elles-dc.domain.name
      OU=Users,OU=INNOTECH
      OU=Groups,OU=INNOTECH

Запустите скрипт одним из двух способов:

  • отредактируйте приведенный ниже текст скрипта, указав требуемые значения в блоке параметров в соответствии с комментариями, и выполните его в терминале Windows PowerShell или среде Windows PowerShell ISE на участнике домена под управлением ОС Windows:

    Пример скрипта для добавления учетных записей пользователей из файла
    #$MODE = 1                       # Раскомментируйте, чтобы использовать командлеты PowerShell
                                     # для создания объектов на WIN DC.
    $MODE = 2                        # Раскомментируйте, чтобы использовать утилиты командной строки
                                     # для создания объектов на ELLES DC и WIN DC.
    $ServAddr = "172.19.172.147"     # Укажите IP-адрес или FQDN сервера контроллера домена
                                     # (WIN DC, если MODE = 1; ELLES DC, если MODE = 2).
    $Admacc = "ROOT\Administrator"   # Укажите учетную запись с правами администратора домена.
    $AdmPass = "P@ssw0rd"            # Укажите пароль учетной записи.
    $UsersFile = "c:\Temp\users.txt" # Укажите путь к файлу с данными пользователей и его имя.
    #$HeadLine = $True               # Раскомментируйте, если первая строка файла содержит названия полей.
    $HQ = "INNOTECH"                 # Укажите имя созданного подразделения,
                                     # в которое будут добавлены пользователи и группы.
    
    $Tab = "`t"
    $UsersTXT = Get-Content -Path $UsersFile  -encoding UTF8
    $Logdir = ""
    if ($UsersFile.contains(“\”)) {
        $i = $UsersFile.LastIndexOf("\")
        $Logdir = $UsersFile.Substring(0,$i+1)
    }
    $Log = $Logdir+"AddUsers.log"
    get-date -Format d.M.yyyy.hh.mm > $Log
    
    #  Получаем имя домена в форматах DN & FQDN
    Switch ($MODE) {
    1   { #  WIN
           $Domain =(get-addomain).DistinguishedName
           $DNSRoot = (get-addomain).DNSRoot
        }
    2   { # ELLES
           $DNSRoot = & cmd.exe /C ECHO %USERDNSDOMAIN%
           $Domain = "DC="+$DNSRoot.Replace(".",",DC=")
        }
    } # end Switch
    
    $UsersOU ="OU=Users,OU="+$HQ+","+$Domain
    $GroupsOU ="OU=Groups,OU="+$HQ+","+$Domain
    $Users = @()
    
    $i = 0
    :GetByString foreach ($string in $UsersTXT)
    {
        $i +=1
        if (($i -eq 1) -and $HeadLine) { Continue GetByString }
        $User = "" | select FIO,Account,Company,Email,Pass,Group
        $Fields = $string.split($Tab)
        $User.FIO = $Fields[0] -Replace '\s+', ' '   # Replace multiple white space
        $User.Account = $Fields[1]
        $User.Company = $Fields[2]
        $User.Email = $Fields[3]
        $User.Pass = $Fields[4]
        $User.Group = $Fields[5]
        $FIO = $Fields[0].Split(" ")
        $UPN = $User.Account + "@" + $DNSRoot
        if ($FIO.count -gt 2) {
            $Otch = $FIO[2].Substring(0,1)
        } else { $Otch = " "}
    
    # Создаем УЗ пользователя
        $NewUser = $False
        $UserDN = "CN="+$User.FIO+","+$UsersOU
        $Res = ""
        Switch ($MODE) {
        1   { #  WIN
            try { # New User Create
                new-aduser -Path $UsersOU -Name $User.FIO -GivenName $FIO[1] -Surname $FIO[0] -SamAccountName $User.Account -Company $User.Company -UserPrincipalName $UPN -EmailAddress $User.Email -Initials $Otch -DisplayName $User.FIO -AccountPassword (ConvertTo-SecureString $User.Pass -AsPlainText -Force) -Enabled $True
                $User.Account+$tab+"учетная запись создана" #>> $Log
                $Res = "Test"
                $NewUser = $True
            } catch [Microsoft.ActiveDirectory.Management.ADPasswordComplexityException] {
                $User.Account+$tab+"учетная запись создана, но отключена: "+$Error[0].exception.message >> $Log
                $NewUser = $True
            } catch {
                $ErMess = $Error[0].exception.message
                $User.Account+$tab+"учетная запись не создана:"+$tab+$Error[0].exception.message >> $Log
            }
        }
        2   { # ELLES
            $Res = & dsadd user $UserDN -samid $User.Account -pwd $User.Pass -fn $FIO[1] -ln $FIO[0] -mi $Otch -company $User.Company -display $User.FIO -mustchpwd no -upn $UPN -email $User.Email -s $ServAddr -u $Admacc -p $AdmPass
            if ($Res.Length -gt 0)
            {
                $User.Account+$tab+"учетная запись создана" >> $Log
                $NewUser = $True
            } else {
                $Res = & dsquery user $UserDN -disabled -s $ServAddr -u $Admacc -p $AdmPass
                if ($Res.length -gt 0)
                {
                    $User.Account+$tab+"учетная запись создана, но отключена: "+$Error[0].exception.message >> $Log
                    $NewUser = $True
                } else {$User.Account+$tab+"!>учетная запись не создана:"+$tab+$Error[0].exception.message >> $Log}
            }
        }
        } # end Switch
    
        # Проверяем наличие в домене группы, в которую должен быть включен пользователь
        if ($NewUser -ne $True) {Continue GetByString}
        $TestGroup = $null
        Switch ($MODE) {
        1   { #  WIN
                try {
                    $TestGroup = Get-ADGroup -Identity $User.Group -ErrorAction SilentlyContinue
                } catch {}
            }
        2   { # ELLES
                $GroupExist = & dsquery group domainroot -name $User.Group -s $ServAddr -u $Admacc -p $AdmPass
                if ($GroupExist.length -gt 0)
                {
                    $TestGroup = $GroupExist
                }
            }
        } # end Switch
        if ($TestGroup -eq $null) # если группы нет, - пробуем создать
            {
                Switch ($MODE) {
                1   { #  WIN
                        try
                        {
                             New-ADGroup -Path $GroupsOU -Name $User.Group -GroupCategory Security -GroupScope Global -DisplayName $User.Group
                             $GroupsOU +$tab+$User.Group
                        } catch {
                             $User.Account+$tab+"учетная запись не добавлена в группу"+$tab+$User.Group+$tab+"поскольку группа с таким именем не найдена, при попытке создать - ошибка: "+$Error[0].exception.message >> $Log
                             $Error[0].exception.message
                             Continue GetByString
                        }
                    }
                2   { # ELLES
                        $NewGroupDN = "CN="+$User.Group+","+$GroupsOU
                        $ResAddGroup = & dsadd group $NewGroupDN -s $ServAddr -u $Admacc -p $AdmPass
                        if ($ResAddGroup.length -eq 0) {
                            $User.Account+$tab+"!> не удалось создать группу"+$tab+$User.Group+$tab+", - ошибка: "+$Error[0].exception.message >> $Log
                            Continue GetByString
                        }
                    }
                } # end Switch
            }
    # Включаем пользователя в группу
            Switch ($MODE) {
            1   { #  WIN
                    try {
                        Add-ADGroupMember -Identity $User.Group -Members $User.Account
                        $User.Account+$tab+"учетная запись добавлена в группу "+$User.Group >> $Log
                    } catch {
                        $User.Account+$tab+"учетная запись не добавлена в группу+$tab+ "+$User.Group+$tab+", ошибка: "+$Error[0].exception.message >> $Log
                    }
                }
            2   { # ELLES
                   $ResGroupMod = & dsmod group $NewGroupDN -addmbr $UserDN -s $ServAddr -u $Admacc -p $AdmPass
                   if ($ResGroupMod.length -gt 0) {
                       $User.Account+$tab+"учетная запись добавлена в группу"+$tab+$User.Group >> $Log
                   } else {
                       $User.Account+$tab+"Error when add to group"+$tab+$Error[0].exception.message  >> $Log
                   }
                }
            } # end Switch
    }
  • скачайте вариант скрипта, предназначенный для запуска в командной строке PowerShell, и вызовите его в следующем формате:

     .\add_users_from_file_demo.ps1 -MODE {1|2} -ServAddr <DC IP | DC FQDN> -Admacc <AdminAcc> -AdmPass <AdminPassword> -UsersFile <FilePath> -HQ <OU>

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

    • -MODE — режим работы скрипта:

      • 1 — использование командлетов PowerShell для добавления пользователей на контроллере домена под управлением ОС Windows Server;

      • 2 — использование утилит командной строки RSAT для добавления пользователей на контроллере домена Эллес или под управлением ОС Windows Server;

    • -ServAddr — IP-адрес или полное доменное имя (FQDN) сервера контроллера домена;

    • -Admacc — имя пользователя с правами администратора домена;

    • -AdmPass — пароль пользователя с правами администратора домена;

    • -HeadLine (необязательный) — признак наличия в файле строки заголовка:

      • $true или 1 — в файле присутствует строка заголовка, которую требуется игнорировать;

      • $false или 0 (по умолчанию) — в файле отсутствует строка заголовка.

    Например:

     .\add_users_from_file_demo.ps1 -MODE 2 -ServAddr 172.19.172.147 -Admacc ROOT\Administrator -AdmPass P@ssw0rd -UsersFile c:\Temp\users.txt -HQ INNOTECH

Убедитесь, что группы и пользователи созданы корректно.

  • проверьте содержимое файла отчета AddUsers.log в том же каталоге, где находится файл с данными пользователей; в случае успешного завершения работы скрипта файл должен содержать следующие строки:

    7.8.2024.01.41
    IvanovII	учетная запись создана
    IvanovII	учетная запись добавлена в группу	INNO-Sputnik-Russia-Users-SRC
    AkhmedovaDR	учетная запись создана
    AkhmedovaDR	учетная запись добавлена в группу	INNO-Sputnik-Uzbekistan-Users-SRC
    RomanovRR	учетная запись создана
    RomanovRR	учетная запись добавлена в группу	INNO-Sputnik-Belarus-Users-SRC
  • проверьте состав групп и пользователей на участнике домена с ОС Windows Server или ОС Windows:

    PS C:\Users\Administrator> dsquery * ou=groups,ou=innotech1,dc=domain,dc=name  -limit 0 -scope onelevel -s 172.19.172.147 -u Administrator -p P@ssw0rd
    "CN=INNO-Sputnik-Belarus-Users-SRC,OU=Groups,OU=INNOTECH1,DC=testl,DC=lan"
    "CN=INNO-Sputnik-Uzbekistan-Users-SRC,OU=Groups,OU=INNOTECH1,DC=testl,DC=lan"
    "CN=INNO-Sputnik-Russia-Users-SRC,OU=Groups,OU=INNOTECH1,DC=testl,DC=lan"
    
    PS C:\Users\Administrator> dsquery * ou=users,ou=innotech1,dc=domain,dc=name  -limit 0 -scope onelevel -s 172.19.172.147 -u Administrator -p P@ssw0rd
    "CN=Роман Романович Романов,OU=Users,OU=INNOTECH1,DC=testl,DC=lan"
    "CN=Ахмедова Диана Расуловна,OU=Users,OU=INNOTECH1,DC=testl,DC=lan"
    "CN=Иван Иванович Иванов,OU=Users,OU=INNOTECH1,DC=testl,DC=lan"
  • проверьте состав групп и пользователей на контроллере домена Эллес:

    samba-tool ou listobjects 'OU=Groups,OU=INNOTECH' -H ldap://elles-dc.domain.name
    CN=INNO-Sputnik-Belarus-Users-SRC,OU=Groups,OU=INNOTECH
    CN=INNO-Sputnik-Uzbekistan-Users-SRC,OU=Groups,OU=INNOTECH
    CN=INNO-Sputnik-Russia-Users-SRC,OU=Groups,OU=INNOTECHs
    
    samba-tool ou listobjects 'OU=Users,OU=INNOTECH' -H ldap://elles-dc.domain.name
    CN=Роман Романович Романов,OU=Users,OU=INNOTECH
    CN=Ахмедова Диана Расуловна,OU=Users,OU=INNOTECH
    CN=Иван Иванович Иванов,OU=Users,OU=INNOTECH