Localisation des comptes informatiques inactifs dans AD

By Thomas GROLLEAU

Malheureusement, les comptes d’ordinateur semblent perdurer même lorsque les ordinateurs sont retirés du domaine et mis hors service. Au fil du temps, le nombre de comptes informatiques dans un domaine Active Directory (AD) ne cesse de croître. Il est très difficile d’utiliser les outils prêts à l’emploi disponibles lors de l’installation d’AD pour gérer ces comptes inactifs.

Il n’existe pas de processus intégré pour surveiller ces objets périmés et les supprimer lorsqu’ils ne sont plus utilisés. La question que vous vous posez peut-être est donc de savoir comment supprimer efficacement ces objets inactifs. Tout d’abord, nous devons comprendre ce qui caractérise un objet « ordinateur inactif ». Eh bien, il s’avère que ces ordinateurs Windows réinitialisent automatiquement leur « mot de passe d’ordinateur » au moins une fois tous les trente jours.

Bien que ce nombre puisse être modifié, il n’est généralement pas recommandé. Puisque nous savons que l’attribut d’âge du mot de passe de l’ordinateur est automatiquement modifié au moins une fois tous les trente jours, tout ce que nous avons à faire est d’interroger Active Directory et d’appliquer une certaine logique dans le code. Il existe plusieurs façons d’extraire et de traiter les données d’AD, mais je pense que l’utilisation de VBScript pour cette solution fonctionne très bien.

Voici un exemple de code qui interrogera votre domaine, à n’importe quel niveau (OU) de la structure, et qui vous permettra de choisir l’âge maximum, et d’exécuter ou non en mode DELETE ou LIST. Le choix de 60 ou 90 jours pour l’âge maximum est assez sûr car il tient compte du personnel qui peut être en vacances ou en voyage pendant une période prolongée.

A lire également :   Google Drive ou Dropbox : Quelle est la meilleure option de stockage en nuage ?

Ce script peut être utilisé pour localiser les comptes informatiques inactifs dans un domaine Active Directory.

Le script peut être exécuté en 2 modes, DELETE et LIST.
Le mode DELETE supprime les objets informatiques ! !! Soyez prudent
Le mode LIST génère des données dans un fichier. Cependant, il est facile de modifier le script pour
écrire dans une base de données.

Définissez la portée du script en utilisant le point de départ correct dans la structure.
Changez le cnPath selon vos besoins. Il peut être défini au niveau de l’objet du domaine ou de l’OU.
cnPath = « OU=votreNom,DC=domaine,DC=com ».

Les ordinateurs du domaine mettent à jour leur mot de passe par défaut une fois tous les trente jours.
Lorsque vous exécutez le programme, ce nombre devrait être supérieur à 30 ** ‘ciblant les systèmes qui peuvent être encore actifs.***
limit = inputbox(« Enter maximum password age »)
DeleteMode = Msgbox(« Voulez-vous exécuter en mode DELETE ? », vbYesNo)

Que signifie « inactif » dans Discord ?

Configuration du fichier journal
Set fso = CreateObject(« Scripting.FileSystemObject »)

Le 8 de cette ligne sera ajouté à un fichier existant, remplacez-le par un 2 pour l’annuler.
set txtStream = fso.OpenTextFile(« System.txt », 8, True)
txtStream.WriteLine « *** Ran on  » & Date &  » *** »

Constitution d’une connexion ADSI et remplissage de la collection ADSI.
Set objADOconnADSI = CreateObject(« ADODB.Connection »)
objADOconnADSI.Open « Provider=ADsDSOObject ; »
Set objCommandADSI = CreateObject(« ADODB.Command »)
objCommandADSI.ActiveConnection = objADOconnADSI

Il y a un objet 1000 par défaut si les 2 lignes suivantes sont omises.
objCommandADSI.Properties(« Size Limit »)= 10000
objCommandADSI.Properties(« Page Size »)= 10000
objCommandADSI.Properties(« Sort on ») = « sAMAccountName » (nom du compte)
objCommandADSI.CommandText =  » ;(objectClass=computer);sAMAccountName,pwdLastSet,name,distinguishedname;subtree »
Set objRSADSI = objCommandADSI.Execute

A lire également :   Windows 11 et la nouvelle génération d'appareils

Boucle dans le jeu d’enregistrements et compare l’âge du mot de passe
do while NOT objRSADSI.EOF
if not isnull(objRSADSI.Fields(« distinguishedname »)) and objRSADSI.Fields(« distinguishedname ») <> «  » then
objDate = objRSADSI.Fields(« PwdLastSet »)

Allez à la fonction pour traduire la valeur PwdLastSet de AD pour le compte de la machine.
dtmPwdLastSet = Integer8Date(objDate, lngBias)

calculer l’âge actuel du mot de passe.
DiffADate = DateDiff(« d », dtmPwdLastSet, Now)

Le mot de passe est-il plus ancien que l’âge spécifié ?
si DiffADate > int(limit) then

Le script est-il exécuté en mode DELETE?
if DeleteMode = vbYes then

Demandez si ce compte machine doit être supprimé de AD.
‘*** Décommentez la ligne suivante et commentez-la pour ne pas être invité à supprimer chaque objet.
‘intReturn = vbYes
intReturn = Msgbox(« Êtes-vous sûr de vouloir SUPPRIMER ce compte d’ordinateur ? », vbYesNo, « Delete  » & objRSADSI.Fields(« name »))

Si OUI, écrivez dans le fichier journal puis SUPPRIMEZ le compte, sinon enregistrez-le simplement.
Si intReturn = vbYes Then
Set objComputer = GetObject(« LDAP:// » & objRSADSI.Fields(« distinguishedname »))
strComputer = objComputer.CN

txtStream.WriteLine objRSADSI.Fields(« nom ») & « , » & dtmPwdLastSet & « , » & DiffADate & « ,SUPPRIMÉ ».
objComputer.DeleteObject (0)
sinon
txtStream.WriteLine objRSADSI.Fields(« name ») & « , » & dtmPwdLastSet & « , » & DiffADate & « ,NOT DELETED »
End If
else

32 meilleurs logiciels gratuits de destruction de fichiers

Si le programme fonctionne en mode LIST, il suffit d’écrire l’entrée dans le fichier journal et de passer à l’enregistrement suivant.
txtStream.WriteLine objRSADSI.Fields(« name ») & « , » & dtmPwdLastSet & « , » & DiffADate & « ,LIST ONLY »
end if
fin si
end if
objRSADSI.MoveNext
boucle
wscript.echo « Processus terminé ».

* Fonction permettant de convertir une valeur Integer8 (64 bits) en une date, ajustée en fonction du fuseau horaire local.*
Fonction Integer8Date(objDate, lngBias)
Dim lngAdjust, lngDate, lngHigh, lngLow
lngAdjust = lngBias
lngHigh = objDate.HighPart
lngLow = objdate.LowPart

A lire également :   Comment ajouter des cases à cocher à des documents Word

Compte tenu des méthodes de la propriété IADslargeInteger.
Si lngLow < 0 Alors
lngHigh = lngHigh + 1
End If
If (lngHigh = 0) And (lngLow = 0) Then
lngAdjust = 0
End If
lngDate = #1/1/1601# + (((lngHigh * (2 ^ 32)) _

  • lngLow) / 600000000 – lngAdjust) / 1440
    Integer8Date = CDate(lngDate)
    End Function

EndofScript

Laisser un commentaire