Vous trouvez ci-dessous des scripts, qui vont vous permettre de changer en masse le propriétaire de différents objets Active Directory comme :
- Utilisateurs
- Groupes
- Unité d’Organisation
- Ordinateurs
Dans une situation « normale », le propriétaire d’objets Active Directory est :
- Admins du domaine
- Administrateurs de l’entreprise
- BUILTIN\Administrateurs
- AUTORITE NT\Système
Quand un objet est créé par un utilisateur non membre d’un des groupes ci-dessus par le biais d’une délégation ou de l’utilisation du groupe « Opérateur de compte », c’est l’utilisateur qui a créé l’objet qui en est le propriétaire.
Cette situation peut poser des problèmes de sécurité, si vous avez seulement quelques objets, il est possible de le faire à la main, mais si vous en avez plusieurs dizaines/centaines, cela peut prendre beaucoup de temps.
Vous trouverez les scripts ici : PowerShell/Active Directory/Fix Owner Objects · master · RDR-IT / Scripts · GitLab
Si vous souhaitez seulement afficher les objets concernés :
Utilisateurs :
# Get Users Owner
# Sources :
# - https://blog.piservices.fr/post/2021/03/29/powershell-who-s-owner-of-my-ad-object
# - https://blog.piservices.fr/post/2021/04/12/powershell-change-the-owner-of-my-ad-objects
#
# /!\ You must adapt the name of the groups to the installation language of your domain controller /!\
#
# Dans le cas d'utilisation de ORADAD de ANSSI, le script permet de corriger le probleme : vuln3_owner
# https://www.cert.ssi.gouv.fr/uploads/guide-ad.html#owner
#
#
# Create Array
$Array = @()
# Collect AD infos
$Domain = Get-ADDomain | select -ExpandProperty NetBIOSName
$AllUsers = Get-ADUser -Filter * -Properties nTSecurityDescriptor
# Store Info
$AllUsers | foreach {
$DistinguishedName = $_.DistinguishedName
$GivenName = $_.GivenName
$Name = $_.Name
$ObjectClass = $_.ObjectClass
$ObjectGUID = $_.ObjectGUID
$SamAccountName = $_.SamAccountName
$SID = $_.SID
$Surname = $_.Surname
$UserPrincipalName = $_.UserPrincipalName
$nTSecurityDescriptor = $_.nTSecurityDescriptor
$Array += New-Object psobject -Property @{
DistinguishedName = $DistinguishedName
GivenName = $GivenName
Name = $Name
Owner = $nTSecurityDescriptor.owner
ObjectClass = $ObjectClass
ObjectGUID = $ObjectGUID
SamAccountName = $SamAccountName
SID = $SID
Surname = $Surname
UserPrincipalName = $UserPrincipalName
}
$DistinguishedName = $null
$GivenName = $null
$Name = $null
$nTSecurityDescriptor = $null
$ObjectClass = $null
$ObjectGUID = $null
$SamAccountName = $null
$SID = $null
$Surname = $null
$UserPrincipalName = $null
$CurrentUser = $null
$nTSecurityDescriptor = $null
}
# How many Accounts were returns ?
Write-Host $Array.Count -ForegroundColor Yellow
# How many Accounts need to be reviewed ?
$NoGood = $Array.Where({(($_.Owner -ne "$Domain\Admins du domaine") -and ($_.Owner -ne "$Domain\Enterprise Admins") -and ($_.Owner -ne "BUILTIN\Administrateurs") -and ($_.Owner -ne "AUTORITE NT\Système") )})
Write-Host $NoGood.count -ForegroundColor Cyan
# Print NoGood Users with Owner
# $NoGood | ft Name,Owner
$Filter = $NoGood.Where({$_.Name -notlike "SystemMailbox*"})
$Filter = $Filter.Where({$_.Name -notlike "HealthMailbox*"})
# Print NoGood Users with Owner
$Filter | ft Name,Owner
# For Debug : check difference between normal object and exchange object
#Write-Host $NoGood.count -ForegroundColor Cyan
Write-Host $Filter.count -ForegroundColor RedOrdinateurs :
# Get Computer Owner
# Sources :
# - https://blog.piservices.fr/post/2021/03/29/powershell-who-s-owner-of-my-ad-object
# - https://blog.piservices.fr/post/2021/04/12/powershell-change-the-owner-of-my-ad-objects
#
# /!\ You must adapt the name of the groups to the installation language of your domain controller /!\
#
# Dans le cas d'utilisation de ORADAD de ANSSI, le script permet de corriger le probleme : vuln3_owner
# https://www.cert.ssi.gouv.fr/uploads/guide-ad.html#owner
#
#
# Create Array
$Array = @()
# Collect AD infos
$Domain = Get-ADDomain | select -ExpandProperty NetBIOSName
$AllComputers = Get-ADComputer -Filter * -Properties nTSecurityDescriptor
# Store Info
$AllComputers | foreach {
$DistinguishedName = $_.DistinguishedName
$GroupCategory = $_.GroupCategory
$GroupScope = $_.GroupScope
$Name = $_.Name
$ObjectClass = $_.ObjectClass
$ObjectGUID = $_.ObjectGUID
$SamAccountName = $_.SamAccountName
$SID = $_.SID
$nTSecurityDescriptor = $_.nTSecurityDescriptor
$Array += New-Object psobject -Property @{
DistinguishedName = $DistinguishedName
DNSHostName = $DNSHostName
Enabled = $Enabled
Name = $Name
ObjectClass = $ObjectClass
ObjectGUID = $ObjectGUID
SamAccountName = $SamAccountName
SID = $SID
Owner = $nTSecurityDescriptor.owner
}
$DistinguishedName = $null
$DNSHostName = $null
$Enabled = $null
$Name = $null
$ObjectClass = $null
$ObjectGUID = $null
$SamAccountName = $null
$SID = $null
$nTSecurityDescriptor = $null
}
# How many Accounts were returns ?
Write-Host $Array.Count -ForegroundColor Yellow
# How many Accounts need to be reviewed ?
$NoGood = $Array.Where({(($_.Owner -ne "$Domain\Admins du domaine") -and ($_.Owner -ne "$Domain\Enterprise Admins") -and ($_.Owner -ne "BUILTIN\Administrateurs") -and ($_.Owner -ne "AUTORITE NT\Système") )})
Write-Host $NoGood.count -ForegroundColor Cyan
Write-Host $NoGoodGroupes :
# Get Computer Owner
# Sources :
# - https://blog.piservices.fr/post/2021/03/29/powershell-who-s-owner-of-my-ad-object
# - https://blog.piservices.fr/post/2021/04/12/powershell-change-the-owner-of-my-ad-objects
#
# /!\ You must adapt the name of the groups to the installation language of your domain controller /!\
#
# Dans le cas d'utilisation de ORADAD de ANSSI, le script permet de corriger le probleme : vuln3_owner
# https://www.cert.ssi.gouv.fr/uploads/guide-ad.html#owner
#
#
# Create Array
$Array = @()
# Collect AD infos
$Domain = Get-ADDomain | select -ExpandProperty NetBIOSName
$AllComputers = Get-ADComputer -Filter * -Properties nTSecurityDescriptor
# Store Info
$AllComputers | foreach {
$DistinguishedName = $_.DistinguishedName
$GroupCategory = $_.GroupCategory
$GroupScope = $_.GroupScope
$Name = $_.Name
$ObjectClass = $_.ObjectClass
$ObjectGUID = $_.ObjectGUID
$SamAccountName = $_.SamAccountName
$SID = $_.SID
$nTSecurityDescriptor = $_.nTSecurityDescriptor
$Array += New-Object psobject -Property @{
DistinguishedName = $DistinguishedName
DNSHostName = $DNSHostName
Enabled = $Enabled
Name = $Name
ObjectClass = $ObjectClass
ObjectGUID = $ObjectGUID
SamAccountName = $SamAccountName
SID = $SID
Owner = $nTSecurityDescriptor.owner
}
$DistinguishedName = $null
$DNSHostName = $null
$Enabled = $null
$Name = $null
$ObjectClass = $null
$ObjectGUID = $null
$SamAccountName = $null
$SID = $null
$nTSecurityDescriptor = $null
}
# How many Accounts were returns ?
Write-Host $Array.Count -ForegroundColor Yellow
# How many Accounts need to be reviewed ?
$NoGood = $Array.Where({(($_.Owner -ne "$Domain\Admins du domaine") -and ($_.Owner -ne "$Domain\Enterprise Admins") -and ($_.Owner -ne "BUILTIN\Administrateurs") -and ($_.Owner -ne "AUTORITE NT\Système") )})
Write-Host $NoGood.count -ForegroundColor Cyan
Write-Host $NoGoodOU – Unités d’Organisation :
# Get OU Owner
# Sources :
# - https://blog.piservices.fr/post/2021/03/29/powershell-who-s-owner-of-my-ad-object
# - https://blog.piservices.fr/post/2021/04/12/powershell-change-the-owner-of-my-ad-objects
#
# /!\ You must adapt the name of the groups to the installation language of your domain controller /!\
#
# Dans le cas d'utilisation de ORADAD de ANSSI, le script permet de corriger le probleme : vuln3_owner
# https://www.cert.ssi.gouv.fr/uploads/guide-ad.html#owner
#
#
# Create Array
$Array = @()
# Collect AD infos
$Domain = Get-ADDomain | select -ExpandProperty NetBIOSName
$AllOU = Get-ADOrganizationalUnit -Filter * -Properties nTSecurityDescriptor
# Store Info
$AllOU | foreach {
$City = $_.City
$Country = $_.Country
$DistinguishedName = $_.DistinguishedName
$ManagedBy = $_.ManagedBy
$Name = $_.Name
$nTSecurityDescriptor = $_.nTSecurityDescriptor
$Array += New-Object psobject -Property @{
City = $City
Country = $Country
DistinguishedName = $DistinguishedName
ManagedBy = $ManagedBy
Name = $Name
Owner = $nTSecurityDescriptor.owner
}
$City = $null
$Country = $null
$DistinguishedName = $null
$ManagedBy = $null
$Name = $null
$nTSecurityDescriptor = $null
}
# How many Accounts were returns ?
Write-Host $Array.Count -ForegroundColor Yellow
# How many Accounts need to be reviewed ?
$NoGood = $Array.Where({(($_.Owner -ne "$Domain\Admins du domaine") -and ($_.Owner -ne "$Domain\Enterprise Admins") -and ($_.Owner -ne "BUILTIN\Administrateurs") -and ($_.Owner -ne "AUTORITE NT\Système") )})
Write-Host $NoGood.count -ForegroundColor Cyan
$NoGood | ft Name,OwnerSources :
