Управление группами active directory

PowerShell пользователи Active Directory в группе

Предлагаю рассмотреть PowerShell скрипт который выгружает в CSV файл данные активных пользователей (не отключенных) состоящих в группе Active Directory.

Для того, что бы получить данные нужно:

  1. Запустить скрипт
  2. Указать имя группы из AD
  3. Указать директорию для выгрузки. Если директорию не указывать, то выгрузка будет выполнена на диск D:\ с именем файла идентичным указанной группе AD.

Управление группами active directory
Управление группами active directory
Управление группами active directory
Управление группами active directory

PowerShell скрипт для выгрузки в CSV файл данных активных пользователей состоящих в группе Active Directory


Do {

    cls

    Write-host "
    ==============================
    Автор: Николаев Олег Николаевич
    Site: 3dlan.ru
    Version: 1.1
    ==============================
    " -foregroundcolor DarkGray

    Write-host "Экспорт активных пользователей из указанной группы
    " -foregroundcolor DarkGray

    $groupname = Read-Host -Prompt "Введите группу"
    If ($groupname -eq "") {
        Write-host "Группа не указана.
        Работа скрипта завершена." -foregroundcolor Red
        break
    }

    $i = 1
    
    try {
        $users = Get-ADGroupMember -Identity $groupname | ? {$_.objectclass -eq "user"}
        Write-host "Группа найдена" -foregroundcolor Green
    }
    Catch  { # Выход по ошибке Группа не нашлась
        Write-host "Группа не найдена" -foregroundcolor Red
        break
    }

    foreach ($activeusers in $users) {
    $user = (Get-ADUser -Identity $activeusers -Properties Name, SamAccountName, displayname, department, title | ? {$_.enabled -eq $true} | Select-Object Name, SamAccountName, Department, Title | ForEach-Object {$_.Name + ";" + $_.SamAccountName + ";" + $_.Department + ";" + $_.Title} | Out-String).Trim()

    If (![string]::IsNullOrEmpty($user)) { #$user -ne ""
            "№$i " + $user
            $export += $user + "; `n"
            $i += 1
        }
    }
  
    #cls
    $folder = Read-Host -Prompt "Введите URL
        Нажмите Enter если хотите продолжить экспорт по умолчанию
        Пример: D:\"

    If ($folder -eq "") { $folder = "D:\" }
    Write-host "Экспортировано в: D:\$groupname.csv" -foregroundcolor Yellow
    $export > "$folder$groupname.csv"

    $export = ""
    $folder = ""
    $user = ""
    $groupname = ""
    
    $RepairReinstall = Read-Host -Prompt "
    1: Завершить
    2: Перезапустить
    Введите число:"

        If ($RepairReinstall -eq 1) {
            Write-Host "Завершить" 
            break
        }

        If ($RepairReinstall -eq 2) {
            Write-Host "Перезапуск скрипта" 
        }
}
While ($true)


Комментарии ()

Использование PowerShell для администрирования и автоматизации задач

PowerShell – это командная оболочка и полноценный объектно-ориентированный язык сценариев основанный на .NET, который можно использовать для управления компьютерами и созданий скриптов автоматизации различных задач администрирования. Среда PowerShell предустановлена в Windows.

Команды PowerShell (называются командлеты) можно запускать в командной строке
powershell.exe
(
pwsh.exe
для PowerShell Core 6.7, 7.x), или можно использовать встроенный в Windows редактор сценариев PowerShell ISE (с подсветкой кода, справочником команд, средствами отладки). Еще больше возможностей для работы с кодом PoweShell дает бесплатный редактор Visual Studio Code (VSCode). В консоли PowerShell доступна история выполненных ранее команд.

На данный момент есть две ветки PowerShell:

  • Windows PowerShell до версии 1 — встроенная в Windows классическая версия PowerShell, основанная на .NET Framework. На данный момент PowerShell 5.1 не развивается Microsoft.
  • PowerShell Core x, 7.x — актуальная кроссплатформенная версия PowerShell, основанная на .NET Core. Активно развивается. Эту версию PowerShell нужно устанавливать и обновлять отдельно. Возможна установка на PowerShell Core на Linux.

PowerShell позволяет системным администраторам автоматизировать и управлять различными компонентам дестопных версий Windows, ролями Windows Server, и другими компонентами инфраструктуры Microsoft и сторонними продуктами.

Команды и скрипты PowerShell для системного администратора

PowerShell в администрировании ролей Windows Server

PowerShell – это отличное средство автоматизации настройки и управления платформой Windows Server. Практически все действия, которые вы выполняете с помощью графических оснасток можно сделать с помощью PowerShell. PowerShell значительно упрощает одновременное администрирование десятков и сотен серверов с Windows Server 2022/2019/2016/2012R2.

  • Установка и удаление ролей в Windows Server через PowerShell
  • Файловый сервер: управление общими сетевыми папками с помощью PowerShell
  • Установка, настройка и администрирование роли Remote Desktop Services (RDS): развертывание фермы серверов RDS; настройка шлюза RD Gateway; перенос ролей RDS на другой сервер;
  • Включить поддержку Wi-Fi адаптеров в Windows Server
  • Установка и настройка службы SNMP в Windows
  • Основные команды настройки Windows Server Core из консоли PowerShell
  • Администрирование роли Hyper-V требует наличия установленного PowerShell модуля Hyper-V. Он позволяет: установить Windows в виртуальную машину Hyper-V; настроить автозапуск ВМ; клонирование, экспорт и импорт виртуальных машин в Hyper-V
  • Использование iSCSI дисков в Windows Server
  • Установка и настройка роли DHCP сервера в Windows Server

Администрирование компьютеров Windows 10 и 11 с помощью PowerShell

С помощью PowerShell вы можете конфигурировать различные параметрами в пользовательских операционных системах (Windows 10 и 11):

Использование PowerShell для администрирования Active Directory

Для администрирования леса/домена Active Directory используется модуль RSAT-AD-PowerShell:

Работа с файлами в PowerShell

  • Import-CSV
    ,
    Export-CSV
    – чтение, экспорт данных в CSV файлы из скриптов PowerShell
  • Чтение и запись в Excel файл из PowerShell

Управление Exchange с помощью PowerShell

Командлеты PowerShell это важный инструмент администрирования и автоматизации on-premises Exchange Server и Exchange Online (Microsoft 365). Для подключения к Exchange Online нужно установить модуль EXO. К Exchange Server можно подключиться удаленно с любого компьютера и импортировать командлеты PowerShell для Exchange в свою сессию.

  • Перевод Exchange Server в режим обслуживания, очистка и перемещение логов Exchange
  • Настройка ящиков пользователей: включить/отключить переадресацию почты в ящике Exchange, предоставить права доступа к ящику Exchange или календарю, настроить региональные параметры ящика Exchange; создать/удалить правило в ящике пользователя; поиск и удаление писем в ящиках Exchange; разрешить автоподключение ящиков Exchange в Outlook; включить и настроить автоответ в почтовом ящике
  • Проверить размер почтового ящика, задать квоты в Exchange Server
  • Конвертировать ящик пользователя в общий и наоборот
  • Управление группами рассылок (distribution group)
  • Как удалить или переименовать почтовую базу в Exchange
  • Аудит действий пользователя в ящике Exchange
  • Get-MessageTrackingLog
    анализов журналов доставки писем в Exchange

Удаленное подключение, получение данных с помощью PowerShell

  • Удаленные подключения PowerShell Remoting через SSH
  • Управление компьютерами в рабочей группе из PowerShell
  • Удаленное подключение PowerShell через HTTPS
  • Командлет
    Enter-PSSession
    – создать интерактивную PowerShell сессию с удаленным компьютером
  • Получить имя пользователя на удаленном компьютере
  • Командлет
    Invoke-Command
    запуск команд и скриптов PowerShell на удаленных компьютерах
  • Проверка открытых/закрытых портов на удаленном хосте с помощью PowerShell
  • Invoke-WebRequest
    получить данные с веб страницы, скачать файл с помощью PowerShell
  • Send-MailMessage
    PowerShell командет для отправки писем по протоколу SMTP
:/>  Фильтр Smartscreen защитника Windows 10 — ответы на вопросы

Автоматизация PowerShell в сторонних продуктах

Как узнать общее время работы (uptime) Windows?

Управление группами active directory

user

Ограничение на количество одновременных сетевых подключений в Windows 10 и 11

Управление группами active directory


Автоматизация любых действий в браузере с помощью PowerShell и Selenium

Управление группами active directory


Настройка режима киоска в Windows 11

Управление группами active directory

Проверка учетных данных пользователя AD из скрипта PowerShell

Управление группами active directory


Как заблокировать программе доступ в Интернет в Windows?

Управление группами active directory


Тест скорости Интернета в Windows из CMD/PowerShell

Управление группами active directory


PowerShell скрипт для проверки совместимости компьютеров с Windows 11

Управление группами active directory

Включаем аудит доступа к папкам и файлам в Windows

Управление группами active directory


Добавление хоста ESXi в VMware vCenter

Управление группами active directory


Копирование (синхронизация) файлов из SharePoint в локальную папку

Управление группами active directory


Создание, удаление, управление точками восстановления в Windows 10 и 11

Управление группами active directory


/ /

1

Получить список групп пользователя

11.10.2023, 16:10. Показов 1193. Ответов 6


Author24 — интернет-сервис помощи студентам

/ /

11.10.2023, 16:10

Не по теме:

Блин, блинский, все с одного курса, что ли и эти курсы надо бы закрыть 😀

/ /

12.10.2023, 17:57

3

lKOMBATl, если правильно понял вопрос, то:

PowerShell
1
GetADUser 00333 Properties memberof.memberof..substring.indexof

Добавлено через 13 минут
Ну и если хочется именно через точку с запятой, то:

PowerShell
1
GetADUser 00333 Properties memberof.memberof..substring.indexof join 

/ /

13.10.2023, 05:47

4

PowerShell
1
GetADUser 00333 properties memberof   memberof  memberof    split   ConvertFromStringData.CN  join 

/ /

13.10.2023, 10:03

5

lKOMBATl, добрый! Пробуйте:

PowerShell
1
GetADUser 00333 properties memberof.memberof   GetADObject .name

/ /

13.10.2023, 10:53

6

Цитата
Сообщение от AAT666
Посмотреть сообщение

Так нельзя, после CN скобка лишняя)

