Comment trouver des objets ordinateur orphelins dans Active Directory à l'aide de PowerShell?


10

Comment puis-je trouver tous les comptes d'ordinateurs de mon domaine Active Directory qui ont été inactifs pendant x jours à l'aide de PowerShell?

Notez que je sais vraiment comment faire cela. Il s'agit d'une question auto-répondue juste pour diffuser les connaissances. Si quelqu'un d'autre a un meilleur moyen, n'hésitez pas à le poster!

Réponses:


10

Cela vous donnerait tous les comptes d'ordinateurs qui n'ont eu aucune activité au cours des 365 derniers jours.

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

Cela le trierait pour vous par lastlogondate.

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

Cela vous donnerait des comptes d'ordinateur désactivés.

Search-ADAccount -AccountDisabled -ComputersOnly 

Intéressant! Je (évidemment) ne connaissais pas cette applet de commande. Quel attribut est mesuré pour "AccountInactive"? lastlogondate? passwordlastset?
MDMarra

Je vais devoir vérifier pour être sûr à 100%, mais je sais que lastlogondate est l'un des attributs qui sont renvoyés si vous regardez l'objet, passwordlastset ne l'est pas. L'article Technet ne détaille pas vraiment l'attribut qu'il utilise.
Mike

1
Je l'ai regardé un peu plus et lastlogondate semble être juste la conversion de lastlogontimestamp. Il n'y a aucun attribut appelé lastlogondate dans le schéma. J'espère que ça t'as aidé.
Mike

5

Les ordinateurs modifient le mot de passe de leur compte tous les 30 jours par défaut. Si un ordinateur n'a pas modifié son mot de passe pendant une période prolongée, cela signifie qu'il n'est plus connecté au réseau.

Ce script PowerShell produira 2 fichiers texte. L'un est pour les ordinateurs désactivés, l'autre pour les objets de compte d'ordinateur orphelins. Vous devez avoir installé le module Active Directory PowerShell.

Dans cet exemple, j'exclus une unité d'organisation "Ordinateurs portables cryptés", car ce sont des ordinateurs portables mobiles qui sont déconnectés pendant de longues périodes. Vous pouvez supprimer cette section si vous n'avez pas une configuration similaire

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 million de remerciements! Je voulais ajouter ma touche à cela. Je n'avais besoin de trouver que des serveurs qui avaient été désactivés ou non et qui n'étaient pas en production. C'est ce que j'ai trouvé et cela a semblé fonctionner.

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

Je sais que l'OP a clairement demandé PowerShell mais si vous ne l'aimez pas, ne l'avez pas et ne voulez pas apprendre encore une autre syntaxe Microsoft, l'extrait de code Python suivant vous donnera une date au format correct à utiliser avec une requête 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)

Ce qui pourrait ensuite être utilisé comme suit pour trouver tous les ordinateurs Windows qui n'ont pas changé de mot de passe au cours des 90 derniers jours.

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

Vous n'avez probablement besoin que de 30 car la période par défaut pour que les machines Windows changent leur mot de passe est de 30 jours, mais 90 semble plus sûr au cas où vous auriez oublié ce PC qui est assis sous le bureau de Bob et ne se met jamais sous tension.

EDIT: Oh aussi, j'ai omis le support de fuseau horaire dans ce qui n'a probablement pas d'importance dans ce cas d'utilisation mais peut dans d'autres.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.