Поиск неактивных пользователей в Active Directory. Поиск неактивных компьютеров в Active Directory

12.05.2019
Published on Февраль 19, 2009 by · Комментариев нет

В этой статье я покажу вам как работают средства по поиску в Active Directory в Windows Vista.

Мне бы хотелось увидеть выражение моего лица, когда кто-то из Microsoft в первый раз сказал мне, что в Vista будет специальный апплет, который позволит пользователям осуществлять поиск в Active Directory. Это был тихий ужас. Сначала мне сразу вспомнились сложные LDAP запросы. Следующая моя мысль была об информации в Active Directory, к которой у пользователей нету бизнес доступа (такие вещи, как SID, группы безопасности (security groups), назначение приложений (application assignments) и т.д.). Паника уступила место размышлениям о том, как я могу отключить эти возможности по поиску, чтобы у держать пользователей в руках. Теперь, когда появилась бэта-версия Vista, у меня появилась возможность взглянуть на этот инструмент, и смею вам доложить, что это очень полезное, практичное и совсем не опасное средство.

Для начала

Перед тем, как я вам покажу инструмент для поиска в Active Directory, я хочу упомянуть об одной вещи. Вы вероятно когда-нибудь слышали о компьютере, скрывающемся под сокращением GIGO (Garbage In, Garbage Out). Принцип GIGO очень справедлив, когда дело касается инструмента для поиска в Active Directory. Когда вы создаете объекты в Active Directory, у вас есть возможность вводить информацию, касающуюся некоторых атрибутов объекта. Например, если вы создаете объект пользователь (user), вы должны ввести обычную информацию, такую как имя пользователя (username) и пароль (password), но вы можете также ввести другую информацию, такую как адрес и номер телефона пользователя.

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

После всего того, что было сказано, давайте посмотрим на инструмент для поиска в Active Directory. Вы можете найти его, открыв Control Panel (панель управления) и нажав на ссылку на Network and Internet (сеть и интернет), которая следует за ссылками Network Center (сетевой центр) и Browse the Network (просмотреть сеть). Теперь вы увидите экран Windows 3.11, который отображает компьютеры внутри домена, как показано ниже на рисунке 1.

Рисунок 1: Сетевой экран содержит ссылку на поиск в Active Directory (Search Active Directory)

Если вы взгляните на верх этого окна, то вы заметите иконку, под названием Search Active Directory. Нажмите на эту ссылку и Windows запустит инструмент для поиска в Active Directory, который показан на рисунке 2.

Рисунок 2: Так выглядит инструмент для поиска в Active Directory

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

Если вы взгляните направо от выпадающего списка Find, то вы увидите, что по умолчанию этот инструмент настроен для поиска по всей Active Directory. Выпадающий список In предоставляет вам возможность поиска в определенном домене.

Пользователи могут выполнить простой запрос в Active Directory, просто задав название или описание объекта, который они ищут и нажав на кнопку Find Now. Например, если я ввожу имя одного из моих пользователей и нажимаю кнопку Find Now, то Vista возвращает список пользователей, контактов и групп, которые соответствуют моему запросу, что показано на рисунке 3. Затем я могу дважды нажать на объект, для просмотра его атрибутов, что показано на рисунке 4.

Рисунок 3: Vista отображает всех пользователей, контакты и группы, которые соответствуют запросу

Рисунок 4: Если вы дважды щелкните на найденном объекте, то Vista отобразить атрибуты объекта

Если рисунок 4 выглядит немного странно, то это благодаря принципу GIGO, о котором я говорил ранее. User1 – это всего лишь тестовая учетная запись в моем домене, поэтому с ним связано не очень много атрибутов. А раз так, то и отображается не слишком много результатов поиска. Именно поэтому важно заполнять дополнительные атрибуты при создании нового объекта. Если бы в этом случае дополнительные атрибуты были заполнены, то мы бы увидели в результатах поиска полную контактную информацию пользователя.

Если вы до сих пор не убедились в необходимости заполнения дополнительных атрибутов для ваших объектов Active Directory, то возможность расширенного поиска (Advanced Search) может изменить ваше мнение. Закладка Advanced, показанная на рисунке 5, позволяет вам выбрать поле, условие и значение для поиска.


Рисунок
5: Закладка Advanced в инструменте Active Directory Search

Выпадающий список Field позволяет вам искать атрибуты специального типа. Например, если вы хотите найти пользователей в определенном городе, то вы можете выбрать опцию User из выпадающего списка Field, а затем выбрать атрибут City, как показано на рисунке 6.

Рисунок 6: Расширенный поиск позволяет вам запускать поиск для отдельных атрибутов Active Directory

Выпадающий список с условиями в основном позволяет вам выбрать оператор для функции. Например, вы можете выбрать условие типа «начинается с » (Starts with), «кончается» (ends with is), «не» (is not), и т.д. Наконец, поле Value позволяет вам вводить критерии для поиска. Например, если вы хотите найти всех пользователей в офисе Майями (Miami office), то вы можете выбрать Users | City (пользователи|город) из выпадающего списка Field. Установите условие (Condition) равным (Exactly), и введите в поле Value критерий поиска, т.е. Miami.

