none
Script pour lister les comptes AD avec un mot de passe vide RRS feed

  • 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.RemovePSDriveCommand

    Mais 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


    mercredi 5 octobre 2016 07:41

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/

    mercredi 5 octobre 2016 15:00
  • 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?

    mercredi 5 octobre 2016 10:37

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?

    mercredi 5 octobre 2016 10:37
  • 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/

    mercredi 5 octobre 2016 15:00
  • Merci beaucoup :)

    Je ne connaissais pas ce module, ça va vraiment m'être utile !

    Je teste ça de suite.

    Bonne journée.

    jeudi 6 octobre 2016 07:53