PowerShell пользователи Active Directory в группе
Предлагаю рассмотреть PowerShell скрипт который выгружает в CSV файл данные активных пользователей (не отключенных) состоящих в группе Active Directory.
Для того, что бы получить данные нужно:
- Запустить скрипт
- Указать имя группы из AD
- Указать директорию для выгрузки. Если директорию не указывать, то выгрузка будет выполнена на диск D:\ с именем файла идентичным указанной группе AD.
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 в администрировании ролей 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
Автоматизация PowerShell в сторонних продуктах
Как узнать общее время работы (uptime) Windows?
Ограничение на количество одновременных сетевых подключений в Windows 10 и 11
Автоматизация любых действий в браузере с помощью PowerShell и Selenium
Настройка режима киоска в Windows 11
Проверка учетных данных пользователя AD из скрипта PowerShell
Как заблокировать программе доступ в Интернет в Windows?
Тест скорости Интернета в Windows из CMD/PowerShell
PowerShell скрипт для проверки совместимости компьютеров с Windows 11
Включаем аудит доступа к папкам и файлам в Windows
Добавление хоста ESXi в VMware vCenter
Копирование (синхронизация) файлов из SharePoint в локальную папку
Создание, удаление, управление точками восстановления в Windows 10 и 11
/ / | |
1 | |
Получить список групп пользователя11.10.2023, 16:10. Показов 1193. Ответов 6 |
/ / | 11.10.2023, 16:10 |
Не по теме: Блин, блинский, все с одного курса, что ли и эти курсы надо бы закрыть 😀 |
/ / | |||||||||||
12.10.2023, 17:57 | 3 | ||||||||||
lKOMBATl, если правильно понял вопрос, то:
Добавлено через 13 минут
|
/ / | ||||||
13.10.2023, 05:47 | 4 | |||||
|
/ / | ||||||
13.10.2023, 10:03 | 5 | |||||
lKOMBATl, добрый! Пробуйте:
|
/ / | |
13.10.2023, 10:53 | 6 |
Так нельзя, после CN скобка лишняя) |
/ / | ||||||
13.10.2023, 12:20 | 7 | |||||
Так нельзя, после CN скобка лишняя) Да, точно! Мерси )))
|
/ / | 13.10.2023, 12:20 |
Добрый день! Уважаемые читатели и гости 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 перед похожими программами:
- Интеграция с PowerShell: Get-ADGroup является частью PowerShell, что позволяет использовать его вместе с другими командлетами и функциями PowerShell для более эффективной автоматизации и управления AD.
- Гибкость фильтрации: командлет предоставляет мощные возможности фильтрации, позволяющие получать только необходимую информацию о группах в AD.
- Широкий набор свойств: Get-ADGroup позволяет получить различные свойства групп, что делает его более гибким и полезным для различных задач.
- Простота использования: благодаря простому синтаксису и интуитивно понятным параметрам, командлет легко использовать, даже для администраторов без опыта работы с PowerShell.
- В целом, командлет 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
Скрипт по очистке списка групп от выключенных учетных записей
Данная задача похожа на ту, что была выше, но тут у нас есть файл со списком групп безопасности Active Directory, к которому мы и будем обращаться в скрипте.
# Указываем путь к файлу со списком групп
$groupsFile = “путь_к_файлу”
# Читаем содержимое файла и помещаем его в переменную
$groups = Get-Content $groupsFile
Создать 10 групп в разных доменах и вложить одну в другую
Задача такая. Есть Корневой домен и дочерний. В дочернем домене нужно создать 10 групп безопасности с шаблонным названием и увеличенным порядковым номером с типом “Глобальная“. В корневом домене тоже создать 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 #Ждем минуту, чтобы корневой домен увидел существование групп в дочернем, иначе будет ошибка

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 $Сессия
Надеюсь вам помогла моя статья, я постарался максимально понятно разделить код на составные части чтобы его части можно было поменять на собственные.
Не секрет, что начиная с первой версии PowerShell, Microsoft пытается сделать из него основной инструмент администрирования Windows. И во многом это получается! Сегодня на простых примерах, мы покажем возможности PowerShell, которые можно использовать для получения различной информации о пользователях Active Directory и их атрибутах.
Примечание. Ранее для получения информации об атрибутах учетных записей пользователей AD приходилось использовать различные инструменты: консоль ADUC (в том числе сохраненные запросы AD), vbs скрипты, утилиту dsquery и т.п. Выбор инструмента обычно основывался на поставленной задачи и способностях администратора в программировании.
Запускаем окно Powershll с правами администратора и импортируем модуль Active Directory командой:
Import-Module activedirectory
Совет. В Windows Server 2012 и выше этот пункт можно пропустить, так как модуль PowerShell Active Directory подключен по-умолчанию.
help Get-ADUser
Чтобы вывести список всех учетных записей домена, выполним команду:
Get-ADUser -filter *
Важно. Не рекомендуется выполнять эту команду в доменах с большим количеством аккаунтов, т.к. возможно перегрузка контроллера домена, предоставляющего данные.
Формат возвращаемого списка не очень удобен для использования, выводится только некоторые основные 10 из более 120 атрибутов и свойств учетных записей пользователей (DN, SamAccountName, Name, SID, UPN и т.д) кроме того, мы видим, что информация о времени последней смены пароля отсутствует.
Get-ADUser -identity tuser -properties *
- PasswordExpired
- PasswordLastSet
- PasswordNeverExpires
Get-ADUser tuser -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires
Теперь в данных пользователя есть информация о дате смены пароля и времени, когда срок пароля истечет. Представим информацию в более удобном табличном виде:
Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires
Чтобы вывести данные пользователей из определенной 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
Таким образом, можно построить таблицу с любыми необходимыми атрибутами пользователей 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