Заключение

Как вы можете увидеть, инструмент для поиска в Active Directory search tool позволяет использовать мощь Active Directory. Пользователи могут извлекать информацию из Active Directory не создавая для этого сложных запросов LDAP.

www.windowsnetworking.com

Смотрите также:

Readers Comments (Комментариев нет)

Да человек я, человек! =)

Exchange 2007

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ...

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ...

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть...

Посвященную использования PowerShell для администрирования AD. В качестве исходного пункта автор решил взять 10 типичных задач администрирования AD и рассмотреть то, как их можно упростить, используя PowerShell:

  1. Сбросить пароль пользователя
  2. Активировать и деактивировать учетные записи
  3. Разблокировать учетную запись пользователя
  4. Удалить учетную запись
  5. Найти пустые группы
  6. Добавить пользователей в группу
  7. Вывести список членов группы
  8. Найти устаревшие учетные записи компьютеров
  9. Деактивировать учетную запись компьютера
  10. Найти компьютеры по типу

Помимо этого автор ведет блог (по PowerShell, конечно), рекомендуем заглянуть - jdhitsolutions.com/blog . А самое актуальное Вы можете получить из его твиттера twitter.com/jeffhicks .
Итак, ниже приводим перевод статьи “Top 10 Active Directory Tasks Solved with PowerShell”.

Управление Active Directory (AD) с помощью Windows PowerShell – это проще, чем Вы думаете, и я хочу доказать Вам это. Вы можете просто взять приведенные ниже скрипты и с их помощью решить ряд задач по управлению AD.

Требования

Чтобы использовать PowerShell для управления AD, нужно соблюсти несколько требований. Я собираюсь продемонстрировать, как командлеты для AD работают на примере компьютера на Windows 7.
Чтобы использовать командлеты, контроллер домена у Вас должен быть уровня Windows Server 2008 R2, или же Вы можете скачать и установить Active Directory Management Gateway Service на наследуемых контроллерах домена (legacy DCs). Внимательно прочитайте документацию перед установкой; требуется перезагрузка КД.
На стороне клиента, скачайте и установите (RSAT) либо для Windows 7 , либо для Windows 8 . В Windows 7, Вам необходимо будет открыть в Панели управления (Control Panel) раздел Программы (Programs) и выбрать Включить или выключить функции Windows (Turn Windows Features On or Off) . Найдите Remote Server Administration Tools и раскройте раздел Role Administration Tools . Выберите подходящие пункты для AD DS and AD LDS Tools, особенно обратите внимание на то, что должен быть выбран пункт Active Directory Module for Windows PowerShell , как показано на рисунке 1. (В Windows 8 все инструменты выбраны по умолчанию). Теперь мы готовы работать.

Рис.1 Включение AD DS и AD LDS Tools

Я вошел в систему под учетной записью с правами доменного администратора. Большинство командлетов, которые я буду показывать, позволят Вам уточнить альтернативные полномочия (credentials). В любом случае я рекомендую прочитать справку (Get-Help ) и примеры, которые я буду демонстрировать ниже.
Начните сессию PowerShell и импортируйте модуль:

PS C:\> Import-Module ActiveDirectory

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

PS C:\> get-command -module ActiveDirectory

Прелесть этих команд в том, что если я могу использовать команду для одного объекта AD, то ее можно использовать для 10, 100 и даже 1000. Посмотрим, как некоторые из этих командлетов работают.

Задача 1: Сброс пароля пользователя

Давайте начнем с типичной задачи: сброс пароля пользователя. Сделать это легко и просто можно через командлет Set-ADAccountPassword . Сложная часть заключается в том, что новый пароль должен быть уточнен как защищенная строка: фрагмент текста, который зашифрован и хранится в памяти на протяжении PowerShell сессии. Во-первых, создадим переменную с новым паролем:
PS C:\> $new=Read-Host "Enter the new password" -AsSecureString

Затем, введем новый пароль:

Теперь мы можем извлечь учетную запись (использование samAccountname лучший вариант) и задать новый пароль. Вот пример для пользователя Jack Frost:

PS C:\> Set-ADAccountPassword jfrost -NewPassword $new

К сожалению, в случае с этим командлетом наблюдается баг: -Passthru , -Whatif , и –Confirm не работают. Если Вы предпочитаете короткий путь, попробуйте следующее:

PS C:\> Set-ADAccountPassword jfrost -NewPassword (ConvertTo-SecureString -AsPlainText -String "P@ssw0rd1z3" -force)

В итоге мне необходимо, чтобы Jack сменил пароль при следующем входе в систему, и я модифицирую учетную запись используя Set-ADUser .

PS C:\> Set-ADUser jfrost -ChangePasswordAtLogon $True

Результаты выполнения командлета не пишутся в консоль. Если это необходимо сделать, используйте –True . Но я могу узнать, успешно или нет прошла операция, произведя извлечения имени пользователя с помощью командлета Get-ADUser и уточнив свойство PasswordExpired , как показано на рисунке 2.


Рис. 2. Результаты работы командлета Get-ADUser Cmdlet со свойством PasswordExpired