/ /

13.10.2023, 12:20

7

Цитата
Сообщение от Wizard333
Посмотреть сообщение

Так нельзя, после CN скобка лишняя)

Да, точно! Мерси )))

PowerShell
1
GetADUser 00333 properties memberof   memberof  memberof    split   ConvertFromStringData.CN  join 

/ /

13.10.2023, 12:20

Управление группами AD через PowerShell

Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В прошлый раз мы с вами “Не удается продолжить выполнение кода, поскольку система не обнаружила VCRUNTIME140.dll“. Идем далее и я хочу с вами сегодня поделиться наработками и скриптами PowerShell, которые помогут вам в управлении группами безопасности Active Directory. Думаю, что многим будет полезен данный материал и вы сможете почерпнуть из него много интересного, что в итоге вам сэкономит кучу времени и позволит прокачать свои навыки и знания.

Что за командлет Get-ADGroup?

Командлет Get-ADGroup является одним из множества командлетов, предоставляемых PowerShell для работы с Active Directory (AD) в операционной системе Windows. Get-ADGroup используется для получения информации о группах в AD. Назначение командлета заключается в том, чтобы позволить администраторам получать информацию о группах в AD, такую как имя группы, ее уникальный идентификатор (GUID), путь, к которому привязана группа, и другие свойства. Это очень полезно для управления группами и выполнения различных задач в AD.

