Страница 1 из 1

WinServer-ActiveDirectory: Найти устаревшие учетные записи компьютеров

Добавлено: 22 мар 2017, 21:25
xor
Источник: 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 года. Результаты приведены ниже.

Код: Выделить всё

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
А так можно получить список уч.записей пользователей который были заблокированы более 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 и конвертирует его в привычный формат. Ниже показан результат.

Код: Выделить всё

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
Чтобы создать фильтр, мне необходимо конвертировать дату, например, 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

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