计算指定计算机对象的最大令牌大小?

时间:2017-03-30 16:06:10

标签: powershell active-directory tokenize

我知道CheckMaxTokenSize.ps1(遗憾的是TokenSZ.exe不再可用,只能在32位操作系统中运行),我如何计算特定计算机对象的最大令牌大小?我能够修改一个脚本来查找递归成员资格对象的总数(每台计算机的硬性MS最大值为1015),但需要更进一步。

这是简单的PowerShell脚本

Import-Module ActiveDirectory
$forestName = ([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Name
$ADsPath = [ADSI]"GC://$forestName"
$Search = New-Object System.DirectoryServices.DirectorySearcher($ADsPath)
$computer = Read-Host "Computer Name"
Write-Host ""; Write-Host "Processing....." -nonewline
if ($computer -eq "") {$computer = "<BLANK>"}
$Search.Filter = "(&(objectCategory=Computer)(name=$computer))"
$computercn = $Search.FindAll().Properties.distinguishedname
$csv = dsget computer $computercn -memberof -expand
Write-Host ($csv.Length -1) "items in List" -ForegroundColor Green
Write-Host "-----------------------------------"

如果不在设备上,我将如何返回AD计算机对象的令牌大小?

1 个答案:

答案 0 :(得分:0)

我建议你重新开始并真正查看所需的信息,以便将此任务分解为简单的步骤。

在开始之前,让我们回顾令牌大小公式:

  

TokenSize = 1200 + 40d + 8s

     

此公式使用以下值:
  的 d :   用户所属的域本地组的数量加上   用户帐户域外的通用组数量   user是加上安全性中表示的组数的成员   ID(SID)历史   <强>取值:   用户的安全全局组的数量   是加上用户帐户中通用组数量的成员   用户所属的域。
   1200 :估算值   门票开销。此值可能会有所不同,具体取决于DNS等因素   域名长度,客户名称和其他因素。

假设您已经拥有计算机名称(可能来自用户输入),我们需要的是:

  1. 检索具有sid历史记录的计算机帐户对象
  2. 查找其所有组成员资格(递归)
  3. 根据域和范围将组拆分为两个存储桶
  4. 所以,让我们开始工作吧。 由于您拥有ActiveDirectory模块,因此轻松找到计算机:

    # Define computer name
    $ComputerName = "computer01"
    
    # Find the computer in the directory
    $Computer = Get-ADComputer -LDAPFilter "(&(name=$ComputerName))" -Properties PrimaryGroup,SidHistory
    

    现在,我们可以使用Get-ADPrincipalGroupMembership cmdlet来检索所有组成员身份,但它不支持递归搜索,因此我会在带有{的LDAP过滤器中使用IN_CHAIN查询规则控件{1}}:

    Get-ADGroup

    现在我们只需将组拆分为两组,一组包含域本地组和外部通用组,另一组包含全局组和本地通用组:

    # Locate a Global Catalog server
    $GC = Get-ADDomainController -Discover -Service GlobalCatalog
    
    # Search the global catalog using our recursive ldap filter
    $Groups = Get-ADGroup -LDAPFilter "(&(member:1.2.840.113556.1.4.1941:=$($Computer.DistinguishedName)))" -Server "$($GC.HostName):3268"
    
    # Don't forget the primary group
    $Groups = @($Groups; Get-ADGroup -Identity $Computer.PrimaryGroup)
    

    现在根据公式计算:

    # These are the "d" groups from the original formula
    $LargeGroups = @($Groups |Where-Object {$_.GroupScope -eq 'DomainLocal' -or ($_.GroupScope -eq 'Universal' -and $_.DistinguishedName -notlike "*,DC=$($GC.Domain -split '\.' -join ',DC=')")})
    
    # These are the "s" groups from the original formula
    $SmallGroups = @($Groups |Where-Object {$_.GroupScope -eq 'Global' -or ($_.GroupScope -eq 'Universal' -and $_.DistinguishedName -like "*,DC=$($GC.Domain -split '\.' -join ',DC=')")})
    

    我们已经完成了:-)