Итог: сбросить пароль пользователя с помощью PowerShell совсем не сложно. Признаюсь, что сбросить пароль также просто через оснастку Active Directory Users and Computers консоли Microsoft Management Console (MMC). Но использование PowerShell подходит в том случае, если Вам необходимо делегировать задачу, Вы не хотите разворачивать вышеупомянутую оснастку или сбрасываете пароль в ходе большого автоматизированного ИТ-процесса.

Задача 2: Активировать и деактивировать учетные записи

А теперь давайте деактивируем учетную запись. Продолжим работать с Jack Frost. Этот код использует параметр –Whatif , который Вы можете встретить в других комадлетах, которые осуществляют изменения, чтобы проверить мою команду не запуская ее.

PS C:\> Disable-ADAccount jfrost -whatif What if: Performing operation "Set" on Target "CN=Jack Frost, OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local".

А теперь деактивируем по-настоящему:

PS C:\> Disable-ADAccount jfrost

А когда настанет время активировать учетную запись, какой командлет нам поможет?

PS C:\> Enable-ADAccount jfrost

Эти командлеты могут быть использованы в конвейерном выражении (pipelined expression), позволяя активировать или деактивировать столько учетных записей, сколько душе угодно. Например, этот код деактивирует все учетные записи в отделе продаж (Sales)

PS C:\> get-aduser -filter "department -eq "sales"" | disable-adaccount

Конечно, писать фильтр для Get-ADUser довольно-таки сложно, но именно здесь использование параметра –Whatif вместе с командлетом Disable-ADAccount приходит на помощь.

Задача 3: Разблокировать учетную запись пользователя

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

PS C:\> Unlock-ADAccount jfrost

Командлет также поддерживает параметры -Whatif и -Confirm .

Задача 4: Удалить учетную запись

Неважно, сколько пользователей Вы удаляете, - это просто осуществить с помощью командлета Remove-ADUser . Мне не хочется удалять Jack Frost, но если бы я захотел, то использовал бы такой код:

PS C:\> Remove-ADUser jfrost -whatif What if: Performing operation "Remove" on Target "CN=Jack Frost,OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local".

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

PS C:\> get-aduser -filter "enabled -eq "false"" -property WhenChanged -SearchBase "OU=Employees, DC=Globomantics,DC=Local" | where {$_.WhenChanged -le (Get-Date).AddDays(-180)} | Remove-ADuser -whatif

С помощью этой команды будут найдены и удалены все деактивованные учетные записи подразделения (OU) Employees, которые не менялись в течение 180 и более дней.

Задача 5: Поиск пустых групп

Управление группами – занятие бесконечное и неблагодарное. Существует множество способов найти пустые группы. Некоторые выражения могут работать лучше, чем другие, в зависимости от Вашей организации. Код, приведенный ниже, позволит найти все группы в домене, включая встроенные (built-in).

PS C:\> get-adgroup -filter * | where {-Not ($_ | get-adgroupmember)} | Select Name

Если у Вас есть группы с сотнями членов, тогда использование этой команды может занять много времени; Get-ADGroupMember проверяет каждую группу. Если Вы можете ограничить или настроить, это будет лучше.
Вот еще один подход:

PS C:\> get-adgroup -filter "members -notlike "*" -AND GroupScope -eq "Universal"" -SearchBase "OU=Groups,OU=Employees,DC=Globomantics, DC=local" | Select Name,Group*

Эта команда находит все универсальные группы (Universal groups), которые не имеют членство в OU Groups и выводит некоторые из свойств. Результат приведен на рисунке 3.


Рис. 3. Поиск и фильтрация универсальных групп

Задача 6: Добавление пользователей в группу

Давайте добавим Jack Frost в группу Chicago IT:

PS C:\> add-adgroupmember "chicago IT" -Members jfrost

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

PS C:\> Add-ADGroupMember "Chicago Employees" -member (get-aduser -filter "city -eq "Chicago"")

Я использовал вводное конвейерное выражение (parenthetical pipelined expression), чтобы найти всех пользователей, у которых имеется свойство City в Chicago. Код в скобках выполняется, и полученные объекты передаются в параметр –Member. Каждый пользовательский объект добавляется в группу Chicago Employees. Неважно, имеем ли мы дело с 5 или 5000 пользователей, обновление членства в группах занимает всего несколько секунд. Это выражение может также быть написано с использованием ForEach-Object , что может быть удобнее:

PS C:\> Get-ADUser -filter "city -eq "Chicago"" | foreach {Add-ADGroupMember "Chicago Employees" -Member $_}

Задача 7: Выводим список членов группы

Вы возможно захотите узнать, кто находится в определенной группе. Например, Вы должны периодически узнавать, кто входит в группу доменных администраторов (Domain Admins):

PS C:\> Get-ADGroupMember "Domain Admins"

На рисунке 4 приведен результат.


Рис. 4. Члены группы Domain Admins

Командлет выводит объект AD для каждого члена группы. А что делать с вложенными группами? Моя группа Chicago All Users является коллекцией вложенных групп. Чтобы получить список всех учетных записей, я всего лишь должен использовать параметр –Recursive .

PS C:\> Get-ADGroupMember "Chicago All Users" -Recursive | Select DistinguishedName

