Главная

Wednesday, 18 May 2022

Аудит объектов GPO.

Всем привет.

Согласно лучших практик в AD со временем появляются объекты GPO которые по тем или иным причинам не используются или задействованы частично. Причем при этом следует различать не задействованную политику в разделе Пользователя или Компьютера, незалинкованную политику и просто пустую политику. Все такие типы имеют место быть, но в целях безопасности лучше он них вовремя избавляться.

Поэтому самое время поискать у себя неполные GPO с помощью Powershell.

Ловим пустые GPOs в домене так:

Function Get-EmptyGPO {

Param (

[Parameter(Position=0,ValueFromPipeline=$True,

ValueFromPipelinebyPropertyName=$True)]

[string]$DisplayName

)

Begin {

Import-Module GroupPolicy

}

Process {

#create an XML report

[xml]$report=Get-GPOReport -Name $displayname -ReportType XML

 #totally empty

 if ((-Not $report.gpo.user.extensiondata) -AND (-not $report.gpo.computer.extensiondata)) {

    #no extension data so write

    Get-GPO -Name $Displayname

}

} #process

End {}

} #function

Function Test-EmptyGPO {

Param (

[Parameter(Position=0,ValueFromPipeline=$True,

ValueFromPipelinebyPropertyName=$True)]

[string]$DisplayName

)

Begin {

#import the GroupPolicy Module

Import-Module GroupPolicy

}

Process {

    #set default values

    $User=$False

    $Computer=$False

    #create an XML report

    [xml]$report=Get-GPOReport -Name $displayname -ReportType XML

    if ($report.gpo.user.extensiondata) {

     $User=$True

    }

    If ($report.gpo.computer.extensiondata) {

     $Computer=$True

    }

    #write a custom object to the pipeline

    New-Object -TypeName PSObject -Property @{

    Displayname=$report.gpo.name

    UserData=$User

    ComputerData=$Computer

    }

} #Process

End {}

} #function

Get-GPO -All | Get-EmptyGPO

#Get-GPO -All | Test-EmptyGPO

Или ловим пустые GPOs in the domain так:

import-module grouppolicy

$gpos = get-gpo -All

foreach ($item in $gpos)

{

      if ($item.Computer.DSVersion -eq 0 -and $item.User.DSVersion -eq 0)

     {

             write-host Policy '"'$item.DisplayName'"' has empty configuration.

      }

}

Ловим незалинкованные GPOs так:

Import-Module ActiveDirectory,GroupPolicy

# GUID regular expression pattern

[Regex]$RegEx = "(([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12})"

# create an array of distinguishednames

$dn=@()

$dn+=Get-ADDomain | select -ExpandProperty DistinguishedName

$dn+=Get-ADOrganizationalUnit -filter * | select -ExpandProperty DistinguishedName

$links=@()

# get domain and OU links

foreach ($container in $dn) {

    #pull the GUID and add it to the array of links

    get-adobject -identity $container -prop gplink | 

    where {$_.gplink} | Select -expand gplink | foreach {

      #there might be multiple GPO links so split 

      foreach ($item in ($_.Split("]["))) {

        $links+=$regex.match($item).Value

      } #foreach item

    } #foreach

} #foreach container

#$links

# get all gpos where the ID doesn't belong to the array

# write the GPO to the pipeline

Get-GPO -All | Where {$links -notcontains $_.id} | Select displayname,GpoStatus | Sort displayname


Ну и, наконец, GPO которые не применимы в разделах Computer or User или в обоих вместе:

# Get GPO with enable/disable status of Computer or User

# flags values:

# 0 = Computer Configuration is enable  and User Configuration is enable

# 1 = Computer Configuration is enable  and User Configuration is disable

# 2 = Computer Configuration is disable and User Configuration is enable

# 3 = Computer Configuration is disable and User Configuration is disable


Get-ADObject -LDAPFilter "(flags=1)" -SearchScope Subtree -Properties displayName,flags | Select displayName,flags | ft

Get-ADObject -LDAPFilter "(flags=2)" -SearchScope Subtree -Properties displayName,flags | Select displayName,flags | ft

Get-ADObject -LDAPFilter "(flags=3)" -SearchScope Subtree -Properties displayName,flags | Select displayName,flags | ft

Вот собственно и все на сегодня.
Удачи и Слава Украине!

No comments:

Post a Comment

А что вы думаете по этому поводу?