Как с помощью 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 кажется более безопасным, если вы забыли о том ПК, который находится под столом Боба и никогда не включается.
РЕДАКТИРОВАТЬ: О, также я пропустил поддержку часовых поясов в этом, что, вероятно, не имеет значения в этом случае использования, но может в других.