Active Directory
Il modulo ActiveDirectory gestisce utenti, gruppi, computer e unità organizzative di un dominio. Fa parte degli RSAT (Remote Server Administration Tools).
Installare gli RSAT
Windows 10/11 (console amministratore):
Get-WindowsCapability -Name RSAT.ActiveDirectory* -Online
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
Import-Module ActiveDirectory
Su Windows Server:
Install-WindowsFeature RSAT-AD-PowerShell
Informazioni sul dominio
Get-ADDomain
Get-ADForest
Get-ADDomainController -Discover
Get-ADDomainController -Filter * | Select-Object Name, IPv4Address, Site, OperatingSystem
Get-ADDefaultDomainPasswordPolicy
Utenti
Get-ADUser -Identity mario.rossi
Get-ADUser -Identity mario.rossi -Properties *
Get-ADUser -Identity mario.rossi -Properties MemberOf, LastLogonDate, PasswordLastSet, Enabled, LockedOut
Get-ADUser -Filter "Name -like 'Mario*'"
Get-ADUser -Filter * -SearchBase "OU=Ufficio,DC=azienda,DC=local" | Select-Object Name, SamAccountName, Enabled
Get-ADUser -Filter 'Enabled -eq $false' | Select-Object Name, SamAccountName
Di default Get-ADUser restituisce poche proprietà: aggiungi -Properties per le altre.
Utenti bloccati e password
Search-ADAccount -LockedOut | Select-Object Name, SamAccountName
Unlock-ADAccount -Identity mario.rossi
Set-ADAccountPassword -Identity mario.rossi -Reset -NewPassword (Read-Host "Nuova password" -AsSecureString)
Set-ADUser -Identity mario.rossi -ChangePasswordAtLogon $true
Search-ADAccount -PasswordExpired | Select-Object Name
Search-ADAccount -AccountInactive -TimeSpan 90.00:00:00 -UsersOnly | Select-Object Name, LastLogonDate
Creare, modificare, disabilitare
New-ADUser -Name "Mario Rossi" -GivenName Mario -Surname Rossi -SamAccountName mario.rossi -UserPrincipalName mario.rossi@azienda.local -Path "OU=Ufficio,DC=azienda,DC=local" -AccountPassword (Read-Host "Password" -AsSecureString) -Enabled $true -ChangePasswordAtLogon $true
Set-ADUser -Identity mario.rossi -Title "Impiegato" -Department "Amministrazione" -OfficePhone "0123456"
Disable-ADAccount -Identity mario.rossi
Enable-ADAccount -Identity mario.rossi
Move-ADObject -Identity "CN=Mario Rossi,OU=Ufficio,DC=azienda,DC=local" -TargetPath "OU=Disabilitati,DC=azienda,DC=local"
Remove-ADUser -Identity mario.rossi
Gruppi
Get-ADGroup -Filter "Name -like 'Supporto*'"
Get-ADGroupMember -Identity "Domain Admins"
Get-ADGroupMember -Identity "Supporto" -Recursive | Select-Object Name, SamAccountName
Get-ADPrincipalGroupMembership mario.rossi | Select-Object Name
Add-ADGroupMember -Identity "Supporto" -Members mario.rossi
Remove-ADGroupMember -Identity "Supporto" -Members mario.rossi -Confirm:$false
New-ADGroup -Name "Supporto" -GroupScope Global -GroupCategory Security -Path "OU=Gruppi,DC=azienda,DC=local"
Copiare i gruppi da un utente a un altro:
Get-ADUser -Identity mario.rossi -Properties MemberOf | Select-Object -ExpandProperty MemberOf | Add-ADGroupMember -Members luigi.bianchi
Computer
Get-ADComputer -Identity PC01 -Properties *
Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate | Select-Object Name, OperatingSystem, LastLogonDate
Get-ADComputer -Filter 'OperatingSystem -like "*Server*"' | Select-Object Name
Get-ADComputer -Filter * -Properties LastLogonDate | Where-Object { $_.LastLogonDate -lt (Get-Date).AddDays(-90) }
Unità organizzative
Get-ADOrganizationalUnit -Filter * | Select-Object Name, DistinguishedName
New-ADOrganizationalUnit -Name "Ufficio" -Path "DC=azienda,DC=local" -ProtectedFromAccidentalDeletion $true
Filtri e ricerca
Get-ADUser -Filter "SamAccountName -eq 'mario.rossi'"
Get-ADUser -Filter "Department -eq 'Vendite' -and Enabled -eq $true"
Get-ADUser -LDAPFilter "(&(objectClass=user)(mail=*@azienda.it))"
-Filter usa una sintassi in stile PowerShell, ma è una stringa interpretata da AD: non è Where-Object. Quando possibile filtra con -Filter invece di Where-Object, perché è molto più veloce.
Report utili
Utenti attivi che non accedono da 90 giorni:
Get-ADUser -Filter 'Enabled -eq $true' -Properties LastLogonDate | Where-Object { $_.LastLogonDate -lt (Get-Date).AddDays(-90) } | Select-Object Name, SamAccountName, LastLogonDate | Export-Csv .\inattivi.csv -NoTypeInformation -Encoding UTF8
Membri dei gruppi privilegiati:
"Domain Admins", "Enterprise Admins", "Schema Admins" | ForEach-Object { Get-ADGroupMember $_ -Recursive | Select-Object @{n='Gruppo';e={$_}}, Name, SamAccountName }
Password che non scadono mai:
Get-ADUser -Filter 'PasswordNeverExpires -eq $true -and Enabled -eq $true' | Select-Object Name, SamAccountName
Importare utenti da CSV
Import-Csv .\utenti.csv | ForEach-Object {
New-ADUser -Name "$($_.Nome) $($_.Cognome)" `
-GivenName $_.Nome -Surname $_.Cognome `
-SamAccountName $_.Utente `
-UserPrincipalName "$($_.Utente)@azienda.local" `
-Path "OU=Ufficio,DC=azienda,DC=local" `
-AccountPassword (ConvertTo-SecureString $_.Password -AsPlainText -Force) `
-Enabled $true -ChangePasswordAtLogon $true
}
Il file CSV con password in chiaro va cancellato subito dopo l'uso.
Replica e salute del dominio
repadmin /replsummary
repadmin /showrepl
dcdiag /v
Get-ADReplicationFailure -Target DC01
Buone pratiche
- Prova le operazioni di massa con
-WhatIf. - Abilita il Cestino di Active Directory per recuperare oggetti eliminati.
- Usa account amministrativi dedicati, non l'account quotidiano.
- Esporta sempre un elenco prima di modificare o eliminare in blocco.