Согласно лучших практик в 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
А что вы думаете по этому поводу?