Meilleur auteur de réponses
Script pour lister les comptes AD avec un mot de passe vide

Question
-
Bonjour,
Je débute en matière de Powershell.
Je souhaite faire un script qui récupère la liste des comptes AD (samaccountname) et teste pour chaque compte une connexion qui, si elle fonctionne, écris le nom du compte dans un fichier.
Set-PSdebug -strict $ldapQuery = [ADSI] 'LDAP://DC=DOMAIN,DC=fr' $accountlist = New-object system.directoryservices.directorysearcher($ldapQuery) $accountlist.filter='(&(objectCategory=user))' $blankpassword = New-Object System.Security.SecureString $loop = $accountlist.findall() foreach ($ADentry in $loop) { $account = $ADentry.properties["samaccountname"] $credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $account,$blankpassword $account | Add-Content -path \\share_path\userlist.txt -Credential $credential }
J'ai dans un premier temps essayé avec le script ci-dessus mais, malgré le fait que l'aide de Add-Content indique qu'on peut appliquer un -Credential, ça ne fonctionne pas. L'erreur indique que -credential ne fonctionne qu'avec New-PSDrive.
J'ai donc essayé de cette manière :
Set-PSdebug -strict $ldapQuery = [ADSI] 'LDAP://DC=DOMAIN,DC=fr' $accountlist = New-object system.directoryservices.directorysearcher($ldapQuery) $accountlist.filter='(&(objectCategory=user))' $blankpassword = New-Object System.Security.SecureString $loop = $accountlist.findall() foreach ($ADentry in $loop) { $account = $ADentry.properties["samaccountname"] $credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $account,$blankpassword New-PSDrive -Name T -PSProvider FileSystem -Root "\\share_path\path\" -Credential $credential $account | Add-Content -path T:\userlist.txt Remove-PSDrive -Name T }
Le but est donc cette fois ci de mapper un lecteur à chaque occurrence de la boucle avec le compte AD et un mot de passe vide, puis d'écrire le nom du compte dans un TXT sur le lecteur s'il est mappé. Le lecteur réseau est en droit d'accès "Contrôle total" pour "Tout le monde".
Mais ça n'a pas l'air de fonctionner non plus.
J'ai fais le test sur une OU créée pour le test et qui contient 2 comptes, un avec un mot de passe, l'autre sans.
Mais pour les 2 occurrences de la boucle j'ai les mêmes erreurs :
New-PSDrive : L'index se trouve en dehors des limites du tableau.
At C:\Users\username\Documents\AD-test.ps1:15 char:5
+ New-PSDrive -Name T -PSProvider FileSystem -Root "\\M-038130\outi ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-PSDrive], IndexOutOfRangeException
+ FullyQualifiedErrorId : NewDriveProviderException,Microsoft.PowerShell.Commands.NewPSDriveCommand
Add-Content : Cannot find drive. A drive with the name 'T' does not exist.
At C:\Users\username\Documents\AD-test.ps1:17 char:16
+ $account | Add-Content -path T:\userlist.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (T:String) [Add-Content], DriveNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.AddContentCommand
Remove-PSDrive : Cannot find drive. A drive with the name 'T' does not exist.
At C:\Users\username\Documents\AD-test.ps1:19 char:5
+ Remove-PSDrive -Name T
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (T:String) [Remove-PSDrive], DriveNotFoundException
+ FullyQualifiedErrorId : DriveNotFound,Microsoft.PowerShell.Commands.RemovePSDriveCommandMais je ne comprends pas l'erreur : L'index se trouve en dehors des limites du tableau.
Et je n'ai pas trouvé beaucoup d'infos sur internet.
Quelqu'un saurait-il m'aider à corriger mon erreur?
Merci,
Pierre NICHELE
- Modifié Pierre NICHELE mercredi 5 octobre 2016 07:45
Réponses
-
Bonjour,
sinon tu avais aussi cette solution qui est vraiment plus court et plus simple
http://www.it-connect.fr/active-directory-auditer-la-qualite-des-mots-de-passe/
- Marqué comme réponse Pierre NICHELE jeudi 6 octobre 2016 07:51
-
Pour information, j'ai contourné mon problème comme ça :
Set-PSdebug -strict #Récupération de la liste des comptes AD $ldapQuery = [ADSI] 'LDAP://DC=DOMAIN,DC=fr' $accountlist = New-object system.directoryservices.directorysearcher($ldapQuery) $accountlist.filter='(&(objectCategory=user))' #Definition du script $map = New-Object -ComObject WScript.Network #Retrait du lecteur réseau si existant $map.RemoveNetworkDrive("T:") #Boucle pour tester chaques comptes AD $loop = $accountlist.findall() foreach ($ADentry in $loop) { #Récupération du nom du compte $account = $ADentry.properties["samaccountname"] #Mappage du lecteur réseau, retourne une erreur si le mot de passe du compte n'est pas vide $map.MapNetworkDrive("T:","\\server\share",$false,"DOMAIN\$account","") #Ecriture du nom du compte dans le fichier TXT si le lecteur réseau est mappé, retourne une erreur si non $account | Add-Content -path T:\userlist.txt #Retrait du lecteur réseau si existant, retourne une erreur si non $map.RemoveNetworkDrive("T:") }
Le $map.MapNetworkDrive("T:","\\M-038130\AD",$false,"CHU\$account","") prends du temps si le mot de passe n'est pas vide mais ça fonctionne. Peut-être quelqu'un à t-il une idée pour ajouter un timeout à chaque boucle?
- Marqué comme réponse Pierre NICHELE mercredi 5 octobre 2016 10:38
Toutes les réponses
-
Pour information, j'ai contourné mon problème comme ça :
Set-PSdebug -strict #Récupération de la liste des comptes AD $ldapQuery = [ADSI] 'LDAP://DC=DOMAIN,DC=fr' $accountlist = New-object system.directoryservices.directorysearcher($ldapQuery) $accountlist.filter='(&(objectCategory=user))' #Definition du script $map = New-Object -ComObject WScript.Network #Retrait du lecteur réseau si existant $map.RemoveNetworkDrive("T:") #Boucle pour tester chaques comptes AD $loop = $accountlist.findall() foreach ($ADentry in $loop) { #Récupération du nom du compte $account = $ADentry.properties["samaccountname"] #Mappage du lecteur réseau, retourne une erreur si le mot de passe du compte n'est pas vide $map.MapNetworkDrive("T:","\\server\share",$false,"DOMAIN\$account","") #Ecriture du nom du compte dans le fichier TXT si le lecteur réseau est mappé, retourne une erreur si non $account | Add-Content -path T:\userlist.txt #Retrait du lecteur réseau si existant, retourne une erreur si non $map.RemoveNetworkDrive("T:") }
Le $map.MapNetworkDrive("T:","\\M-038130\AD",$false,"CHU\$account","") prends du temps si le mot de passe n'est pas vide mais ça fonctionne. Peut-être quelqu'un à t-il une idée pour ajouter un timeout à chaque boucle?
- Marqué comme réponse Pierre NICHELE mercredi 5 octobre 2016 10:38
-
Bonjour,
sinon tu avais aussi cette solution qui est vraiment plus court et plus simple
http://www.it-connect.fr/active-directory-auditer-la-qualite-des-mots-de-passe/
- Marqué comme réponse Pierre NICHELE jeudi 6 octobre 2016 07:51
-