Преимущества командлета Get-ADGroup в Active Directory перед похожими программами:

  1. Интеграция с PowerShell: Get-ADGroup является частью PowerShell, что позволяет использовать его вместе с другими командлетами и функциями PowerShell для более эффективной автоматизации и управления AD.
  2. Гибкость фильтрации: командлет предоставляет мощные возможности фильтрации, позволяющие получать только необходимую информацию о группах в AD.
  3. Широкий набор свойств: Get-ADGroup позволяет получить различные свойства групп, что делает его более гибким и полезным для различных задач.
  4. Простота использования: благодаря простому синтаксису и интуитивно понятным параметрам, командлет легко использовать, даже для администраторов без опыта работы с PowerShell.
  5. В целом, командлет Get-ADGroup является мощным инструментом для работы с группами в Active Directory. Он позволяет получить информацию о группах, управлять ими и автоматизировать различные задачи в AD.

Постановка задачи

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

Для повседневных и базовых задач по управлению группами Active Directory чаще всего используют оснастку “Active Directory Пользователи и компьютеры (ADUC)“, но когда дело касается автоматизации и рутинной работы, то тут в дело вступает язык программирования PowerShell. PowerShell умеет выполнять все действия по управлению группами в домене Active Directory. Чуть ниже мы подробно разберем, как с помощью PowerShell:

  • ✅ Создать новую группу AD
  • ✅ Изменить состав группы AD, добавив или удалив пользователей
  • ✅ Изменить атрибуты группы AD
  • ✅ Получить список пользователей и при желании экспортировать его для дальнейшей обработки
  • ✅ Удаление группы AD

Скрипт по очистке группы от выключенных учетных записей

# Получаем объект группы по имени
$group = Get-ADGroup $groupName

Скрипт Powershell по очистке группы AD от выключенных учеток

