Update: So I changed some information in the script, and it works as intended when I am running it as a Domain Admin but I prefer not to give a service account DA Rights if I can avoid it, I am just not understanding why the Service Account is not using the rights I gave it in Group Policy to take ownership, is there something else I have to do?
Here is the updated Code:
$NewOwner = (Get-ADServiceAccount SVC._DA001).samAccountName
$Domains = (Get-ADForest).Domains
ForEach($Domain in $Domains){
$Identities1 = Get-ADObject -Filter * -Server $Domain -Properties objectClass | Where {$_.objectClass -eq $null}
$Identities2 = Get-ADComputer -Filter * -Properties samAccountName,memberOf,adminCount -Server $Domain | Where {$_.adminCount -lt 1}
$Identities3 = Get-ADGroup -Filter * -Properties samAccountName,memberOf,adminCount -Server $Domain | Where {$_.adminCount -lt 1}
$Identities4 = Get-ADServiceAccount -Filter * -Properties samAccountName,memberOf,adminCount -Server $Domain | Where {$_.adminCount -lt 1}
$Identities5 = Get-ADUser -Filter * -Properties samAccountName,memberOf,adminCount -Server $Domain | Where {$_.adminCount -lt 1}
$baseDN = (Get-ADDomain $Domain).DistinguishedName
$Server = (Get-ADDomainController -Server $Domain).name
Import-Module ActiveDirectory
New-PSDrive -Name ADDOM -PSProvider ActiveDirectory -Server $Domain -Scope Global -Root "//ROOTDSE/" | Out-Null
if (!($Identities1 -eq $null)){
foreach ($obj in $Identities1) {
$DN = $obj.distinguishedName
if (!($obj.memberOf -like "*Permissions Auditor Exemption*"))
{
Write-Host $DN
#First Set the Owner to the SVC Account.
$acl = get-acl -Path "ADDOM:CN=Users,$baseDN"
$acl.SetOwner([Security.Principal.NTaccount]($NewOwner))
set-acl -path ADDOM:$DN -AclObject $acl
Start-Sleep -s 2
# get explicit permissions
$acl = Get-Acl -Path ADDOM:$DN
# Set inheritance to true
$acl.SetAccessRuleProtection($false,$false)
$acl.Access |
# ...find all not inherited permissions.
Where-Object { $_.isInherited -eq $false } |
# ...and remove them
ForEach-Object { $acl.RemoveAccessRule($_) }
# set new permissions
$acl | Set-Acl -Path ADDOM:$DN
}
}
}
foreach ($obj in $Identities2) {
$DN = $obj.distinguishedName
if (!($obj.memberOf -like "*Permissions Auditor Exemption*"))
{
Write-Host $DN
#First Set the Owner to the SVC Account.
$acl = get-acl -Path ADDOM:$DN
$acl.SetOwner([Security.Principal.NTaccount]($NewOwner))
set-acl -path ADDOM:$DN -AclObject $acl
Start-Sleep -s 2
# get explicit permissions
$acl = Get-Acl -Path ADDOM:$DN
# Set inheritance to true
$acl.SetAccessRuleProtection($false,$false)
$acl.Access |
# ...find all not inherited permissions.
Where-Object { $_.isInherited -eq $false } |
# ...and remove them
ForEach-Object { $acl.RemoveAccessRule($_) }
# set new permissions
$acl | Set-Acl -Path ADDOM:$DN
}
}
foreach ($obj in $Identities3) {
$DN = $obj.distinguishedName
if (!($obj.memberOf -like "*Permissions Auditor Exemption*"))
{
Write-Host $DN
#First Set the Owner to the SVC Account.
$acl = get-acl -Path ADDOM:$DN
$acl.SetOwner([Security.Principal.NTaccount]($NewOwner))
set-acl -path ADDOM:$DN -AclObject $acl
Start-Sleep -s 2
# get explicit permissions
$acl = Get-Acl -Path ADDOM:$DN
# Set inheritance to true
$acl.SetAccessRuleProtection($false,$false)
$acl.Access |
# ...find all not inherited permissions.
Where-Object { $_.isInherited -eq $false } |
# ...and remove them
ForEach-Object { $acl.RemoveAccessRule($_) }
# set new permissions
$acl | Set-Acl -Path ADDOM:$DN
}
}
foreach ($obj in $Identities4) {
$DN = $obj.distinguishedName
if (!($obj.memberOf -like "*Permissions Auditor Exemption*"))
{
Write-Host $DN
#First Set the Owner to the SVC Account.
$acl = get-acl -Path ADDOM:$DN
$acl.SetOwner([Security.Principal.NTaccount]($NewOwner))
set-acl -path ADDOM:$DN -AclObject $acl
Start-Sleep -s 2
# get explicit permissions
$acl = Get-Acl -Path ADDOM:$DN
# Set inheritance to true
$acl.SetAccessRuleProtection($false,$false)
$acl.Access |
# ...find all not inherited permissions.
Where-Object { $_.isInherited -eq $false } |
# ...and remove them
ForEach-Object { $acl.RemoveAccessRule($_) }
# set new permissions
$acl | Set-Acl -Path ADDOM:$DN
}
}
foreach ($obj in $Identities5) {
$DN = $obj.distinguishedName
if (!($obj.memberOf -like "*Permissions Auditor Exemption*"))
{
Write-Host $DN
#First Set the Owner to the SVC Account.
$acl = get-acl -Path ADDOM:$DN
$acl.SetOwner([Security.Principal.NTaccount]($NewOwner))
set-acl -path ADDOM:$DN -AclObject $acl
Start-Sleep -s 2
# get explicit permissions
$acl = Get-Acl -Path ADDOM:$DN
# Set inheritance to true
$acl.SetAccessRuleProtection($false,$false)
$acl.Access |
# ...find all not inherited permissions.
Where-Object { $_.isInherited -eq $false } |
# ...and remove them
ForEach-Object { $acl.RemoveAccessRule($_) }
# set new permissions
$acl | Set-Acl -Path ADDOM:$DN
}
}
Remove-PSDrive ADDOM
}
Having trouble with this PS Script. I am attempting to use it to find all active directory objects and take ownership of them as well as reset any custom permissions that have been added to the objects.
The reason for this is to prevent lower level administrators from going in adding any backdoor permissions for individuals/groups that shouldn't have rights over those objects.
I have added my service account used for this process to the "Take Ownership of Files and other objects" Group Policy Right as well so there should be no problems.
$NewOwner = (Get-ADServiceAccount SVC._DA001).samAccountName
$Domains = (Get-ADForest).Domains
ForEach($Domain in $Domains){
$Identities1 = Get-ADObject -Filter * -Server $Domain -Properties objectClass | Where {$_.objectClass -eq $null}
$Identities2 = Get-ADComputer -Filter * -Properties samAccountName,memberOf,adminCount -Server $Domain | Where {$_.adminCount -lt 1}
$Identities3 = Get-ADGroup -Filter * -Properties samAccountName,memberOf,adminCount -Server $Domain | Where {$_.adminCount -lt 1}
$Identities4 = Get-ADServiceAccount -Filter * -Properties samAccountName,memberOf,adminCount -Server $Domain | Where {$_.adminCount -lt 1}
$Identities5 = Get-ADUser -Filter * -Properties samAccountName,memberOf,adminCount -Server $Domain | Where {$_.adminCount -lt 1}
$baseDN = (Get-ADDomain $Domain).DistinguishedName
if ($Identities1){
$Identities = $Identities1 + $Identities2 + $Identities3 + $Identities4 + $Identities5
}
Else{
$Identities = $Identities2 + $Identities3 + $Identities4 + $Identities5
}
$Server = (Get-ADDomainController -Server $Domain).name
Import-Module ActiveDirectory
New-PSDrive -Name ADDOM -PSProvider ActiveDirectory -Server $Domain -Scope Global -Root "//ROOTDSE/" | Out-Null
foreach ($obj in $Identities) {
$DN = $obj.distinguishedName
if (!($obj.memberOf -like "*Permissions Auditor Exemption*"))
{
Write-Host $DN
#First Set the Owner to the SVC Account.
$acl = get-acl -Path "ADDOM:CN=Users,$baseDN"
$acl.SetOwner([Security.Principal.NTaccount]($NewOwner))
set-acl -path ADDOM:$DN -AclObject $acl
Start-Sleep -s 2
# get explicit permissions
$acl = Get-Acl -Path ADDOM:$DN
# Set inheritance to true
$acl.SetAccessRuleProtection($false,$false)
$acl.Access |
# ...find all not inherited permissions.
Where-Object { $_.isInherited -eq $false } |
# ...and remove them
ForEach-Object { $acl.RemoveAccessRule($_) }
# set new permissions
$acl | Set-Acl -Path ADDOM:$DN
}
}
Remove-PSDrive ADDOM
}