¿Cómo encuentro objetos de computadora huérfanos en Active Directory usando PowerShell?


10

¿Cómo puedo encontrar todas las cuentas de computadora en mi dominio de Active Directory que han estado inactivas durante x días usando PowerShell?

Tenga en cuenta que realmente sé cómo hacer esto. Esta es una pregunta con respuesta propia solo para obtener el conocimiento que existe. Si alguien más tiene una mejor manera, ¡no dude en publicarla!

Respuestas:


10

Esto le daría todas las cuentas de computadora que no tienen actividad durante los últimos 365 días.

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

Esto lo ordenaría por lastlogondate.

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

Esto le daría cuentas de computadora deshabilitadas.

Search-ADAccount -AccountDisabled -ComputersOnly 

¡Interesante! Yo (obviamente) no sabía sobre ese cmdlet. ¿Qué atributo se mide para "AccountInactive"? lastlogondate? passwordlastset?
MDMarra

Voy a tener que investigar para estar 100% seguro, pero sé que lastlogondate es uno de los atributos que se devuelve si observa el objeto, passwordlastset no lo es. El artículo de technet no detalla realmente qué atributo usa.
Mike

1
Lo examiné un poco más y lastlogondate parece que es solo la conversión de lastlogontimestamp. No hay ningún atributo llamado lastlogondate en el esquema. Espero que ayude.
Mike

5

Las computadoras cambian la contraseña de su cuenta cada 30 días de manera predeterminada. Si una computadora no ha cambiado su contraseña en un período prolongado de tiempo, significa que ya no está conectada a la red.

Este script de PowerShell generará 2 archivos de texto. Una es para computadoras deshabilitadas, otra para objetos de cuenta de computadora huérfanos. Debe tener instalado el módulo Active Directory PowerShell.

En este ejemplo, excluyo una unidad organizativa "Portátiles cifrados", ya que son portátiles que están desconectados durante períodos prolongados. Puede eliminar esa sección si no tiene una configuración similar

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

¡Un millón de gracias! Quería agregar mi ajuste a esto. Necesitaba encontrar solo servidores que se hayan desactivado o no y que no estén en producción. Esto es lo que se me ocurrió y parecía funcionar.

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

Sé que el OP claramente solicitó PowerShell, pero si no le gusta, no lo tiene y no quiere aprender otra sintaxis de Microsoft, el siguiente fragmento de Python le dará una fecha en el formato correcto para usar con una consulta 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)

Que luego podría usarse de la siguiente manera para encontrar todas las computadoras con Windows que no han cambiado sus contraseñas en los últimos 90 días.

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

Probablemente solo necesite 30, ya que el período predeterminado para que las máquinas Windows cambien su contraseña es de 30 días, pero 90 parece más seguro en caso de que se haya olvidado de esa PC que se encuentra debajo del escritorio de Bob y nunca se enciende.

EDITAR: Ah, también he omitido el soporte de zona horaria en esto, lo que probablemente no importa en este caso de uso, pero puede que en otros.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.