Скрипт по очистке списка групп от выключенных учетных записей

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

# Указываем путь к файлу со списком групп
$groupsFile = “путь_к_файлу”

# Читаем содержимое файла и помещаем его в переменную
$groups = Get-Content $groupsFile

Создать 10 групп в разных доменах и вложить одну в другую

Задача такая. Есть Корневой домен и дочерний. В дочернем домене нужно создать 10 групп безопасности с шаблонным названием и увеличенным порядковым номером с типом “Глобальная“. В корневом домене тоже создать 10 доменных групп безопасности с шаблонным названием и увеличенным порядковым номером с типом “Локальная“. Поместить группу из дочернего домена в группу корневого домена на основании имени и порядкового номера. Вот такой пример скрипта:

:/>  Чем открыть ISZ файл в Windows 10, какой программой?

# Шаг 1: Взять путь к OU root.pyatilistnik.org/Groups/Printer/ и положить его в переменную 1
$ouPath1 = “OU=Printer,OU=Groups,DC=root,DC=Pyatilistnik,DC=org”

# Шаг 3: Взять путь к OU Pyatilistnik.org/Groups/Printer и положить его в переменную 2
$ouPath2 = “OU=Printer,OU=Groups,DC=Pyatilistnik,DC=org”

Start-Sleep -Seconds 60 #Ждем минуту, чтобы корневой домен увидел существование групп в дочернем, иначе будет ошибка

Пуе-ADGroup: Создать 10 групп в разных доменах и вложить одну в другую

Время на прочтение

Управление группами active directory

PowerShell – это средство автоматизации разработанное и выпущенное Microsoft в 2006 году на замену Командной строке и её батникам, помимо всего функционала cmd – Powershell обзавелась собственным скриптовым языком с поддержкой классов, объектов, переменных и т.д. По сути с её помощью можно обращаться ко всему функционалу Windows и Windows Server как к объектам и выполнять с ними действия. В статье я расскажу свой опыт, как автоматизировал создание пользователей в домене из писем-заявок в Outlook на удаленном сервере AD.

Планировщик задач
Планировщик задач

Все запланированные задачи в Windows можно посмотреть в “Планировщике задач”, автоматизировать Windows возможно как с его помощью, так и чисто на Powershell, чтобы вывести все текущие задачи необходимо выполнить:

Get-ScheduledJob 

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

Get-ChildItem $HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs

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

$Условие = New-JobTrigger -Daily -At 12AM

