Як знайти осиротілі комп'ютерні об’єкти в Active Directory за допомогою PowerShell?


10

Як я можу знайти всі облікові записи комп’ютера в моєму домені Active Directory, які не працювали протягом x днів за допомогою PowerShell?

Зауважте, що я насправді знаю, як це зробити. Це питання з самовідповіддю просто для отримання знань там. Якщо хтось має кращий спосіб, сміливо розміщуйте його!

Відповіді:


10

Це дасть вам усі облікові записи комп'ютерів, які не мали активності протягом останніх 365 днів.

Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan 365.00:00:00

Це буде сортувати це для вас за допомогою lastlogondate.

Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan 365.00:00:00 | Sort-Object lastlogondate | Ft name,lastlogondate -auto

Це дозволить вам відключити облікові записи комп’ютера.

Search-ADAccount -AccountDisabled -ComputersOnly 

Цікаво! Я (очевидно) не знав про цей командлет. Який атрибут вимірюється для "AccountInactive"? lastlogondate? набір паролів?
MDMarra

Мені доведеться переконатися, щоб бути на 100% впевненим, але я знаю, що lastlogondate - це один з атрибутів, який повертається, якщо ви подивитеся на об'єкт, passwordlastset - ні. У статті про техніку не дуже детально описано, який атрибут використовується.
Майк

1
Поглянувши на це трохи більше, і lastlogondate виглядає, що це лише перетворення lastlogontimestamp. У схемі немає атрибута, який називається lastlogondate. Сподіваюся, що це допомагає.
Майк

5

Комп'ютери змінюють пароль свого облікового запису кожні 30 днів за замовчуванням. Якщо комп'ютер не змінив пароль протягом тривалого періоду часу, це означає, що вони більше не підключені до мережі.

Цей скрипт PowerShell видасть 2 текстових файли. Один призначений для комп’ютерів з обмеженими можливостями, один - для осірілих об’єктів обліку комп'ютера. Потрібно встановити модуль Active Directory PowerShell.

У цьому прикладі я виключаю "Зашифровані ноутбуки" OU, оскільки це мобільні ноутбуки, які відключаються протягом тривалого періоду часу. Ви можете видалити цей розділ, якщо у вас немає подібних налаштувань

Import-Module ActiveDirectory

$Date = [DateTime]::Today

#Sets the deadline for when computers should have last changed their password by.
$Deadline = $Date.AddDays(-365)   

#Makes the date string for file naming
$FileName = [string]$Date.month + [string]$Date.day + [string]$Date.year 


#Generates a list of computer accounts that are enabled and aren't in the Encrypted Computers OU, but haven't set their password since $Deadline
$OldList = Get-ADComputer -Filter {(PasswordLastSet -le $Deadline) -and (Enabled -eq $TRUE)} -Properties PasswordLastSet -ResultSetSize $NULL |
Where {$_.DistinguishedName -notlike "*Encrypted Laptops*"} | 
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto 

#Generates a list of computer accounts that are disabled and sorts by name.
$DisabledList = Get-ADComputer -Filter {(Enabled -eq $FALSE)} -Properties PasswordLastSet -ResultSetSize $null | 
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto

#Creates the two files, assuming they are not $NULL. If they are $NULL, the file will not be created.
if ($OldList -ne $NULL) {
    Out-File "C:\users\marra\desktop\Old$Filename.txt" -InputObject $OldList
}

if ($DisabledList -ne $NULL) {
    Out-File "C:\users\marra\desktop\Disabled$Filename.txt" -InputObject $DisabledList
}

0

Мільйон спасибі! Я хотів додати цю настройку до цього. Мені потрібно було знайти лише сервери, які були або відключені, або не відключені і не знаходяться у виробництві. Це те, що я придумав, і, здавалося, спрацює.

Import-Module ActiveDirectory

$Date = [DateTime]::Today

#Sets the deadline for when computers should have last changed their password by.
$Deadline = $Date.AddDays(-365)   

#Makes the date string for file naming
$FileName = [string]$Date.month + [string]$Date.day + [string]$Date.year 

#Generates a list of computer server accounts that are enabled, but haven't set their password since $Deadline
$OldList = Get-ADComputer -Filter {(PasswordLastSet -le $Deadline) -and (Enabled -eq $TRUE) -and (OperatingSystem -Like "Windows *Server*")} -Properties PasswordLastSet -ResultSetSize $NULL |
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto 

#Generates a list of computer server accounts that are disabled and sorts by name.
$DisabledList = Get-ADComputer -Filter {(Enabled -eq $FALSE) -and (OperatingSystem -Like "Windows *Server*")} -Properties PasswordLastSet -ResultSetSize $null | 
Sort-Object -property Name | FT Name,PasswordLastSet,Enabled -auto

#Creates the two files, assuming they are not $NULL. If they are $NULL, the file will not be created.
if ($OldList -ne $NULL) {
    Out-File "C:\temp\Old$Filename.txt" -InputObject $OldList
}

if ($DisabledList -ne $NULL) {
    Out-File "C:\temp\Disabled$Filename.txt" -InputObject $DisabledList
} 

0

Я знаю, що ОП чітко просив PowerShell, але якщо вам це не подобається, не маєте його і не хочу вивчати ще один синтаксис Microsoft, то наступний фрагмент Python дасть вам дату у правильному форматі для використання з LDAP-запитом.

import datetime, time
def w32todatetime(w32):
    return datetime.fromtimestamp((w32/10000000) - 11644473600)
def datetimetow32(dt):
    return int((time.mktime(dt.timetuple()) + 11644473600) * 10000000)

90daysago = datetime.datetime.now() - datetime.timedelta(days=90)
print datetimetow32(90daysago)

Потім їх можна використовувати наступним чином для пошуку всіх комп'ютерів Windows, які не змінили свої паролі за останні 90 днів.

(&(objectCategory=computer)(objectClass=computer)(operatingSystem=Windows*)(pwdLastSet<=130604356890000000))

Вам, мабуть, потрібно лише 30, оскільки за замовчуванням для Windows-машин для зміни свого пароля є 30 днів, але 90 здається безпечнішим, якщо ви забули про той ПК, який сидів під столом Боба і ніколи не вмикається.

EDIT: Так само я опустив підтримку часового поясу в цьому, що, мабуть, не має значення в цьому випадку використання, але може бути в інших.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.