WinServer-ActiveDirectory: Найти устаревшие учетные записи компьютеров
Добавлено: 22 мар 2017, 21:25
Источник: https://habrahabr.ru/company/netwrix/blog/160837/
Для реализации описанного процесса необходимо соблюдение определенных требований:
Чтобы использовать PowerShell для управления AD, нужно соблюсти несколько требований. Я собираюсь продемонстрировать, как командлеты для AD работают на примере компьютера на Windows 7.
Чтобы использовать командлеты, контроллер домена у Вас должен быть уровня Windows Server 2008 R2, или же Вы можете скачать и установить Active Directory Management Gateway Service на наследуемых контроллерах домена (legacy DCs). Внимательно прочитайте документацию перед установкой; требуется перезагрузка КД.
На стороне клиента, скачайте и установите Remote Server Administration Tools (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 все инструменты выбраны по умолчанию). Теперь мы готовы работать.
Я вошел в систему под учетной записью с правами доменного администратора. Большинство командлетов, которые я буду показывать, позволят Вам уточнить альтернативные полномочия (credentials). В любом случае я рекомендую прочитать справку (Get-Help) и примеры, которые я буду демонстрировать ниже.
Начните сессию PowerShell и просмотрите список модулей:
PS C:\> Get-Module -listavailable
импортируйте модуль AD:
PS C:\> Import-Module ActiveDirectory
В результате импорта создается новый PSDrive, но мы не будем использовать его. Однако, Вы можете посмотреть, какие команды имеются в импортированном модуле.
PS C:\> get-command -module ActiveDirectory
Прелесть этих команд в том, что если я могу использовать команду для одного объекта AD, то ее можно использовать для 10, 100 и даже 1000. Посмотрим, как некоторые из этих командлетов работают.
Мне часто задают этот вопрос: “Как найти устаревшие учетные записи компьютеров?”. И я всегда отвечаю: “А что для вас является устаревшим?” Компании по-разному определяют то, когда учетная запись компьютера (или пользователя, неважно), признается устаревшей и не подлежит дальнейшему использованию. Что касается меня, то я обращаю внимание на те учетные записи, у которых пароли не менялись в течение определенного периода времени. Этот период для меня составляет 90 дней – если компьютер не сменил пароль вместе с доменом за этот период, скорее всего он находится оффлайн и является устаревшим. Используется командлет Get-ADComputer:
PS C:\> get-adcomputer -filter "Passwordlastset -lt '12/30/2016'" -properties *| Select name,passwordlastset
Фильтр замечательно работает с жестким значением, но этот код будет обновляться для всех учетных записей компьютеров, которые не изменили своих паролей с 30 декабря 2016 года. Результаты приведены ниже.
А так можно получить список уч.записей пользователей который были заблокированы более 180 дней назад.
Get-ADUser -Filter "Enabled -eq '$false' -and Modified -lt '$((Get-Date).AddDays(-180))'"
Другой вариант: предположим, вы хотя бы на функциональном уровне домена Windows 2003. Поставьте фильтр по свойству LastLogontimeStamp. Это значение – число 100 наносекундных интервалов с 1 января, 1601 года, и храниться в GMT, поэтому работа с этим значением слегка сложно:
PS C:\> get-adcomputer -filter "LastlogonTimestamp -gt 0" -properties * | select name,lastlogontimestamp,@{Name="LastLogon";Expression=[datetime]::FromFileTime($_.Lastlogontimestamp)}},passwordlastset | Sort LastLogonTimeStamp
Я взял на себя ответственность и добавил кастомное свойство, которое берет значение 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
Приведённый код находит те же самые компьютеры, что были показаны в первом примере.
Офтопик
Для реализации описанного процесса необходимо соблюдение определенных требований:
Чтобы использовать PowerShell для управления AD, нужно соблюсти несколько требований. Я собираюсь продемонстрировать, как командлеты для AD работают на примере компьютера на Windows 7.
Чтобы использовать командлеты, контроллер домена у Вас должен быть уровня Windows Server 2008 R2, или же Вы можете скачать и установить Active Directory Management Gateway Service на наследуемых контроллерах домена (legacy DCs). Внимательно прочитайте документацию перед установкой; требуется перезагрузка КД.
На стороне клиента, скачайте и установите Remote Server Administration Tools (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 все инструменты выбраны по умолчанию). Теперь мы готовы работать.
Я вошел в систему под учетной записью с правами доменного администратора. Большинство командлетов, которые я буду показывать, позволят Вам уточнить альтернативные полномочия (credentials). В любом случае я рекомендую прочитать справку (Get-Help) и примеры, которые я буду демонстрировать ниже.
Начните сессию PowerShell и просмотрите список модулей:
PS C:\> Get-Module -listavailable
импортируйте модуль AD:
PS C:\> Import-Module ActiveDirectory
В результате импорта создается новый PSDrive, но мы не будем использовать его. Однако, Вы можете посмотреть, какие команды имеются в импортированном модуле.
PS C:\> get-command -module ActiveDirectory
Прелесть этих команд в том, что если я могу использовать команду для одного объекта AD, то ее можно использовать для 10, 100 и даже 1000. Посмотрим, как некоторые из этих командлетов работают.
PS C:\> get-adcomputer -filter "Passwordlastset -lt '12/30/2016'" -properties *| Select name,passwordlastset
Фильтр замечательно работает с жестким значением, но этот код будет обновляться для всех учетных записей компьютеров, которые не изменили своих паролей с 30 декабря 2016 года. Результаты приведены ниже.
Код: Выделить всё
name passwordlastset
---- ---------------
C16222022100253 7/16/2016 4:57:03 AM
C16222022100192 10/23/2016 1:26:11 PM
C16222022100266 12/8/2016 8:54:08 AM
C16222022100211 10/17/2016 5:08:20 PM
HP-RUA1400222 9/14/2016 11:48:17 AM
C16222022100079 11/17/2016 1:36:49 PM
MSK-CO-APP003 10/28/2016 12:21:39 AM
C71212737 10/3/2016 7:19:59 AM
C71212615 12/26/2016 6:41:10 PM
MSK-CO-DBA006 7/14/2016 3:40:38 AM
C1613B105200014 7/14/2016 9:09:01 AM
RC04OLDSQL 7/1/2016 6:54:31 AM
MENEDGER5 10/19/2016 9:25:14 AM
TV2 10/29/2016 9:35:25 PM
C1612B172200477 11/17/2016 9:15:31 AM
TRF43801NX 12/26/2016 9:29:21 AM
RCKACH2 8/3/2016 12:15:32 PM
RCKACH3 9/2/2016 6:59:36 AM
HP255G3-1 11/18/2016 2:03:15 PM
HP255G3-6 7/12/2016 6:46:34 AM
MSK-CO-BM01 10/23/2016 1:09:25 AM
MSK-CO-TRM00 7/11/2016 5:18:47 PM
RCKACH01 8/29/2016 2:16:44 PM
TRF43801PM 10/8/2016 6:04:05 PM
RC-DC 12/2/2016 10:42:52 AM
Get-ADUser -Filter "Enabled -eq '$false' -and Modified -lt '$((Get-Date).AddDays(-180))'"
Другой вариант: предположим, вы хотя бы на функциональном уровне домена Windows 2003. Поставьте фильтр по свойству LastLogontimeStamp. Это значение – число 100 наносекундных интервалов с 1 января, 1601 года, и храниться в GMT, поэтому работа с этим значением слегка сложно:
PS C:\> get-adcomputer -filter "LastlogonTimestamp -gt 0" -properties * | select name,lastlogontimestamp,@{Name="LastLogon";Expression=[datetime]::FromFileTime($_.Lastlogontimestamp)}},passwordlastset | Sort LastLogonTimeStamp
Я взял на себя ответственность и добавил кастомное свойство, которое берет значение LastLogontimeStamp и конвертирует его в привычный формат. Ниже показан результат.
Код: Выделить всё
name lastLogonTimestamp lastLogon PasswordLastSet
---- ------------------ --------- ---------------
00180913714656Q 129913227035086877 129921029247229156 9/5/2012 4:00:48 PM
VKOBZEV 129941445327804704 129945006568397506 10/8/2012 7:35:28 AM
MSK-CO-APP005 129972056827677896 129978181930210264 11/12/2012 5:54:39 PM
C71012483 129973476994121041 129980405065377791 11/14/2012 9:37:24 AM
HALF-KUTUZOV 129977964751086648 129977988316407209 11/19/2012 2:02:04 PM
C70912320 129989877485297018 129996009823957571 11/12/2012 8:27:15 AM
MSK-CO-DBA011 130092997216029557 130093542247314584 3/14/2013 7:01:29 PM
SHOPBASE 130105706406626968 130106517781995571 4/16/2013 10:24:00 AM
MSK-CO-APP001 130131183013151669 130136026862829221 5/9/2013 10:33:45 AM
CKB-E7D7434E8AF 130147097702992113 130155790631036938 5/27/2013 8:08:45 AM
MSK-CO-DC004 130180204343323113 130180788283476777 7/7/2013 10:38:30 AM
C71212709 130183479830013916 130184572033955372 7/4/2013 6:58:02 PM
MSK-CO-DBA004 130229921208927239 130232215074818290 8/13/2013 1:27:55 PM
MSK-CO-DBA005 130231741068834096 130233967209321251 8/23/2013 3:11:33 AM
MSK-CO-DBA010 130254825918507288 130263018295181972 9/17/2013 5:30:17 AM
C70213846 130268949039957116 130271031559801209 10/10/2013 2:35:58 PM
WB12027755 130295130443974670 130304337401618850 10/30/2013 2:13:02 PM
C71212697 130300928106802857 130302093890276476 11/22/2013 11:44:54 AM
MSK-CO-APP007 130376997401788662 130382192402161551 2/24/2014 10:15:40 AM
HPPROBOOK4740S 130386475713179348 130371040214184133 3/7/2014 9:44:21 AM
ZBDBASE 130440096427339989 130447024824855002 4/25/2014 10:25:37 AM
MSK-CO-APP009 130484052121218824 130487647728241605 6/14/2014 5:05:52 AM
C16144146600462 130504141136588082 130504141721305354 7/21/2014 2:01:53 PM
C16242044900704 130507440102115339 130507440649540393 7/25/2014 9:40:09 AM
C1613A048200683 130507514099250059 0 7/25/2014 11:43:29 AM
C1613A048200381 130519706023176015 130521928717731065 8/8/2014 2:39:54 PM
UC5 130528261499709003 130528372079251195 7/23/2014 7:43:23 AM
TRANSPORT 130540499907236332 130542026891704734 8/19/2014 12:16:33 PM
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
Приведённый код находит те же самые компьютеры, что были показаны в первом примере.