Register-ScheduledJob -Name NewAD_User -ScriptBlock {######} -Trigger $Условие

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

#Завершение Outlook
Get-Process | Where-Object {$_.ProcessName -eq "OUTLOOK"} | Stop-Process

Start-Sleep -Seconds 10

# Создание объекта Outlook
$outlook = New-Object -ComObject Outlook.Application

# Получение коллекции папок
$folders = $outlook.Session.Folders.Item("###Ваш адрес почты####").Folders

# Выбор папки "Входящие"
$Входящие = $folders.Item("Входящие")

$Исполнено = $folders.Item("Исполнено")

# Получение последнего письма
$Письма = $Входящие.Items | Sort-Object ReceivedTime -Descending

В данном коде я получаю сортированный по дате список писем из папки “Входящие” и адрес папки “Исполнено” куда я планирую перемещать письма после выполнения скрипта.

foreach ($Письмо in $Письма) {

$lines = $Письмо.Body -split "`n"

#Условие чтения письма
if ($lines[0].Substring(0, 29) -ne "Заявка в IT - Новый сотрудник") {continue}


$Дата_заявки = $lines[0].Substring(32).Trim()
$Фамилия = $lines[2].Substring(18).Trim()
$Имя = $lines[4].Substring(4).Trim()
$Отчество = $lines[6].Substring(9).Trim()
$Отдел = $lines[8].Substring(6).Trim()
$Должность = $lines[10].Substring(10).Trim()
$Организация = $lines[12].Substring(12).Trim()
$Подразделение = $lines[14].Substring(14).Trim()
$Номер_телефона = $lines[16].Substring(15).Trim()
$Мобильный_телефон = $lines[18].Substring(18).Trim()
$Имя_пользователя_для_копирования_групп = $lines[20].Substring(29).Trim()

В данном фрагменте начинается цикл который проходит по каждому письму, преобразует в список строк и получает значения из него, в начале я добавил простую проверку на случай если на выделенный почтовый ящик попадет случайное письмо. Далее самое важное – создание учетки, и в моем случае контакта, на удаленном сервере, для этого используется команда Invoke-Command:

$Сессия = New-PSSession -ComputerName ###Сетевое имя или IP-адресс компа###
$Переменные = Invoke-Command -Session $Сессия -ScriptBlock { 
param(####Все ваши переменные через запятую###)


команды на удаленном компе


return Переменные которые вернуться в массив обьектов "$Переменные"
} -ArgumentList ###Переменные через запятую которые вы передали в параметры###

Переменная “$Переменные” примет, после выполнения команды на удаленном компьютере, переменные, указанные в return – они понадобятся для отправления письма-отчета.

#Транслит имени
function global:Translit {} - Функция принимает кирилицу и возвращает латиницу


$count = 0

#---------------Получаем список пользователей AD-----------------

$adUsers = Get-ADUser -Filter * -Properties UserPrincipalName

#---------------------Создание логина---------------------------

#чтобы транслейтить имя надо написать: $Транслит = Translit($имя)
$Имя_пользователя = Translit($Имя[0] + "." + $Фамилия)
$Отображаемое_имя = "$Фамилия $Имя"


#---------------Проверка на однофамильцев-----------------
while ($adUsers.SamAccountName -like "*$Имя_пользователя*") {
   
   $count = $count + 1
   $Имя_пользователя = Translit($Имя[0] + $count + "." + $Фамилия)
   $Отображаемое_имя = "$Фамилия $Имя $count"

#---------------Создание почты на основе логина-----------------

$Эл_почта = $Имя_пользователя + "@mail"

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

#Пользователь
$Пароль = ConvertTo-SecureString -String "###Пароль###" -AsPlainText -Force
New-ADUser -SamAccountName "$Имя_пользователя" -UserPrincipalName "$Имя_пользователя" -Name $Отображаемое_имя -DisplayName $Отображаемое_имя -GivenName "$Имя" -Surname "$Фамилия" -Title "$Должность" -Mobile "$Мобильный_телефон" -OfficePhone "$Номер_телефона" -EmailAddress "$Эл_почта" -Department "$Отдел" -Company "$Организация" -AccountPassword $Пароль -Enabled $true -Path "OU=ТЕСТ,DC=domen,DC=local"

#Контакт
New-ADObject -Name "$Отображаемое_имя" -Type Contact -Path "OU=ТЕСТ_КОНТАКТЫ,OU=ТЕСТ,DC=domen,DC=local" -OtherAttributes @{DisplayName = $Отображаемое_имя; GivenName = "$Имя"; Sn = "$Фамилия"; Mobile = "$Мобильный_телефон"; Mail = "$Эл_почта";telephoneNumber = "444"; Title = "$Должность"; Department = "$Отдел"; Company = "$Организация"}
$Исходные_группы = Get-ADUser $Имя_пользователя_для_копирования_групп -Properties MemberOf | Select-Object -ExpandProperty MemberOf
foreach ($группы in $Исходные_группы) {
    Add-ADGroupMember -Identity $группы -Members $Имя_пользователя
}

На этом действия на сервере заканчиваются, закрываем скобки, и переходим в локальную сессию, в качестве отчета я отправлю письмо-ответ на адрес отправителя, для этого получаем переменные из объекта сессии и составляем письмо, после чего перемещаем письмо в папку “Исполнено”.

#Получение значений из сессии

$Имя_учетки = $Переменные.GetValue(0)
$Почта = $Переменные.GetValue(1)

#Ответное письмо
$Ответ = $Письмо.ReplyAll()
$Ответ.Body = @"
$Фамилия $Имя $Отчество
$Отдел
$Должность
$Организация
$Имя_учетки
$Почта
$Мобильный_телефон
$Номер_телефона
"@
$Ответ.Send( )
$Письмо.Move($Исполнено)

После завершения цикла, закрываем сессию с сервером и закрываем Outlook, через 10 секунд чтобы письма успели отправиться.

#Завершение сессии
Remove-PSSession -Session $Сессия

#Завершение Outlook
Start-Sleep -Seconds 10
Get-Process | Where-Object {$_.ProcessName -eq "OUTLOOK"} | Stop-Process

Образец моей заявки:

Заявка в IT - Новый сотрудник от 12.04.2024 10:34:49
Описание: Фамилия: Жданов
Имя: Дмитрий
Отчество: Юрьевич
Отдел: Служба Качества
Должность: Контролер пищевой продукции
Организация: АО "Агрофирма "Бунятино"
Подразделение: -
Номер телефона:
Мобильный телефон: -
Пользователь для копирования:

Полный листинг кода:



#----------------Создание сессии------------------------

$Сессия = New-PSSession -ComputerName ServerAD

#-------------------------Чтение почты-----------------------------

#Завершение Outlook
Get-Process | Where-Object {$_.ProcessName -eq "OUTLOOK"} | Stop-Process

Start-Sleep -Seconds 10

# Создание объекта Outlook
$outlook = New-Object -ComObject Outlook.Application

# Получение коллекции папок
$folders = $outlook.Session.Folders.Item("auto-user@agro-holding.ru").Folders

# Выбор папки "Входящие"
$Входящие = $folders.Item("Входящие")

$Исполнено = $folders.Item("Исполнено")

# Получение последнего письма
$Письма = $Входящие.Items | Sort-Object ReceivedTime -Descending


#-------------------------Рабочий алгоритм-----------------------------

#Получение значений переменных из письма
foreach ($Письмо in $Письма) {

$lines = $Письмо.Body -split "`n"

#Условие чтения письма
if ($lines[0].Substring(0, 29) -ne "Заявка в IT - Новый сотрудник") {continue}


$Дата_заявки = $lines[0].Substring(32).Trim()
$Фамилия = $lines[2].Substring(18).Trim()
$Имя = $lines[4].Substring(4).Trim()
$Отчество = $lines[6].Substring(9).Trim()
$Отдел = $lines[8].Substring(6).Trim()
$Должность = $lines[10].Substring(10).Trim()
$Организация = $lines[12].Substring(12).Trim()
$Подразделение = $lines[14].Substring(14).Trim()
$Номер_телефона = $lines[16].Substring(15).Trim()
$Мобильный_телефон = $lines[18].Substring(18).Trim()
$Имя_пользователя_для_копирования_групп = $lines[20].Substring(29).Trim()


#---------------Основная команда создания пользователя на удаленном сервере-----------------

$Переменные = Invoke-Command -Session $Сессия -ScriptBlock { param($Фамилия, $Имя, $Отчество, $Отдел, $Должность, $Организация, $Подразделение, $Номер_телефона, $Мобильный_телефон, $Имя_пользователя_для_копирования_групп)

#---------------Функция транслита-----------------
#Транслит имени
function global:Translit {
param([string]$inString)
$Translit = @{
[char]'а' = "a"
[char]'А' = "a"
[char]'б' = "b"
[char]'Б' = "b"
[char]'в' = "v"
[char]'В' = "v"
[char]'г' = "g"
[char]'Г' = "g"
[char]'д' = "d"
[char]'Д' = "d"
[char]'е' = "e"
[char]'Е' = "e"
[char]'ё' = "yo"
[char]'Ё' = "yo"
[char]'ж' = "zh"
[char]'Ж' = "zh"
[char]'з' = "z"
[char]'З' = "z"
[char]'и' = "i"
[char]'И' = "i"
[char]'й' = "j"
[char]'Й' = "j"
[char]'к' = "k"
[char]'К' = "k"
[char]'л' = "l"
[char]'Л' = "l"
[char]'м' = "m"
[char]'М' = "m"
[char]'н' = "n"
[char]'Н' = "n"
[char]'о' = "o"
[char]'О' = "o"
[char]'п' = "p"
[char]'П' = "p"
[char]'р' = "r"
[char]'Р' = "r"
[char]'с' = "s"
[char]'С' = "s"
[char]'т' = "t"
[char]'Т' = "t"
[char]'у' = "u"
[char]'У' = "u"
[char]'ф' = "f"
[char]'Ф' = "f"
[char]'х' = "h"
[char]'Х' = "h"
[char]'ц' = "c"
[char]'Ц' = "c"
[char]'ч' = "ch"
[char]'Ч' = "ch"
[char]'ш' = "sh"
[char]'Ш' = "sh"
[char]'щ' = "sch"
[char]'Щ' = "sch"
[char]'ъ' = ""
[char]'Ъ' = ""
[char]'ы' = "y"
[char]'Ы' = "y"
[char]'ь' = ""
[char]'Ь' = ""
[char]'э' = "e"
[char]'Э' = "e"
[char]'ю' = "yu"
[char]'Ю' = "yu"
[char]'я' = "ya"
[char]'Я' = "ya"
}
$outCHR=""
foreach ($CHR in $inCHR = $inString.ToCharArray())
{
if ($Translit[$CHR] -cne $Null )
{$outCHR += $Translit[$CHR]}
else
{$outCHR += $CHR}
}
Write-Output $outCHR
}


$count = 0

#---------------Получаем список пользователей AD-----------------

$adUsers = Get-ADUser -Filter * -Properties UserPrincipalName

#---------------------Получение логина---------------------------

#чтобы транслейтить имя надо написать: $Транслит = Translit($имя)
$Имя_пользователя = Translit($Имя[0] + "." + $Фамилия)
$Отображаемое_имя = "$Фамилия $Имя"


#---------------Проверка на однофамильцев-----------------
while ($adUsers.SamAccountName -like "*$Имя_пользователя*") {
   
   $count = $count + 1
   $Имя_пользователя = Translit($Имя[0] + $count + "." + $Фамилия)
   $Отображаемое_имя = "$Фамилия $Имя $count"
}

#---------------Создание почты на основе логина-----------------

$Эл_почта = $Имя_пользователя + "@почта"

#---------------------Добавиление в AD-----------------------------

#Пользователь
$Пароль = ConvertTo-SecureString -String "пароль" -AsPlainText -Force
New-ADUser -SamAccountName "$Имя_пользователя" -UserPrincipalName "$Имя_пользователя" -Name $Отображаемое_имя -DisplayName $Отображаемое_имя -GivenName "$Имя" -Surname "$Фамилия" -Title "$Должность" -Mobile "$Мобильный_телефон" -OfficePhone "$Номер_телефона" -EmailAddress "$Эл_почта" -Department "$Отдел" -Company "$Организация" -AccountPassword $Пароль -Enabled $true -Path "OU=ТЕСТ,DC=bun,DC=local"


#Контакт
New-ADObject -Name "$Отображаемое_имя" -Type Contact -Path "OU=ТЕСТ_КОНТАКТЫ,OU=ТЕСТ,DC=bun,DC=local" -OtherAttributes @{DisplayName = $Отображаемое_имя; GivenName = "$Имя"; Sn = "$Фамилия"; Mobile = "$Мобильный_телефон"; Mail = "$Эл_почта";telephoneNumber = "444"; Title = "$Должность"; Department = "$Отдел"; Company = "$Организация"}


#-----------Копируем группы пользователя из контейнера-------------

$Исходные_группы = Get-ADUser $Имя_пользователя_для_копирования_групп -Properties MemberOf | Select-Object -ExpandProperty MemberOf
foreach ($группы in $Исходные_группы) {
    Add-ADGroupMember -Identity $группы -Members $Имя_пользователя
}

#-----------Возвращение переменных из сессии для ответного письма-------------

return $Имя_пользователя, $Эл_почта, $Фамилия, $Имя, $Отчество, $Отдел, $Должность, $Организация, $Подразделение, $Номер_телефона, $Мобильный_телефон, $Имя_пользователя_для_копирования_групп

} -ArgumentList $Фамилия, $Имя, $Отчество, $Отдел, $Должность, $Организация, $Подразделение, $Номер_телефона, $Мобильный_телефон, $Имя_пользователя_для_копирования_групп

#Получение значений из сессии

$Имя_учетки = $Переменные.GetValue(0)
$Почта = $Переменные.GetValue(1)

#Ответное письмо
$Ответ = $Письмо.ReplyAll()
$Ответ.Body = @"
$Фамилия $Имя $Отчество
$Отдел
$Должность
$Организация
$Имя_учетки
$Почта
$Мобильный_телефон
$Номер_телефона
"@
$Ответ.Send( )
$Письмо.Move($Исполнено)

}

#Завершение Outlook
Start-Sleep -Seconds 10
Get-Process | Where-Object {$_.ProcessName -eq "OUTLOOK"} | Stop-Process

#Завершение сессии
Remove-PSSession -Session $Сессия

Надеюсь вам помогла моя статья, я постарался максимально понятно разделить код на составные части чтобы его части можно было поменять на собственные.

:/>  11 способов управления запущенными процессами с помощью диспетчера задач в windows 10 - Производительность - 2021

Не секрет, что начиная с первой версии PowerShell, Microsoft пытается сделать из него основной инструмент администрирования Windows. И во многом это получается! Сегодня на простых примерах, мы покажем возможности PowerShell, которые можно использовать для получения различной информации о пользователях Active Directory и их атрибутах.

Примечание. Ранее для получения информации об атрибутах учетных записей пользователей AD приходилось использовать различные инструменты: консоль ADUC (в том числе сохраненные запросы AD), vbs скрипты, утилиту dsquery и т.п. Выбор инструмента обычно основывался на поставленной задачи и способностях администратора в программировании.

Запускаем окно Powershll с правами администратора и импортируем модуль Active Directory командой:

Import-Module activedirectory

Совет. В Windows Server 2012 и выше этот пункт можно пропустить, так как модуль PowerShell Active Directory подключен по-умолчанию.

RSAT включить модуль Active Directory Module for Windows PowerShell

help Get-ADUser

Чтобы вывести список всех учетных записей домена, выполним команду:

Get-ADUser -filter *

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

Get-ADUser -filter * - вывести список всех пользователей в ADФормат возвращаемого списка не очень удобен для использования, выводится только некоторые основные 10 из более 120 атрибутов и свойств учетных записей пользователей (DN, SamAccountName, Name, SID, UPN и т.д) кроме того, мы видим, что информация о времени последней смены пароля отсутствует.

Get-ADUser -identity tuser -properties *
  • PasswordExpired
  • PasswordLastSet
  • PasswordNeverExpires
Get-ADUser tuser -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires

Get-ADUse - время смены и истечения срока действия пароля в ADТеперь в данных пользователя есть информация о дате смены пароля и времени, когда срок пароля истечет. Представим информацию в более удобном табличном виде:

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires

Get-ADUser - табличное преставление о свойствах пользователейЧтобы вывести данные пользователей из определенной OU, воспользуемся параметром SearchBase:

Get-ADUser -SearchBase ‘OU=Moscow,DC=winitpro,DC=loc’ -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires

Результат выполнения команды можно выгрузить в текстовый файл:

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires > C:\temp\users.txt

Или в CSV, который в дальнейшем будет удобно экспортировать в Excel (дополнительно с помощью sort-object отсортируем таблицу по столбцу PasswordLastSet , а также добавим условие where – имя пользователя должно содержать строку «Dmitry»):

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | where {$_.name –like “*Dmitry*”} | sort-object PasswordLastSet | select-object Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires | Export-csv -path c:\temp\user-password-expires-2015.csv

Get-ADUser с условием where и сохранением в csv

Таким образом, можно построить таблицу с любыми необходимыми атрибутами пользователей Active Directory.

Совет.  Для получения данных о компьютерах Active Directory используется командлет Get-ADComputer.

Далее приведем еще несколько полезных вариантов запросов о пользователях Active Directory с помощью различных фильтров. Вы можете их комбинировать для получения необходимого списка пользователей AD:

Вывод пользователей AD, имя которых начинается с Roman:

Get-ADUser -filter {name -like "Roman*"}

Чтобы подсчитать общее количество всех аккаунтов в Active Directory:

Get-ADUser -Filter {SamAccountName -like "*"} | Measure-Object

Список всех активных (не заблокированных) учетных записей в AD:

Get-ADUser -Filter {Enabled -eq "True"} | Select-Object SamAccountName,Name,Surname,GivenName | Format-Table

Список учетных записей с истекшим сроком действия пароля:

Get-ADUser -filter {Enabled -eq $True} -properties passwordExpired | where {$_.PasswordExpired}

Список активных учеток с почтовыми адресами:

Get-ADUser -Filter {(mail -ne "null") -and (Enabled -eq "true")} -Properties Surname,GivenName,mail | Select-Object Name,Surname,GivenName,mail | Format-Table

Задача: для списка учетных записей, которые хранятся в текстовом файле (по одной учетке в строке) нужно получить телефон пользователя в AD и выгрузить информацию в текстовый csv файл (можно легко импортировать в Esxel).

Import-Csv c:\ps\usernsme_list.csv | ForEach {
Get-ADUser -identity $_.user -Properties Name, telephoneNumber |
Select Name, telephoneNumber |
Export-CSV c:\ps\export_ad_list.csv -Append -Encoding UTF8
}

Следующий пример позволяет выгрузить адресную книгу предприятия в виде csv файла, который в дальнейшем можно импортировать в Outlook или Mozilla Thunderbird:

Get-ADUser -Filter {(mail -ne "null") -and (Enabled -eq "true")} -Properties Surname,GivenName,mail | Select-Object Name,Surname,GivenName,mail | Export-Csv -NoTypeInformation -Encoding utf8 -delimiter "," $env:temp\mail_list.csv

Пользователи, которые не меняли свой пароль в течении последних 90 дней:

$90_Days = (Get-Date).adddays(-90)
Get-ADUser -filter {(passwordlastset -le $90_days)}

Чтобы получить фотографию пользователя из Active Directory и сохранить ее в jpg файл:

$user = Get-ADUser winadmin -Properties thumbnailPhoto
$user.thumbnailPhoto | Set-Content winadmin.jpg -Encoding byte

Список групп, в которых состоит учетная запись пользователя

Get-AdUser winadmin -Properties memberof | Select memberof -expandproperty memberof

Оставьте комментарий