Если Вы хотите пойти другим путем – найти, в каких группах пользователь состоит, - используйте свойство пользователя MemberOf :

PS C:\> get-aduser jfrost -property Memberof | Select -ExpandProperty memberOf CN=NewTest,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago Test,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago IT,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago Sales Users,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local

Я использовал параметр -ExpandProperty , чтобы вывести имена MemberOf как строки.

Задача 8: Найти устаревшие учетные записи компьютеров

Мне часто задают этот вопрос: “Как найти устаревшие учетные записи компьютеров?”. И я всегда отвечаю: “А что для вас является устаревшим?” Компании по-разному определяют то, когда учетная запись компьютера (или пользователя, неважно), признается устаревшей и не подлежит дальнейшему использованию. Что касается меня, то я обращаю внимание на те учетные записи, у которых пароли не менялись в течение определенного периода времени. Этот период для меня составляет 90 дней – если компьютер не сменил пароль вместе с доменом за этот период, скорее всего он находится оффлайн и является устаревшим. Используется командлет Get-ADComputer :

PS C:\> get-adcomputer -filter "Passwordlastset -lt "1/1/2012"" -properties *| Select name,passwordlastset

Фильтр замечательно работает с жестким значением, но этот код будет обновляться для всех учетных записей компьютеров, которые не изменили своих паролей с 1 января 2012 года. Результаты приведены на рисунке 5.


Рис. 5. Находим устаревшие учетные записи компьютеров

Другой вариант: предположим, вы хотя бы на функциональном уровне домена Windows 2003. Поставьте фильтр по свойству LastLogontimeStamp . Это значение – число 100 наносекундных интервалов с 1 января, 1601 года, и храниться в GMT, поэтому работа с этим значением слегка сложно:

PS C:\> get-adcomputer -filter "LastlogonTimestamp -gt 0" -properties * | select name,lastlogontimestamp, @{Name="LastLogon";Expression={::FromFileTime ($_.Lastlogontimestamp)}},passwordlastset | Sort LastLogonTimeStamp


Рис. 6. Конвертируем значение LastLogonTimeStamp в привычный формат

Чтобы создать фильтр, мне необходимо конвертировать дату, например, 1 января 2012, в корректный формат. Конвертация осуществляется в FileTime:

PS C:\> $cutoff=(Get-Date "1/1/2012").ToFileTime() PS C:\> $cutoff 129698676000000000

Теперь я могу использовать эту переменную в фильтре для Get-ADComputer :

PS C:\> Get-ADComputer -Filter "(lastlogontimestamp -lt $cutoff) -or (lastlogontimestamp -notlike "*")" -property * | Select Name,LastlogonTimestamp,PasswordLastSet

Приведённый код находит те же самые компьютеры, что были показаны на рисунке 5.

Задача 9: Деактивировать учетную запись компьютера

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

PS C:\> Disable-ADAccount -Identity "chi-srv01$" -whatif What if: Performing operation "Set" on Target "CN=CHI-SRV01, CN=Computers,DC=GLOBOMANTICS,DC=local".

Или же использовав конвейерное выражение:

PS C:\> get-adcomputer "chi-srv01" | Disable-ADAccount

Я также могу использовать мой код, чтобы найти устаревшие учетные записи и все их деактивировать:

PS C:\> get-adcomputer -filter "Passwordlastset -lt "1/1/2012"" -properties *| Disable-ADAccount

Задача 10: Найти компьютеры по типу

Мне также часто задают вопрос, как найти учетные записи компьютеров по типу, например, серверы или рабочие станции. С вашей стороны это требует определенной креативности. В AD нет ничего такого, чтобы отличало сервер от клиента, разве что ОС. Если Ваш компьютер работает под Windows Server 2008, придется слегка сделать несколько дополнительных действий.
Для начала необходимо получить список ОС, а затем осуществляем фильтрацию учетных записей по имеющимся ОС.

PS C:\> Get-ADComputer -Filter * -Properties OperatingSystem | Select OperatingSystem -unique | Sort OperatingSystem

Результаты показаны на рисунке 7.


Рис. 7. Извлечение списка ОС

Я хочу найти все компьютеры, на которых стоит серверная ОС:

PS C:\> Get-ADComputer -Filter "OperatingSystem -like "*Server*"" -properties OperatingSystem,OperatingSystem ServicePack | Select Name,Op* | format-list

Результаты приведены на рисунке 8.

Как и другими командлетами AD Get, Вы можете настроить поисковые параметры и ограничить запрос отдельными OU, если это необходимо. Все выражения, которые я показал, могут быть интегрированы в большие PowerShell выражения. Например, Вы можете сортировать, группировать, применять фильтры, экспортировать в CSV или создавать и отправлять на почту HTML отчеты – и все это из PowerShell! При этом Вам не придется писать ни единого скрипа.
Вот Вам бонус: отчет о возрасте пароля пользователя (user password-age report), сохраненный в HTML файле:

