Powershell AD module

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Active Directory
Module ActiveDirectory
Prérequis Niveau fonctionnel 2003 SP1 mini
Voir aussi Module AD · Powershell ADSI

Utilisation des cmdlets du module ActiveDirectory. Le module doit d'abord être importé (voir Import-module et Module AD) ; il expose aussi le fournisseur AD: (voir Get-psprovider).

cd AD:
Get-ChildItem
cd '.\DC=domain,DC=com'
cd .\OU=test

Move-Item '.\CN=user name' 'CN=toto,DC=domain,DC=com'
Set-ItemProperty -Path 'AD:\CN=toto,DC=domain,DC=com' -Name 'EmployeeID' -Value '12345'
(Get-ItemProperty -Path 'AD:\CN=toto,DC=domain,DC=com' -Name 'EmployeeID').EmployeeID

Recherche d'objets

# Filtre LDAP
Get-ADObject -LDAPFilter '(name=*jean*)'
Get-ADObject -LDAPFilter '(&(objectCategory=computer)(name=win*))'

# Filtre PowerShell
Get-ADObject -Filter *
Get-ADObject -Filter { objectClass -eq 'computer' }
Get-ADComputer -Filter { (name -like 'Win*') -and (enabled -eq 'False') }

# Par identité (nom, GUID, SID ou DN)
Get-ADComputer -Identity 'SRV-EXCH01'
Get-ADComputer -Identity 'CN=SRV-EXCH01,CN=Computers,DC=domain,DC=com'

Gestion des utilisateurs

Get-Command -Module ActiveDirectory -Name *user*

Get-ADUser -Filter *
Get-ADUser -Filter * -SearchBase 'OU=Finance,DC=domain,DC=com'

# Création simple
New-ADUser -Name JoeBar

# Création détaillée
New-ADUser -SamAccountName Posichon -Name 'Paul Posichon' `
  -GivenName Paul -Surname Posichon `
  -DisplayName 'Paul Posichon' -Description 'Utilisateur' `
  -HomeDrive 'H:' -HomeDirectory '\\Server\user' `
  -Path 'OU=Finance,DC=domain,DC=com'

Mots de passe et activation :

$pwd = ConvertTo-SecureString 'MotDePasse!' -AsPlainText -Force

New-ADUser -SamAccountName DucableJR -Name 'JR Ducable' -AccountPassword $pwd
Set-ADAccountPassword -Identity DucableJR -NewPassword $pwd -Reset

New-ADUser -SamAccountName Posichon -Name 'Paul Posichon' `
  -Path 'OU=Finance,DC=domain,DC=com' -AccountPassword $pwd -Enabled $true

Lecture / modification / suppression d'attributs :

Get-ADUser -Identity Posichon -Property Name,WhenCreated,PasswordLastSet
Get-ADUser -Identity Posichon -Property *

Set-ADUser -Identity Posichon -Replace @{
    Description     = 'Utilisateur sympathique'
    TelephoneNumber = '0102030405'
    OtherTelephone  = @('0102030406','0102030407')
}
Set-ADUser -Identity Posichon -Clear OtherTelephone

Remove-ADUser -Identity Posichon -Confirm:$false

Gestion des groupes

Get-Command -Module ActiveDirectory -Name *group*

Get-ADGroup -Filter *
Get-ADGroup -Filter { GroupScope -eq 'Universal' } | Format-Table Name, GroupScope
Get-ADGroup -Identity Administrators

# Création (groupe de sécurité par défaut)
New-ADGroup -Name UtilisateurVDI -GroupScope DomainLocal -GroupCategory Security
New-ADGroup -Name UtilisateurTS  -GroupScope Global      -GroupCategory Distribution

# Membres
Get-ADGroupMember -Identity Administrators -Recursive
Add-ADGroupMember -Identity UtilisateurVDI -Members BracameE, DucableJR
Add-ADPrincipalGroupMembership -Identity DucableJR -MemberOf group1, group2
Remove-ADGroupMember -Identity UtilisateurVDI -Members DucableJR -Confirm:$false
Remove-ADGroup -Identity GrpDelegue1

Scripts d'exploitation

Comptes d'ordinateurs périmés

Version avec le module AD (niveau fonctionnel 2003 SP1 minimum) :

# Get-MachineAccounts.ps1
[datetime]$date = '01/01/1601'
$comptes = Get-ADComputer -Filter * -Properties Name,LastLogonTimeStamp,OperatingSystem,OperatingSystemVersion

$comptes | Select @{n='Nom commun';        e={$_.Name}},
                  @{n='Dernière connexion'; e={$date.AddTicks($_.LastLogonTimeStamp)}},
                  @{n='OS';                 e={$_.OperatingSystem}},
                  @{n='Version';            e={$_.OperatingSystemVersion}}

Équivalent bas niveau via DirectorySearcher :

[datetime]$date = '01/01/1601'
$objDomaine   = [ADSI]''
$objRecherche = New-Object System.DirectoryServices.DirectorySearcher($objDomaine)
$objRecherche.Filter = '(&(SamAccountType=805306369)(name=*))'
$comptes = $objRecherche.FindAll()

Création d'utilisateurs par lots

Excel n'exporte qu'avec le séparateur « ; » ; Import-Csv attend « , ». Le plus simple :

Import-Csv .\ListeUtilisateurs.csv -Delimiter ';' | New-ADUser -Path 'OU=Finance,DC=domain,DC=com'

Surveillance des ajouts au groupe Admins du domaine

# Watch-AdminGroup.ps1
$strComputer = '.'
$query = New-Object System.Management.WQLEventQuery `
  "SELECT * FROM __InstanceCreationEvent WITHIN 30 WHERE TargetInstance ISA 'Win32_NTLogEvent' AND TargetInstance.EventCode = '632'"

$scope   = New-Object System.Management.ManagementScope "\\$strComputer\root\cimv2"
$watcher = New-Object System.Management.ManagementEventWatcher $scope, $query
$watcher.Start()

while ($true) {
    $event = $watcher.WaitForNextEvent()
    if ($event.TargetInstance.Message -match 'Admins du domaine') {
        $message = New-Object System.Net.Mail.MailMessage `
            'mouchard@example.com', 'admin@example.com',
            'Alerte : ajout dans Admins du domaine',
            "$($event.TargetInstance.User)`n$($event.TargetInstance.TimeWritten)"
        $client = New-Object System.Net.Mail.SmtpClient 'smtp.example.com'
        $client.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
        $client.Send($message)
    }
}

Voir aussi