Powershell ADSI

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Annuaires (WinNT / LDAP)
Accélérateur [ADSI]
Type .NET System.DirectoryServices.DirectoryEntry
Voir aussi Powershell AD module · Module AD

ADSI (Active Directory Service Interfaces) permet d'interroger et modifier des annuaires via les fournisseurs WinNT:// (base SAM locale) et LDAP:// (Active Directory). L'accélérateur PowerShell [ADSI] retourne un objet .NET System.DirectoryServices.DirectoryEntry.

[ADSI]"WinNT://$machine"
[ADSI]'LDAP://CN=...'

ADSI local (WinNT)

Lister les groupes locaux :

param([string]$machine = '.')
$connexion = [ADSI]"WinNT://$machine"
$connexion.PSBase.Children |
    Where { $_.PSBase.SchemaClassName -eq 'group' } |
    ForEach { $_.Name }

Lister les membres d'un groupe local :

param([string]$machine = '.',
      [string]$groupe  = $(Throw 'Nom de groupe obligatoire !'))

$connexion = [ADSI]"WinNT://$machine/$groupe,group"
$connexion.PSBase.Invoke('Members') |
    ForEach { $_.GetType().InvokeMember('Name','GetProperty',$null,$_,$null) }

Ajouter / retirer un membre :

$connexion = [ADSI]"WinNT://$machine/$groupe,group"
$connexion.Add("WinNT://$utilisateur")
$connexion.Remove("WinNT://$utilisateur")

Créer / supprimer un groupe local :

$connexion = [ADSI]"WinNT://$machine"
$objGroupe = $connexion.Create('group', $groupe)
$objGroupe.Put('Description', $description)
$objGroupe.SetInfo()

$connexion.Delete('group', $groupe)

Créer un utilisateur local :

$objMachine = [ADSI]"WinNT://$machine"
$objUser = $objMachine.Create('user', $nom)
$objUser.SetPassword($motDePasse)
$objUser.PSBase.InvokeSet('Description', $description)
$objUser.SetInfo()

Désactiver un compte (bit UserFlags) :

$user = [ADSI]'WinNT://./stef,user'
$flags = $user.PSBase.InvokeGet('UserFlags')
$user.PSBase.InvokeSet('UserFlags', $($flags -bor 2))
$user.PSBase.CommitChanges()

ADSI domaine (LDAP / AD DS)

L'objet [ADSI]'LDAP://...' correspond à un System.DirectoryServices.DirectoryEntry.

# Connexion
$objUser    = [ADSI]'LDAP://CN=arnaud,OU=Info,DC=domain,DC=com'
$objDomaine = [ADSI]'LDAP://DC=domain,DC=com'
$objDomaine = [ADSI]''            # domaine courant
$objGC      = [ADSI]'GC://DC=domain,DC=com'   # forêt (catalogue global)

# Connexion avec identifiants (framework)
$objDomaine = New-Object System.DirectoryServices.DirectoryEntry('LDAP://serveur/DC=domain,DC=com','CompteAdmin','MotDePasse')

Recherche d'objets :

$objRecherche = New-Object System.DirectoryServices.DirectorySearcher([ADSI]'')

$objRecherche.Filter = '(objectCategory=organizationalUnit)'
$objRecherche.FindAll()

$objRecherche.Filter = '(&(objectCategory=person)(objectClass=user))'
$objRecherche.FindAll()

$objRecherche.FindOne()   # premier résultat seulement

Créer une OU :

$objDomaine = [ADSI]''
$objOU = $objDomaine.Create('organizationalUnit', 'ou=finance')
$objOU.Put('Description', 'Services financiers')
$objOU.SetInfo()

Créer un groupe (global par défaut) :

$objOU = [ADSI]'LDAP://OU=Informatique,DC=domain,DC=com'
$objGroupe = $objOU.Create('group', 'cn=Responsables Projets')
$objGroupe.Put('samAccountName', 'ResponsablesProjets')
$objGroupe.Put('Description', 'Responsables des projets informatiques')
$objGroupe.SetInfo()

Types de groupe : 2 global, 4 local, 8 universel, combinés avec le bit de sécurité (2147483648).

Créer un utilisateur (attributs obligatoires : cn, SamAccountName) :

$objOU = [ADSI]'LDAP://OU=Utilisateurs,DC=domain,DC=com'
$objUser = $objOU.Create('user', 'cn=Edouard Bracame')
$objUser.Put('SamAccountName', 'Bracame')
$objUser.Put('UserPrincipalName', 'Bracame@domain.com')
$objUser.SetInfo()

# Le mot de passe s'affecte après la création
$objUser.SetPassword('MotDePasse')
$objUser.SetInfo()

# Activation
$objUser.PSBase.InvokeSet('AccountDisabled', $false)
$objUser.SetInfo()

Manipulation d'attributs :

$objUser.Put('Description', 'Compte utilisateur')
$objUser.SetInfo()
$objUser.Get('Description')

# PutEx : 1=efface le contenu, 2=remplace, 3=ajoute, 4=retire des valeurs
$objUser.PutEx(2, 'TelephoneNumber', @('0102030405'))
$objUser.PutEx(4, 'OtherTelephone', @('0102030406'))
$objUser.SetInfo()

Supprimer un utilisateur :

$objOU = [ADSI]'LDAP://OU=Utilisateurs,DC=domain,DC=com'
$objOU.Delete('user', 'CN=Stephane Marcel')

Voir aussi