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

10

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

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

MDMarra
источник

Ответы:

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? passwordlastset?
MDMarra
Я собираюсь разобраться, чтобы быть на 100% уверенным, но я знаю, что lastlogondate - это один из атрибутов, который возвращается, если вы посмотрите на объект, а passwordlastset - нет. В статье technet не очень подробно рассказывается, какой атрибут он использует.
Майк
1
Посмотрел немного больше, и lastlogondate выглядит так, будто это просто преобразование lastlogontimestamp. В схеме нет атрибута с именем lastlogondate. Надеюсь, это поможет.
Майк
5

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

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

Сэмюэл Хармер
источник