- Как через Powershell получить список пользователей AD с Get-ADUser
- Поиск и фильтрация списка пользователей AD в Powershell Get-ADUser -Filter
- Получение списка пользователей Active Directory в Powershell Get-User из нескольких OU
- Выгрузка пользователей из AD в Excel с Powershell
- Получение Email пользователя AD в Powershell
- Получение списка пользователей чей срок действия пароля истек в Powershell
- Как получить список локальных пользователей в Powershell и создать нового
- Получение списка локальных пользователей в Powershell Get-ADUser
- Создание локального пользователя Powershell и добавление в группу
- Удаление локальных пользователей
- Смена пароля локального администратора в Powershell
- Получаем в Powershell активных сессий пользователей AD и их компьютеров
- Как получить список залогиненных пользователей
- Локально при входе пользователя
- Системная утилита quser.exe
- Через файл ntuser.dat
- Через WMI
Как через Powershell получить список пользователей AD с Get-ADUser
01 августа 2019
Get-ADUser команда, которая возвращает список пользователей AD в Powershell. На самом деле командлет мало чем отличается от тех, которые мы рассматривали раннее с приставкой «Get-AD».
Для работы с командой нам понадобится Powershell Active Directory Module.
Так мы вернем всех пользователей AD:
Если нам нужно найти по имени, сделайте так:
Где вместо Adminis имя вашей учетной записи. Звездочки позволяют искать вхождение где справа и слева могут быть еще символы.
Для получения сведений об одной учетной записи AD есть ключ Identity:
Кроме этого у нас есть дополнительный ключ Properties, который выводит дополнительные свойства у объекта пользователя:
Если мы хотим выполнить Get-ADUser в OU, то для этого есть дополнительный ключ, который может искать в организационных единицах и контейнерах. В моем случае я ищу в OU Moscow и домене domain.local:
Если вам нужно искать в контейнере — используйте CN. Примеры с множеством OU смотрите ниже.
Навигация по посту
Поиск и фильтрация списка пользователей AD в Powershell Get-ADUser -Filter
Мы можем фильтровать по одному или множеству свойств. Для того что бы увидеть все свойства нужно сделать:
В области 1 выделены все имена, по которым мы можем фильтровать. В области 2 тип данных с которыми мы можем сравнивать. Т.е. если тип данных у области 2 string (строка), то это плохая идея сравнивать с числом (int). Нужно сразу отметить, что те свойства, которые мы получаем благодаря ключу Properties мы не можем применять в Filter.
Примеры с Get-Member мы уже рассматривали раньше.
Для примера так мы можем получить всех пользователей, у которых указан город Moscow:
А теперь найдем всех пользователей, которые неверно вводили пароль более одного раза и в они включены:
Т.к. BadLogonCount — это свойство от ключа Properties оно должно проверятся через конвейер в Where.
Еще один пример, но теперь нужно найти пользователя имя которого содержит 0001 и он активен:
Получение списка пользователей Active Directory в Powershell Get-User из нескольких OU
В команде нет встроенных средств поиска в нескольких объектах сразу. Мы можем объявить переменную, содержащую этот список и затем передать через цикл. На моем пример используется контейнер Users и OU Moscow:
Если бы у меня была OU Ekaterinburg в которой находилось OU Marketing написать стоило бы так:
Выгрузка пользователей из AD в Excel с Powershell
Экспорт и выгрузка может быть во множество форматов, но для выгрузки в Excel есть специальный формат CSV. Для того что бы сделать выгрузку достаточно выполнить следующее:
Если мы хотим выгрузить только определенные свойства, то в поле SELECT -Property нужно их перечислить:
Получение Email пользователя AD в Powershell
Нужное свойство мы можем получить через соответствующий ключ Properties. Так я получу почту у конкретного пользователя Administrator:
Выгрузим в CSV имена только тех пользователей у которых нет почты:
Получение списка пользователей чей срок действия пароля истек в Powershell
Для того что бы увидеть все свойства относящиеся к паролям выполните:
И затем, по этому свойству, отфильтруем пользователей:
Как получить список локальных пользователей в Powershell и создать нового
02 августа 2019
Для получения списка локальных пользователей в Powershell, созданию новых, а так же для работ с группами есть множество команд. Что бы увидеть все их выполните команду:
Если нам нужно увидеть параметры, которые команды еще принимают, можно выполнить эту команду (на примере Get-LocalUser):
Навигация по посту
Получение списка локальных пользователей в Powershell Get-ADUser
Так мы получим список учетных записей:
Мы можем получить такую информацию не обо всех учетных записях, а из конкретных групп. Так я получу локальных администраторов т.к. они находятся в соответствующей группе:
Если требуется получить какие-то дополнительные параметры (свойства) объекта. Для того что бы узнать все параметры:
А что бы вывести их все сразу:
Так, например, я получу все объекты, которые активны:
А так даты последнего входа только у тех объектов, которые включены:
Создание локального пользователя Powershell и добавление в группу
Так мы создадим нового пользователя с именем «IT_Support» с паролем «Parol12!»:
Если мы не укажем ключ PasswordNeverExpires — пароль будет действовать месяц.
Затем добавим нового пользователя в группу администраторов:
Ключ Member способен принимать несколько значений, т.е. мы можем добавить множество аккаунтов. Для этого нужно написать их через запятую.
При создании нового объекта есть еще несколько ключей:
- AccountExpires — время активности учетной записи. Если не указан этот ключ, то такого срока нет. Если мы хотим указать этот срок нам нужна переменная datetime. Примеры с датой и временем в Powershell мы уже разбирали.
- AccountNeverExpires — если не указан ключ выше, то у нас работает этот ключ.
- Description — описание учетной записи по желанию.
- Disabled — по умолчанию аккаунт включен, мы можем указать обратное.
- FullName — имя и фамилия например.
- NoPassword — учетная запись создается без пароля.
- UserMayNotChangePassword — запрещает смену пароля.
Удаление локальных пользователей
Для примера так мы можем удалить объект, который создавали раннее из группы:
Если мы хотим отключить объект:
Смена пароля локального администратора в Powershell
Изменение существующих объектов делается с помощью команд с глаголом Set. На примере администратора сменим пароль:
Мы можем изменить все те же параметры, что и в случае создания учетной записи (перечислены выше). Например так мы можем отключить срок действия пароля:
Отсутствуют только те ключи, которые выведены в отдельный командлет. Например так мы можем включить объект:
Получаем в Powershell активных сессий пользователей AD и их компьютеров
Когда появляется необходимость сделать работу на компьютере пользователя, по его заявке, иногда бывает сложно узнать имя компьютера для подключения к нему. В этой статье будет рассмотрена возможность сбора всех активных сеансов пользователей (тех кто прошел аутентификацию на определенном компьютере) на всех компьютерах AD. Конечно, есть сторонние программы, которые решают такие проблемы и встроенные средства, но тут будет рассмотрена реализация через Powershell. Такой список так же хорошо подойдет для аудита, если понадобится быстро узнать кто пользовался компьютером и когда.
Навигация по посту
Как получить список залогиненных пользователей
В Powershell есть несколько методов возврата списка активных пользователей. Каждый из способов имеет свои минусы и поэтому, в зависимости от цели, какой-то способ будет удобнее использовать локально (при входе пользователя), а какой-то удаленно. В случае с WMI это так и не получилось сделать, так нет класса, который бы хранил все нужные значение и работал бы везде.
Локально при входе пользователя
Самый простой способ — это поместить скрипт в планировщик задач, который будет выполняться при входе пользователя в систему. Этот способ не подразумевает удаленной работы. Почти полный скрипт выглядит так:
Можно создать политику, которая будет запускать скрипт при входе и экспортировать в CSV. Сам файл CSV может находится на удаленном компьютере. Следующая команда сделает это записав данные в конец существующий файл (т.е. не перезапишет файл):
Получится примерно следующий вид файла:
Как создавать команды и функции в Powershell вызывать их и передавать параметры
Системная утилита quser.exe
Мы можем использовать системную программу quser, которая возвращает имя текущего пользователя и время его входа. Выглядит это так:
Quser так же может работать удаленно используя следующий синтаксис:
Первая проблема этого способа — это то, что quser работает через RPC. Если вы выполняете команду удаленно, а порты не открыты, вы получите ошибки:
- Error 0x000006BA enumerating sessionnames
- Error [1722]:The RPC server is unavailable.
Для примера, следующие команды исправят эти проблемы на одном компьютере, но скорее всего вы будете менять настройки через политики. Так же обратите внимание, что правило устанавливается на «Any», а не только «Domain»:
Вторая проблема — если вы будете выполнять команду через Invoke-Command, то могут быть проблемы с кодировками:
И третья проблема — у нас возвращается строка, а не объект. Что бы мы могли все эти данные, в дальнейшем, экспортировать (например в CSV), мы должны ее парсить. Это можно сделать так:
Далее нам нужно преобразовать все в специальный массив — PSCustomObject, т.к. только он может быть экспортирован в CSV и представляет собой более удобный вывод:
Метод substring убирает первый символ, так как программа возвращает имя пользователя либо с пробелом начали или символом «>».
Такой скрипт мы можем объединить в один командлет, который сможет работать локально и удаленно:
В функцию добавлено несколько деталей:
- Функция имеет атрибут «ComputerName» в которую можно передать имя компьютера. Т.к. эта переменная является строкой мы не можем использовать одновременно несколько (конвейер передает по одному);
- По умолчанию «ComputerName» выполняет $env:computername, что возвращает имя текущего компьютера;
- Часть команды «quser /server:$ComputerName 2>Null » будет исключать некоторые ошибки, которые связаны с выключенными компьютерами. Иначе — будут выводиться красные сообщения мешающие выводу;
- Добавлено несколько условий, которые различают логические ошибки (например фаервол), физические (компьютер выключен) и условие в случае если все хорошо;
Мы можем вызывать скрипт несколькими приемами:
Отмечу, что в случаях выключенных компьютеров запросы идут очень долго (около 2-3 секунд на компьютер). Способа снизить конкретно таймаут — я не знаю. Один из вариантов ускорить работу — фильтровать вывод с Get-ADComputer исключая отключенные учетные записи компьютеров. Так же можно попробовать использовать параллелизм.
Легче всего такой скрипт запускать на компьютерах пользователей, по событию входа в систему. На примере ниже я экспортирую эти данные в единый, для всех пользователей, файл CSV расположенный в доступности для пользователей:
Сам файл будет выглядеть так:
Отмечу следующие моменты:
- Можно увидеть разницу во времени и датах. У меня одна ОС с американской локализацией, а другая с русской. В принципе у вас таких проблем быть не должно, но можно исправить через Get-Date (парсингом даты);
- Из-за предыдущего пункта у меня бывали проблемы с кодировками, но они самоустранились быстрее, чем я смог предпринять действия.
Через файл ntuser.dat
Каждый раз, как пользователь входит в систему все его настройки загружаются из файла ntuser.dat, который находится в домашнем каталоге ‘C:\Users\UserName\’. При выходе из системы все настройки записываются в этот же файл. То есть мы можем получить имя пользователя по дате изменения этого файла.
В этом примере вернутся все каталоги пользователей:
Получим даты изменения файлов ‘ntuser.dat’:
Извлечем из пути имя пользователя и уберем лишние колонки:
Как вы знаете к большинству компьютеров можно подключится используя следующие пути:
Это же мы можем использовать с командой Get-ChildItem. Соединим все это в функцию:
Далее мы можем использовать команду в таких вариациях:
Ключ ‘-ErrorAction SilentlyContinue’ нужен для игнорирования ошибок связанных с выключенными компьютерами. Если его не написать вы получите ошибки формата:
- Get-ChildItem : Cannot find path ‘\\CL2\C$\Users\’ because it does not exist.
Отмечу несколько моментов:
- В отличие от первого скрипта Get-ChildItem может принимать массивы. Изменив строки на массивы вы можете немного ускорить работу скрипта. То есть вы можете написать
«Get-Childitem -Path ‘\\Computer1\C$\Users’, ‘\\Computer2\C$\Users’ «; - LogoffDate — это отдельный тип данных даты и времени, а это значит, например, что мы можем увидеть кто вышел за последний час/сутки. Пример будет ниже.
- Если вы выполняете команды типа ‘Invoke-Command’ (удаленные команды) — они тоже могут изменить файл ntuser.dat. То есть вы возможно захотите исключить часть пользователей из финального списка. Пример ниже.
Представим, что мы захотим сформировать список из тех пользователей, которые выполнили выход за последний час. Это можно сделать так:
Исключить пользователей мы можем так же:
Экспорт для Excel аналогичен предыдущему примеру:
Get-Date — примеры работы с датой в Powershell
Через WMI
У WMI есть множество классов, которые хранят значения времени входа пользователей и их времена. Например класс ‘Win32_NetworkLoginProfile’ тоже хранит их, но при удаленном использовании — вернет время входа только локальных пользователей, а не доменных. Класс ‘Win32_UserProfile’ — тоже хранит ‘LastUseTime’, но это время не обозначает именно процесс успешного входа после ввода логина и пароля. Класс ‘win32_computersystem’ отображает только имя пользователя.
Я пробовал и другие классы, но каждый со своими проблемами. Решения так и не нашел.