10 votos

¿Cómo puedo encontrar huérfanos objetos de equipo en Active Directory mediante el uso de PowerShell?

¿Cómo puedo encontrar todas las cuentas de equipo en mi dominio de Active Directory que han estado inactivos durante x días, utilizando PowerShell?

Tenga en cuenta que yo realmente saben cómo hacer esto. Este es un auto-respondió a la pregunta, solo para obtener el conocimiento allí. Si alguien tiene una mejor forma, siéntase libre de publicar!

10voto

Mike Puntos 773

Esto le daría todas las cuentas del equipo que no tienen actividad durante los últimos 365 Días.

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

Este sería ordenar por usted por lastlogondate.

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

Esto le puede dar movilidad cuentas de equipo.

Search-ADAccount -AccountDisabled -ComputersOnly 

5voto

MDMarra Puntos 81543

Equipos de cambiar la contraseña de su cuenta cada 30 días por defecto. Si un equipo no ha cambiado su contraseña en un período prolongado de tiempo, significa que ya no están conectados a la red.

Esta secuencia de comandos de PowerShell de salida será de 2 archivos de texto. Uno es para personas de movilidad equipos, uno es para huérfanos objetos de cuenta de equipo. Usted debe tener el Active Directory módulo de PowerShell instalado.

En este ejemplo, excluir a un "Cifrado Portátiles" OU, ya que son ordenadores portátiles que están desconectados durante largos períodos de tiempo. Usted puede quitar esa sección, si usted 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
}

0voto

Devart Puntos 52715

Sé el OP claramente pidió PowerShell, pero si no te gusta, no la tiene, y no quieren aprender una nueva sintaxis de Microsoft, a continuación, el siguiente fragmento de código Python le dará una fecha en el formato correcto para su uso 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 podría ser utilizado de la siguiente manera para encontrar todos los ordenadores Windows, que no han cambiado sus contraseñas en los últimos 90 días.

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

Usted probablemente sólo necesita 30 como el período predeterminado para las máquinas de Windows para cambiar su contraseña es de 30 días, pero el 90 parece más seguro en caso de que usted se olvidó de que la PC que se sentó debajo el escritorio de Bob y nunca se enciende.

EDIT: Ah, también he omitido el tiempo de la zona de apoyo en el que, probablemente, no importa en este caso de uso, pero puede que en otros.

0voto

Geekgal Puntos 11

Un millón de gracias! Yo quería añadir mi tweak para esto. Necesitaba encontrar únicamente a los servidores que han quedado discapacitados o no discapacitados y no en la producción. Esto es lo que se me ocurrió y pareció 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
} 

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: