Documentation
- Vue d'ensemble d'Active Directory
- Module PowerShell ActiveDirectory
- Best Practices for Securing Active Directory
Script powershell
Syncronisation
Des Windows Active directory
Avec Azure AD connect
Installation du module PowerShell Active Directory
Chercher le nom du groupe
Pour être un peux plus précis :
Récupérer les nom de poste grâce a la description
Récupérer la description grâce au nom de poste
test
Récupérer les nom de poste d'un groupes en fichier excel
Get-ADGroupMember -identity “nom du groupe” | select name | Export-csv -path C:\Output\Groupmembers.csv -NoTypeInformation
Récupérer la liste des poste
Exporter des groupe AD et des groupes sur le serveur de fichier
Get-ADComputer -Filter {name -Like "*CT*"} -SearchBase 'OU=FR-CENTRE-EST,DC=domaine,DC=local' -Property DistinguishedName, Name, Description | Select -Property DistinguishedName, Name, Description | Export-Csv -NoTypeInformation -UseCulture -Encoding OEM -Path "C:\Users\user\Downloads\test.csv"
Installer l'outil qui permet d'exporter les groupes sur le serveur de fichier
mettre plus de chose
Exporter les utilisateur de groupes
#dossier groupe : il faut mettre les groupe ou l'on souhaite l'extration des utilisateur
$Groups = Get-Content C:\Users\user\Downloads\group.txt
$output = Foreach($group in $groups)
{
write-Output "Voici les membres de $group :"
Get-ADGroupMember $group | Select-Object name
write-Output " "
}
#la sortit text de l'export
$output | Out-File -encoding UTF8 -append C:\Users\user\Downloads\members.txt
Exemple : Faire une extract de tous les postes avec la version du système d'exploitation et le nom.
Get-ADComputer -filter * -SearchBase "OU=Organisation,DC=Organisation,DC=com" -Properties OperatingSystemVersion,Modified | where { ($_.DistinguishedName -notlike "*OU=Disable Computer,OU=Organisation,DC=Organisation,DC=com*") | Sort Name | Format-Table Name,Enabled,OperatingSystemVersion,Modified -AutoSize | Out-File C:\Users\adminuser\Downloads\versionos.txt
Exporter les utilisateurs inactif depuis plus de 6 mois
$date = Get-Date
$sixMonthsAgo = $date.AddMonths(-6)
$users = Get-ADUser -Filter {Enabled -eq $True} -Properties LastLogonTimeStamp | Where-Object {([datetime]::FromFileTime($_.LastLogonTimeStamp)) -lt $sixMonthsAgo}
$users | Select-Object -Property Name
Avoir une liste des PC ayant recu la GPO laps ou non
$OU = "OU=Suisse,OU=Organisation,DC=Organisation,DC=com"
$PasswordAttribute = "ms-Mcs-AdmPwd"
$Computers = Get-ADComputer -SearchBase $OU -Filter *
$Results = @()
foreach ($Computer in $Computers) {
$Password = (Get-ADComputer $Computer.Name -Properties $PasswordAttribute).$PasswordAttribute
if ($Password) {
$Result = [PSCustomObject]@{
ComputerName = $Computer.Name
Password = $Password
Status = "Modified"
}
} else {
$Result = [PSCustomObject]@{
ComputerName = $Computer.Name
Password = $null
Status = "Not Modified"
}
}
$Results += $Result
}
$Results | Select-Object ComputerName, Status, Password | Export-Csv -Path "LAPS_Deployment_Results.csv" -NoTypeInformation
Script de désactivation de poste inactif
$d = [DateTime]::Today.AddDays(-90)
$logPath = "C:\Disable-Computer-History" # Spécifiez le chemin de votre fichier log
# Déplacer les comptes déjà désactivés pour les mettres dans la bonne OU
Get-ADComputer -filter {(enabled -eq "false")} -SearchBase "OU=Organisation,DC=Organisation,DC=com" -properties cn, distinguishedName |
Where-Object { $_.distinguishedName -notlike "*OU=Disable Computer,OU=Organisation,DC=Organisation,DC=com*" } |
ForEach-Object {
$_ | Move-ADObject -Targetpath 'OU=Disable Computer,OU=Organisation,DC=Organisation,DC=com'
"$($_.Name) le $(Get-Date) deja desactive " | Out-File -FilePath $logPath -Append
}
# Déplacer et désactiver les comptes inactifs depuis 90 jours
Get-ADComputer -filter {(enabled -eq "true") -and (lastlogondate -le $d)} -SearchBase "OU=Organisation,DC=Organisation,DC=com" -properties cn,lastlogondate |
ForEach-Object {
$_ | Move-ADObject -Targetpath 'OU=Disable Computer,OU=Organisation,DC=Organisation,DC=com'
"$($_.Name) le $(Get-Date) inactif depuis plus de 90 jours" | Out-File -FilePath $logPath -Append
}
# Déplacer et désactiver les comptes sans date de dernière connexion
Get-ADComputer -filter {enabled -eq "true"} -SearchBase "OU=Organisation,DC=Organisation,DC=com" -properties cn,lastlogondate |
Where-Object{$_.lastlogondate -eq $null} |
ForEach-Object {
$_ | Move-ADObject -Targetpath 'OU=Disable Computer,OU=Organisation,DC=Organisation,DC=com'
"$($_.Name) le $(Get-Date) aucune date de derniere connexion" | Out-File -FilePath $logPath -Append
}
# Désactiver les comptes de l'OU "Disable Computer"
Get-ADComputer -Filter 'Name -like "*"' -SearchBase "OU=Disable Computer,OU=Organisation,DC=Organisation,DC=com" | Disable-ADAccount |
ForEach-Object {
$_ | Move-ADObject -Targetpath 'OU=Disable Computer,OU=Organisation,DC=Organisation,DC=com'
"$($_.Name) le $(Get-Date) dans OU disable" | Out-File -FilePath $logPath -Append
}
Scipt de désactivation de compte utilisateur
Affiché tous les utilisateurs qui ne sont jamais connecter
$LogFile = "C:\Temp\InactiveAccounts.txt"
$90DaysAgo = (Get-Date).AddDays(-90)
$ADUsers = Get-ADUser -Filter * -SearchBase "OU=Organisation,DC=Organisation,DC=com" -Properties LastLogonDate,Enabled |
Where-Object { $_.DistinguishedName -notlike "*,OU=Service Account,OU=Organisation,DC=Organisation,DC=com" }
foreach ($User in $ADUsers) {
if ($User.LastLogonDate -lt $90DaysAgo -and $User.Enabled) {
$UserDetails = "User: {0}, Last Logon: {1}" -f $User.SamAccountName, $User.LastLogonDate
Add-Content -Path $LogFile -Value $UserDetails
}
}
Script test qui liste les utilisateur qui vont être désactivé
$outputFile = "C:\File.txt"
$currentDate = Get-Date
$userAccounts = Get-ADUser -Filter * -Properties LastLogonDate,Enabled,PasswordLastSet |
Where-Object {$_.Enabled -eq $true -and $_.DistinguishedName -notlike "*,OU=Service Account,OU=Organisation,DC=Organisation,DC=com*" -and $_.LastLogonDate -ne $null}
$inactiveAccounts = $userAccounts | Where-Object {$_.LastLogonDate -lt ($currentDate.AddDays(-90))}
foreach ($account in $inactiveAccounts) {
Add-Content -Path $outputFile -Value $account.SamAccountName
}
Script qui désactive les utilisateurs
$destinationOU = "OU=Comptes desactives,OU=Organisation,DC=Organisation,DC=com"
$currentDate = Get-Date
$userAccounts = Get-ADUser -Filter * -Properties LastLogonDate,Enabled,PasswordLastSet |
Where-Object {$_.Enabled -eq $true -and $_.DistinguishedName -notlike "*,OU=Service Account,OU=Organisation,DC=Organisation,DC=com*" -and $_.LastLogonDate -ne $null}
$inactiveAccounts = $userAccounts | Where-Object {$_.LastLogonDate -lt ($currentDate.AddDays(-90))}
foreach ($account in $inactiveAccounts) {
Disable-ADAccount -Identity $account
Move-ADObject -Identity $account.DistinguishedName -TargetPath $destinationOU
}
Script qui déplace les utilisateurs après 90 jours d'inactivités dans une OU après 30 jours ces utilisateurs sont déplacées dans une autre OU et sont désactivé
# Set variables
$inactiveDays = 90
$inactiveOU = "OU=Inactive Account,OU=Organisation,DC=Organisation,DC=com"
$disableOU = "OU=Disable Account,OU=Organisation,DC=Organisation,DC=com"
$disableDays = 30
$date = Get-Date
# Get a list of inactive users
$inactiveUsers = Search-ADAccount -AccountInactive -TimeSpan "$inactiveDays" -UsersOnly
# Move inactive users to the inactive OU, unless they're already in the disable OU
foreach ($user in $inactiveUsers) {
$userDN = $user.DistinguishedName
$userOU = $userDN.Substring($userDN.IndexOf("OU="))
if ($userOU -ne $disableOU) {
Move-ADObject -Identity $userDN -TargetPath $inactiveOU
}
}
# Get a list of inactive users in the inactive OU for more than $disableDays
$disableUsers = Get-ADUser -SearchBase $inactiveOU -Filter {Enabled -eq $true} | where {$date.Subtract($_.LastLogonDate).Days -ge $disableDays}
# Disable and move users to the disable OU
foreach ($user in $disableUsers) {
$userDN = $user.DistinguishedName
Disable-ADAccount -Identity $userDN
Move-ADObject -Identity $userDN -TargetPath $disableOU
Lister les utilisateurs qui n'ont pas d'expiration de mot de passe
Le script cherche tout les user dans le domaine sauf :
1. Dans l'OU : Service Account,OU=Organisation,DC=Organisation,DC=on
2. Les comptes désactivés
Get-ADUser -Filter {(PasswordNeverExpires -eq $true) -and (Enabled -eq $true)} -Properties Name, UserPrincipalName, PasswordNeverExpires | Where-Object { $_.DistinguishedName -notlike "*,OU=Service Account,OU=Organisation,DC=Organisation,DC=com" } | Select-Object name,PasswordNeverExpires
Désactivation "bulk" de compte utilisateur
$destinationOU = "OU=Disable Account,OU=Organisation,DC=Organisation,DC=com"
$userPrincipalNameList = Get-Content "UserList.txt"
$outputFile = "OutputResult.txt"
foreach ($userPrincipalName in $userPrincipalNameList) {
$user = Get-ADUser -Filter {UserPrincipalName -eq $userPrincipalName}
if ($user) {
Disable-ADAccount -Identity $user
Move-ADObject -Identity $user.ObjectGUID -TargetPath $destinationOU
$message = "$userPrincipalName est désactivé"
Write-Host $message
$message | Out-File -Append -FilePath $outputFile
} else {
$errorMessage = "$userPrincipalName n'a pas été trouvé"
Write-Host $errorMessage
$errorMessage | Out-File -Append -FilePath $outputFile
}
}
Lister les users d'une OU
Get-ADUser -Filter * -SearchBase " OU=GA-OnPrem,OU=Generic Account,OU=Organisation,DC=Organisation,DC=com " -Property Name | Select-Object Name
Lister les postes d'une OU
Get-ADComputer -Filter 'Name -like "*"' -SearchBase "OU=Disable Computer,OU=Organisation,DC=Organisation,DC=com" | Select-Object "Name"
Vérifier la syncronisation des controlleurs de domaine
Version plus courte :Donnés des accès types "Workstation Admin"
Création de l'utilisateur "Workstation"
Se connecter sur un active directory et aller dans la console AD
Dans l' OU=Administrator,OU=Groupe,OU=Organisation,DC=Organisation,DC=com ajouter l'utilisateur souhaité dans le groupe "Workstation Admin".

l'ajouter dans ce groupe va le donné accès administrateur a tous les postes du domaine legacy active directory.
Nous allons maintenant aussi l'ajouter pour qu'il soit administrateur sur tous les postes Endpoint.
Se connecter sur https://endpoint.microsoft.com/ aller dans groupe Ajouter des membres - Microsoft Endpoint Manager admin center

Donnés des accès types "Serveur Admin"

Donnés des accès types "Domain Admin"

Script PowerShell
Stratégie de mot de passe
Pour les authentifications Legacy
Crée une stratégie de mot de passe dans l'OU CN=Password Settings Container,CN=System,DC=nomdedomaine,DC=com
Cocher uniquement la case "Appliquer la stratégie de verrouillage des comptes"

Si l'on souhaite ajouter tous les utilisateurs a cette stratégie on ajoute dans la section "s'applique directement à" ajouter "Domain Users"

On peut ensuite essayer sur un poste :

Pour les postes Endpoint
-
Dans la section Appareils | Windows > Profils de configuration > Crée un profil
-
Choisisser le nom de la stratégie dans la section paramètre de configuration aller dans "Verrouillage de l'appareil".
-
Cocher la case dans "mot de passe de l'appareil activé" "Nombre dmaximal de tentatives de mot de passe de l'appareil"

Attention cette stratégie va verrouillé le poste sur BitLocker.
Pour Microsoft365
Azure > Sécurité > Méthode d'authentification > protection par mot de passe

Sécurisation de l'AD
Source : Microsoft