AD and Kerberos Token Bloat – Analyzing Group Nesting

How To: Analyze Nested AD Groups.

I am working on a Kerberos Token size issue (Token Bloat) and need to accurately depict a groups nested members for token size analysis and remediation.

Brief Token Bloat Explanation:

Token Bloat is where due to several factors including deep group nesting the Kerberos token utilized in AD for resource authentication bloats towards the set limit or even beyond. This can cause larger logon times to resources and even issues in applications like Exchange 2003 that can only exist on a 32Bit OS.

I came across this article on the “Microsoft Active Directory Group PowerShell” blog, it has a great script for analysing nested group memberships. Unfortunately to use the PowerShell script you need to be running Windows 2008 servers for the Active Directory cmdlets to be available. The environment that I required the script for was not W2008 so I converted the script to use the Quest cmdlets available with the Quest Active Roles Management PSSnapIn.

You will need to have these installed before using this script.

The script originally written by the MS AD PowerShell team, provides a visual tree view of the groups and their nested levels, a ‘MaxNestingLevel’ value and a ‘NestedGroupMembershipCount’.

Example:

PS C:\> Get-QADGroupNesting.ps1 group-name

Or

PS C:\> Get-QADGroupNesting.ps1 group-name -ShowTree

The above example not only displays group statistics it also plots the structure of the group in a tree format.

Download Script at PoshCode.org

Code:


##########Copy the below script into a new file called Get-ADGroupNesting.ps1

Param (
    [Parameter(Mandatory=$true,
        Position=0,
        ValueFromPipeline=$true,
        HelpMessage="DN or ObjectGUID of the AD Group."
    )]
    [string]$groupIdentity,
    [switch]$showTree
    )
#Validate Quest PSSnapin is loaded
Add-PSSnapin -Name Quest.ActiveRoles.ADManagement -ErrorAction SilentlyContinue
$global:numberOfRecursiveGroupMemberships = 0
$lastGroupAtALevelFlags = @()

function Get-GroupNesting ([string] $identity, [int] $level, [hashtable] $groupsVisitedBeforeThisOne, [bool] $lastGroupOfTheLevel)
{
    $group = $null
    $group = Get-QADGroup -Identity $identity -SizeLimit 0
    if($lastGroupAtALevelFlags.Count -le $level)
    {
        $lastGroupAtALevelFlags = $lastGroupAtALevelFlags + 0
    }
    if($group -ne $null)
    {
        if($showTree)
        {
            for($i = 0; $i -lt $level - 1; $i++)
            {
                if($lastGroupAtALevelFlags[$i] -ne 0)
                {
                    Write-Host -ForegroundColor Blue -NoNewline "  "
                }
                else
                {
                    Write-Host -ForegroundColor Blue -NoNewline "│ "
                }
            }
            if($level -ne 0)
            {
                if($lastGroupOfTheLevel)
                {
                    Write-Host -ForegroundColor Blue -NoNewline "└─"
                }
                else
                {
                    Write-Host -ForegroundColor Blue -NoNewline "├─"
                }
            }
            Write-Host -ForegroundColor Blue $group.Name
        }
        $groupsVisitedBeforeThisOne.Add($group.DN,$null)
        $global:numberOfRecursiveGroupMemberships ++
        $groupMemberShipCount = $group.memberOf.Count
        if ($groupMemberShipCount -gt 0)
        {
            $maxMemberGroupLevel = 0
            $count = 0
            foreach($groupDN in $group.memberOf)
            {
                $count++
                $lastGroupOfThisLevel = $false
                if($count -eq $groupMemberShipCount){$lastGroupOfThisLevel = $true; $lastGroupAtALevelFlags[$level] = 1}
                if(-not $groupsVisitedBeforeThisOne.Contains($groupDN)) #prevent cyclic dependancies
                {
                    $memberGroupLevel = Get-GroupNesting -Identity $groupDN -Level $($level+1) -GroupsVisitedBeforeThisOne $groupsVisitedBeforeThisOne -lastGroupOfTheLevel $lastGroupOfThisLevel
                    if ($memberGroupLevel -gt $maxMemberGroupLevel){$maxMemberGroupLevel = $memberGroupLevel}
                }
            }
            $level = $maxMemberGroupLevel
        }
        else #we've reached the top level group, return it's height
        {
            return $level
        }
        return $level
    }
}
$global:numberOfRecursiveGroupMemberships = 0
$groupObj = Get-QADGroup -Identity $groupIdentity -SizeLimit 0
if($groupObj)
{
    [int]$maxNestingLevel = Get-GroupNesting -Identity $groupIdentity -Level 0 -GroupsVisitedBeforeThisOne @{} -lastGroupOfTheLevel $false
 Add-Member -InputObject $groupObj -MemberType NoteProperty  -Name MaxNestingLevel -Value $maxNestingLevel -Force
 Add-Member -InputObject $groupObj -MemberType NoteProperty  -Name NestedGroupMembershipCount -Value $($global:numberOfRecursiveGroupMemberships - 1) -Force
 $groupObj | Select-Object Name,DN,MaxNestingLevel,NestedGroupMembershipCount | Format-List
}