PS C:\> Get-ADUser -Filter "Enabled -eq "True" -AND PasswordNeverExpires -eq "False"" -Properties PasswordLastSet,PasswordNeverExpires,PasswordExpired | Select DistinguishedName,Name,pass*,@{Name="PasswordAge"; Expression={(Get-Date)-$_.PasswordLastSet}} |sort PasswordAge -Descending | ConvertTo-Html -Title "Password Age Report" | Out-File c:\Work\pwage.htm

Хотя это выражение может выглядеть слегка пугающим, при минимальном знании PowerShell им легко воспользоваться. И остается лишь последний совет: как определить кастомное свойство под названием PasswordAge . Значение представляет собой промежуток между сегодняшним днем и свойством PasswordLastSet. Затем я сортирую результаты для моего нового свойства. На рисунке 9 показан выход для моего небольшого тестового домена.

Upd:
В посте приведен перевод статьи на портале

Как найти устаревшие учетные записи компьютеров

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

Через оснастку active directory пользователи и компьютеры

Через ADUC можно получить список компьютер, по такому значению как последнее время изменения, которое по дате совпадает с параметром последнего логирования компьютера в Active Directory. Открываем active directory пользователи и компьютеры. Выбираем пункт сохраненные запросы и нажимаем создать запрос.

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

На вкладке пользователи выбираем пункт «Число дней со времени последнего входа в систему», я ставлю 60 дней, так как считаю, что таких командировок нет и компьютер уже точно не присутствует в локальной сети, и нет смысла хранения его учетной записи в базе контроллера домена.

Все, все параметры заданы и можно строить запрос к базе данных AD.

На выходе я получил список неактивных компьютеров в своей локальной сети, я называю их призраками. Они появляются, либо с поломкой техники, либо из-за халатности администратора. Простой пример системный администратор взял компьютер pyatilistnik01, для переустановки системы, в итоге при попытке ввода его в домен , он получает ошибку, о том, что такой компьютер уже есть и забивает на это, вводя другое имя, либо оставляет имя с генерируемое при установке системы, вида DESKTOP-4BA9AP5. В таких случаях помогает корпоративный стандарт именования компьютеров и автоматическое переименование на основании этих политик.

Зайдя в свойства любого компьютера, перейдите на вкладку объект, и посмотрите поле, изменен, оно будет совпадать по дате с полем LastLogonDate. В итоге я вижу, что данный компьютер не появлялся в сети с 14 ноября 2016 года, что дает мне мысли, о его удалении из базы NTDS.dit .

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

Через Powershell

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

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

$date_with_offset= (Get-Date).AddDays(-120)
$comps = Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate
foreach ($comp in $comps) {set-adcomputer $comp.name -enabled $false; move-adobject -identity $comp -targetpath «ou=Мск Л. рабочие станции на удаление,ou=Местоположение,dc=msk,dc=contoso,dc=com»}
Get-ADComputer -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate | FT Name, LastLogonDate -AutoSize | Out-File c:\Script\services.txt

Тут все отключенные компьютеры будут перемещаться в организационное подразделение Мск Л. рабочие станции на удаление. И далее я сделал, вывод в txt файл, чтобы видеть, какие именно учетные записи были отключены.

Полезные ключи командлета Get-ADComputer

Что вам еще может пригодиться у команды Get-ADComputer, это больше для себя подсказка. Напоминаю, чтобы им воспользоваться, нужно загрузить модуль Active Directory, через команду

Import-Module activedirectory

Теперь можно получить справку по команду Get-ADComputer, через команду:

Get-Help Get-ADComputer

Как видите, у команды очень много ключей и богатые возможности.

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

Get-ADComputer -Identity DESKTOP-2C4R0V6

В данном выводе команды вы увидите основные значения:

  • DistinguishedName
  • SID > кто не вкурсе что такое SID , то смотрите по ссылке.
  • DNSHostName

Если вам вдруг не хватает данных, то вы можете вывести все доступные поля.

Get-ADComputer -Identity DESKTOP-2C4R0V6 -Properties *

МАКСИМ КОСТЫШИН

Аудит учетных записей пользователей в Active Directory

Поводом для появления данной статьи послужила информация, опубликованная в журнале «Windows & .Net Magazine/RE» №5 за 2003 год под названием «Утилита LDIF Directory Exchange», подсказавшая решения, которые можно было использовать для того, чтобы обеспечить необходимый уровень автоматизации при проведении аудита учетных записей пользователей в Active Dircectory. В статье было приведено описание основных возможностей двух утилит Ldifde.exe и Csvde.exe, обеспечивающих добавление, изменение и удаление объектов Active Directory.

Информация, изложенная ниже, ориентирована на использование Windows-платформ и предназначена в основном для людей, отвечающих за вопросы компьютерной безопасности аудиторов, специализирующихся в данной области. Надеемся, что статья будет полезна и людям, профессионально занимающимся администрированием локальных сетей.

Постановка проблемных вопросов

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

О чем идет речь? В организациях, где число сотрудников, работающих с компьютерной техникой, превышает 100 человек, администрированием занимаются, как правило, два-три сотрудника. Не все они, в силу различных обстоятельств, с достаточным педантизмом относятся к работе по внесению во вновь создаваемые учетные записи информации о владельцах. Кроме того, администраторы обычно не включены в список тех сотрудников, которым обязаны сообщать об увольнениях. Два этих обстоятельства являются основными причинами, из-за которых и происходит накопление учетных записей «мертвых душ».

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

Во-первых, лишние записи в списке пользователей, которые могут быть:

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

Во-вторых, к недопустимым можно отнести те учетные записи, которые однозначно не идентифицируют владельца, т.е. дополнительная информация в которых не позволяет назвать человека, определить его должность и подразделение, выяснить, как с ним можно связаться (конечно же, речь здесь не идет о стандартных учетных записях типа «Администратор», «Administrator», «Guest», «Гость», и другие).

И в-третьих, выполнение требований политики безопасности предприятия подразумевает, что усилия и администраторов, и пользователей должны быть направлены на то, чтобы учетная запись использовалась только ее владельцем. То есть, если протокол выполнения операций работы с какой-либо из программ показал, что пользователь вошел под учетной записью Иванова Ивана Ивановича, то абсолютно нерационально будет тратить время на дополнительные разборки с ситуациями, когда выясняется, что учетной записью пользуются (из-за недостаточных знаний компьютера или обычной лени) все сотрудники отдела, в котором трудятся пять человек.

Обзор возможностей по работе с учетными записями

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

Оснастка Active Directory – пользователи и компьютеры (которую можно найти в разделе «Администрирование» на сервере). Замечательная возможность для добавления, редактирования свойств и удаления пользователей домена, но, к сожалению, достаточно бесполезная в вопросах проведения ревизии и аудита. К положительным моментам можно отнести возможность проведения экспорта списка пользователей, в который можно включить такие поля, как – «имя входа пользователя», «имя», «выводимое имя», «фамилия», «изменен». Отметим, что поле «изменен» показывает время и дату последних изменений для учетной записи администратором (производилась коррекция настроек) или владельцем (смена пароля).

Системная утилита Net.exe. С помощью этой утилиты вы можете обеспечить работу с данными конкретного пользователя (вариант вызова – «Net user») – получить дату и время последней регистрации в сети, а также определить, когда завершается срок действия пароля.

Программы-сканеры, задача которых заключается в сборе информации о состоянии локальной сети или конкретного компьютера. Среди наиболее интересных программ в плане получения информации о пользователях отметим CFI LANguard Network Security Scanner (ver 3.1.5). Она предоставляет возможность получения достаточно подробной информации об учетных записях, такой как дата и время последней регистрации; данные о том, когда пароль будет просрочен; количество регистраций пользователя в сети; значение индекса попыток входа с некорректным паролем. Кроме того, программа позволяет на основании данных двух сохраненных протоколов сканирования сформировать отчет о расхождениях и получить перечень заведенных и удаленных учетных записей. Справедливости ради отметим, что программа имеет существенные недостатки, особенно для русскоязычной категории пользователей, так как она некорректно обрабатывает русские названия (в именах и дополнительных параметрах учетных записей и пр.). Кроме того, отсутствует возможность сохранить в отдельном файле информацию о найденных расхождениях в списках учетных записей.

Перейдем теперь к рассмотрению утилит, которые, на наш взгляд, предоставляют возможность получения наиболее полной информации по пользователям – Ldifde.exe и Csvde.exe.

Первая утилита позволяет экспортировать данные из Active Directory в файл формата LDIF. Стандарт файла LDIF определен в рекомендациях RFC-2849 для импорта и экспорта данных из каталогов LDAP, таких как Active Directory. После экспорта данных можно использовать LDIF-файл для импорта тех же объектов в другой каталог LDAP.

Csvde.exe – утилита, аналогичная Ldifde.exe (параметры вызова идентичны), в которой используется другой формат хранения данных в текстовом файле – значения разделяются запятыми (CSV-формат). Данный формат поддерживается программой Microsoft Excel, понимающей файлы в CSV-формате, а также Microsoft Access.

Использование утилиты Csvde.exe

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

csvde -f USERS_WORK.CSV -b GUEST MICROSOFT *

R "(&(objectClass=user)(!(objectClass=computer))(!(userAccountControl=514))(!(userAccountControl=66050)))"

L "DN, memberOf, badPasswordTime, lastLogon, logonCount, sAMAccountName, userAccountControl, whenChanged, whenCreated"

Использование данной команды позволяет сохранить в файле наиболее интересную с точки зрения аудита информацию по действующим (не заблокированным) учетным записям пользователей.

В файл USER_WORK.CSV (параметр -f) будут записаны данные учетных записей пользователей домена. Программа будет производить обработку данных, которые должны быть доступны пользователю GUEST домена MICROSOFT, пароль для которого должен быть введен в процессе выполнения команды (параметр -b).

Из всех объектов LDAP-каталога будут отобраны только учетные записи пользователей, для которых в поле параметра userAccountControl отсутствует информация о блокировке учетной записи (параметр -r). В качестве логических операций для фильтра используются – «!» – логическое НЕТ, «&» – логическое И, «|» – логическое ИЛИ.

В результате выполнения команды в CSV-файле будут сохранены данные полей, перечисленных в параметре -l (список наиболее интересных полей приведен в таблице 1).

