Abaixo encontrará scripts que permitirão alterar em massa o proprietário de diferentes objetos da Active Directory, tais como:
- Usuários
- Grupos
- Unidade Organizacional
- Computadores
Numa situação “normal”, o proprietário dos objetos da Active Directory é:
- Administradores de domínio
- Administradores da empresa
- BUILTIN\Administradores
- AUTORITE NT\Sistema
Quando um objeto é criado por um utilizador que não é membro de um dos grupos acima referidos através de delegação ou utilização do grupo “Operador de conta”, o utilizador que criou o objeto é o proprietário do mesmo.
Esta situação pode representar problemas de segurança Se tiver apenas alguns objetos, é possível fazê-lo manualmente, mas se tiver várias dezenas/centenas, pode demorar muito tempo.
Os scripts são escritos com o nome francês dos grupos, deve adaptá-los de acordo com o idioma do seu ambiente Active Directory
Pode encontrar os scripts aqui : PowerShell/Active Directory/Fix Owner Objects · master · RDR-IT / Scripts · GitLab
Se pretender exibir apenas os objetos afetados:
Usuários :
# 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 RedComputadores :
# 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 $NoGoodGrupos :
# Fix Group 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
$AllGroups = Get-ADGroup -Filter * -Properties nTSecurityDescriptor
# Store Info
$AllGroups | 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
GroupCategory = $GroupCategory
GroupScope = $GroupScope
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
# Print NoGood Groups with Owner
$NoGood | ft Name,OwnerUnidade Organizacional :
# 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,OwnerFontes :