Hope this helps
All information is provided on an AS-IS basis, with no warranties and confers no rights.

2 Replies to “AD and Kerberos Token Bloat – Analyzing Group Nesting”

  1. tam bành. Bốn tên lúc lại hợp lực tiến hành mãnh công. Hơn nữa chiêu
    thức hoàn toàn là những sát chiêu lấy mạng đổi mạng. Andrea ngực bị Ngưu
    Ma Vương húc thủng, bị thương không nhẹ. Năng lượng phát huy giảm xuống
    một chút, nhưng nàng chống lại bốn tên này vẫn có ưu thế như trước.
    dịch vụ kế toán trọn gói
    diamond bay resort
    chung cư hoà bình green city
    five star garden
    trung tâm kế toán tại hải phòng
    học kế toán tại bắc giang
    học kế toán tại thanh xuân

    học kế toán tại bắc ninh
    dịch vụ báo cáo tài chính
    kế toán cho giám đốc quản lý
    học kế toán tại quảng ninh
    học kế toán tổng hợp tại bắc ninh
    học kế toán tại hà đông
    eco city long biên

    học kế toán tại tphcm

    Đoạn Vân vừa cứu sống được hai đầu Quang Minh Thần hổ bị Andrea giết.
    Nhìn thấy Ngưu Ma Vương trọng thương, Đoạn Vân cười lắc lắc đầu, hỏi:

    – Ngưu Ma Vương, cảm giác bị trọng thương sướng không?

    Đoạn Vân lập tức triển khai trị liệu cho Ngưu Ma Vương. Ngưu Ma Vương
    bây giờ đã trở lại ở dưới hình thái ma thú, bản thể của hắn rất lớn. Đối
    với Đoạn Vân, bản thể ma thú dễ trị hơn dưới hình người. Chỉ cần dùng
    dao mổ khổng lồ, chích huyết ở những vết thương, xử lý một chút, cắt bỏ
    những nơi bị đánh hư, rồi làm cho nơi đó nhanh chóng sinh trưởng da thịt
    mới, cuối cùng dùng chân khí điều hòa năng lượng rối loạn của Ngưu Ma
    Vương là coi như xong. Việc trị liệu củng cố thì Đoạn Vân cho Ngưu Ma
    Vương uống rất nhiều dược hoàn. Đương nhiên, đối với cao thủ cấp bậc này
    thì dược hoàn đơn thuần cơ bản không có tác dụng bao nhiêu. Nhưng nếu
    phối hợp với chân khí của Đoạn Vân thì dược hoàn vẫn phát sinh công hiệu
    cường đại như trước.

    Ngưu Ma Vương sau khi thương thế đã lành, được Đoạn Vân ném vào Thái Cực
    đồ. Lực chiến đấu của Ngưu Ma Vương lúc này mặc dù không kém, nhưng năng
    lượng dù sao cũng giảm xuống một chút, để hắn tu dưỡng đầy đủ mới có thể
    làm tăng thực lực của hắn lên được.

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s