Примечание: команда «Net user» некорректно обрабатывает данные поля pwdLastSet, а также некоторые значения времени. Для поля pwdLastSet, в случае если пароль не был задан, выводятся текущие дата и время. Для данных времени вместо значений вида 00:mm AM и 00:mm PM выводятся значения 12:mm AM и 12:mm PM соответственно.

Таблица 1. Описание некоторых полей учетных записей LDAP-каталога

Название поля

Пояснение

Пример хранимых данных

Информация, идентифицирующая учетную запись в каталоге LDAP

CN=Bill Gates,CN=Users,DC=Microsoft,DC=com

memberOf

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

CN=Domain Guests,CN=Users,DC=Microsoft, DC=com;CN=Guests,CN=Builtin,DC=Microsoft, DC=com

lastLogon

Дата и время последнего входа

126340325381029632

badPasswordTime

Дата и время в последний раз был использован неправильный пароль

126334418756267552

pwdLastSet

Дата и время, когда был задан последний пароль

126318831197720512

accountExpires

Дата и время, устанавливающие окончание действия учетной записи

userAccountControl

Содержит несколько параметров учетной записи

66048

(0x10200 = DONT_EXPIRE_PASSWORD+NORMAL_ACCOUNT)

sAMAccountName

Имя, под которым происходит регистрация

Gates

whenChanged

Дата и время, когда происходили последние изменения в учетной записи

20010511052201.0Z

whenCreated

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

20010511052201.0Z

logonCount

Количество регистраций

objectClass

Класс объекта учетной записи

user

Форматы представления данных даты и времени

Если вы были наблюдательны, то заметили, что в таблице 1 имеются два различных варианта представления значений даты и времени.

Если формат вида ГГГГММДДЧЧММСС.0Z (тип GeneralizedTime для ASN.1 кодирования), используемый для полей whenChanged, whenCreated по Гринвичу достаточно понятен, то параметры, такие как lastLogon, pwdLastSet, accountExpires, представляют информацию о дате и времени в 32-битном UNIX-формате, и содержат значения секунд, прошедших начиная с 1 января 1970 г., GMT. Для наглядности приведем некоторые значения, которые могут содержаться в файле выгруженных значений для параметров даты и времени в UNIX-формате:

126858492000000000 – соответствует 1.01.2003 00:00

127014876000000000 – соответствует 1.07.2003 00:00

127014912000000000 – соответствует 1.07.2003 01:00

Использование функций преобразований для данных CSV-формата

Информацию по учетным записям, которая выгружена с помощью команды, аналогичной, указанной в начале раздела «Использование утилиты Csvde.exe», можно попытаться загрузить в Microsoft Access, однако, в связи с тем, что программа некорректно обрабатывает символ-разделитель «,» в структурах типа «CN=Bill Gates,CN=Users, DC=Microsoft,DC=com», то лучше воспользоваться аналогичными возможностями программы Microsoft Excel (см. рис. 1). Далее, информацию для удобства использования можно обработать с помощью имеющихся в Microsoft Excel возможностей (макросы, функций).

На рисунках приведена информация CVS-файла сразу после проведения его загрузки в Microsoft Excel (рис. 1) и после проведенных преобразований (рис. 2). Примеры таких преобразований приведены ниже. Предлагаемые варианты преобразований не претендуют на логическую законченность, но могут являться той основой, с помощью которой за короткий срок может быть разработан необходимый механизм обработки под каждый конкретный случай.

Получение данных из структуры поля DN

Для получения имени пользователя из структуры вида «…CN=Имя_пользователя,…» в ячейке A2, может быть использована следующая формула преобразования:

ПСТР(A2;

НАЙТИ("CN=";A2)+3;

НАЙТИ(","; A2;

НАЙТИ("CN="; A2)+3

) - НАЙТИ("CN=";A2) -3

Для получения информации из структуры вида «…OU=Данные,…» в ячейке A2 может быть использована следующая формула преобразования:

ЕСЛИ(ЕПУСТО("0"!A2);"";

ЕСЛИ(ЕОШИБКА(НАЙТИ("OU=";"0"!A2)); "USERS";

ПСТР("0"!A2;

НАЙТИ("OU=";"0"!A2)+3;

НАЙТИ(","; "0"!A2;

НАЙТИ("OU=";"0"!A2)+3) –

НАЙТИ("OU=";"0"!A2) -3

Обработка данных даты и времени Unix-формата

Получение даты в формате ДД.ММ.ГГГГ на основании данных в Unix-формате предлагаем производить в два этапа. На первом этапе вычисляется количество дней, прошедших с 1 января 2003 г. На втором формируется строка даты в стандартном формате.

Для получения количества дней, прошедших с 1 января 2003 г., на основании данных в ячейке F2, заданных в Unix-формате даты и времени, может быть использована следующая формула преобразования:

ЕСЛИ(

ЗНАЧЕН(ЛЕВСИМВ(F2;11))=0;

ОКРУГЛВНИЗ((ЗНАЧЕН(ЛЕВСИМВ(F2;11))- 12685849200)/24/3600; 0)

Полученное на первом этапе значение сдвига дней относительно 1 января 2003 г. (в ячейке E2) используется для формирования даты в стандартном формате.

ЕСЛИ(E2=-1;

"Отсутствует";

СЦЕПИТЬ(

ДЕНЬ(ДАТАЗНАЧ("1/1/2003")+E2);

".";

МЕСЯЦ(ДАТАЗНАЧ("1/1/2003")+E2);

".";

ГОД(ДАТАЗНАЧ("1/1/2003")+E2)

Обработка данных даты и времени формата GeneralizedTime для ASN.1 кодирования

Преобразование числа в формате ГГГГММДДММСС.0Z в формат ДД.ММ.ГГГГ ЧЧ:ММ

СЦЕПИТЬ(

ПСТР(N2;7;2); "."; ПСТР(N2;5;2); "."; ПСТР(N2;1;4); " ";

ПСТР(N2;9;2); ":"; ПСТР(N2;11;2)

Обработка значения поля userAccountControl о блокированности записи

Получение данных о состоянии учетной записи по значению поля userAccontControl, содержащемуся в ячейке G2:

ЕСЛИ(ЕПУСТО(G2);"";

ЕСЛИ(ИЛИG2=514; G2=66050);"Заблокированная";"Действующая")

Подробные пояснения и описание формата хранения данных в поле userAccountControl можно найти в статье Microsoft «How to Use the UserAccountControl Flags to Manipulate User Account Properties» (http://support. microsoft.com/?kbid=305144). Отметим только, что если параметры учетной записи не заданы, то десятичное значение userAccountControl равно 512; десятичное значение для блокированной учетной записи при отсутствии других параметров – 514.

Заключение

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

Отметим, что кроме изложенного метода может быть использован вариант, рекомендуемый Microsoft, предполагающий использование интерфейсов службы Active Directory (ADSI), которые предоставляют простой, мощный, объектно-ориентированный доступ к ресурсам Active Directory. Интерфейсы ADSI позволяют программистам и администраторам создавать программы каталога с использованием инструментальных средств высокого уровня, например, Microsoft Visual Basic, Java, C или Visual C++, не заботясь о различиях в пространствах имен. Интерфейсы ADSI полностью поддерживают сценарии, что облегчает их использование администраторами.

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

  • заблокированные учетные записи (после анализа последней даты регистрации могут быть удалены в случае, если необходимость в них отсутствует);
  • данные учетной записи о том, что последняя регистрация в сети происходила три и более месяца назад, могут указывать на то, что сотрудник, которому принадлежала учетная запись, уже уволен;
  • если количество регистраций в сети для учетной записи равно нулю, а со времени ее создание прошло свыше одного месяца, то это может говорить о том, что созданная учетная запись оказалась невостребованной;
  • большое количество регистраций в сети может указывать на то, что учетная запись используется для входа в сеть не только владельцем.

Добрый день уважаемые читатели и подписчики, продолжаем с вами изучение возможностей Powershell и Active Directory. Как вы помните у нее все учетные записи пользователей и компьютеров, находятся в базе данных NTDS.dit, все здорово и централизованно. Когда в компании больше одного системного администратора, может получиться ситуация, что в ней накапливается мусор и лишние учетные данные. Все мы люди и какие-то вещи можем забывать, а в какие-то моменты нас могут отвлечь, что приведет, так же к забыванию важной информации. И приходим, мы к тому, что в Actvie Directory накапливаются не активные пользователи (уволенные или забытые), в любом случае, хороший системный администратор должен их выявлять, отключать и дальше по желанию удалять, чем мы и займемся.

Через оснастку ADUC

В прошлый раз я вам уже приводил пример использования оснастки Active Directory Пользователи и компьютеры, через которую мы искали пропавшие компьютеры в локальной сети , которые не появлялись уже месяц. Сейчас сделаем все то же самое и с пользовательскими учетными записями. У меня AD на Windows Server 2012 R2, открываем ADUC, для этого нажмите WIN+R и введите dsa.msc.

В открывшейся форме запроса задайте:

  • Имя запроса > у меня это потерявшиеся пользователи
  • Описание при необходимости
  • Корень запроса > тут можно оставить весь домен, либо же конкретизировать на нужном OU

После чего жмем кнопку запрос.

На вкладке пользователи видим пункт "Число дней со времени последнего входа в систему" я для примера поставил 60 дней.

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

Через оснастку powershell

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

$date_with_offset= (Get-Date).AddDays(-45)
$users = Get-ADUser -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate
foreach ($user in $users) {set-aduser $user -enabled $false; move-adobject -identity $user -targetpath "ou=Уволенные,ou=Мск Л. пользователи,ou=Местоположение,dc=msk,dc=contoso,dc=com"}
Get-ADUser -Properties LastLogonDate -Filter {LastLogonDate -lt $date_with_offset } | Sort LastLogonDate | FT Name, LastLogonDate -AutoSize | Out-File c:\Script\users.txt

  • В первой строке вы объявляете переменную, в которой задаете срок поиска
  • Создаем переменную и делаем выборку по последнему времени логина
  • Перемещаем пользователей

  • Делаем отчет в файл

Еще полезные вещи по работе с пользователем. Перед использованием ниже команд, нужно загрузить модуль Active Directory, через команду

Get-Help Get-ADUser

Похожие статьи