Назад | Перейти на главную страницу

Как найти потерянные компьютерные объекты в Active Directory с помощью PowerShell?

Как с помощью PowerShell найти все учетные записи компьютеров в моем домене Active Directory, которые были неактивны в течение x дней?

Обратите внимание, что я действительно знаю, как это сделать. Это вопрос, на который нужно ответить самому, чтобы получить знания. Если у кого-то еще есть способ получше, не стесняйтесь размещать его!

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

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

Этот сценарий PowerShell выведет 2 текстовых файла. Один предназначен для отключенных компьютеров, другой - для объектов учетных записей потерянных компьютеров. У вас должен быть установлен модуль Active Directory PowerShell.

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

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
}

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

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
} 

Я знаю, что OP явно просил 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 кажется более безопасным, если вы забыли о том ПК, который находится под столом Боба и никогда не включается.

РЕДАКТИРОВАТЬ: О, также я пропустил поддержку часовых поясов в этом, что, вероятно, не имеет значения в этом случае использования, но может в других.