Skip to main content

Finding out what 'SearchFlags' are set on you AD attributes

Whilst doing some research into indexed attributes, I posted this a while back on how to find your index attributes.  Since then, I have looked a little deeper into what indexing really means and found this excellent explanation on the numbers that can be found in the searchflags attribute of a schema object.

Using Florian’s reference, I built the following script (which is both powershell v1 and v2 compatible) to get the schema attributes from the forest schema and return (among other things) the breakdown of your attributes search flags.

$forest = [System.DirectoryServices.ActiveDirectory.forest]::getcurrentforest()
$schema = [ADSI]('LDAP://CN=Schema,CN=Configuration,dc=' + ($($forest).name -replace "[.]",",dc="))
$attributes = $schema.psbase.children | where {$_.objectClass -eq "attributeSchema"}

$collection = @()
foreach ($attr in $attributes){
$store = "" | select "Name","lDAPDisplayName","singlevalued","GC","indexed","ContainerIndexing","ANR","PreserveonDelete","CopyonCopy","ToupleIndexing","SubtreeIndexing","Confidential","AttributeAuditing","RODCenabled"
$ATDE = [adsi]("LDAP://$($attr.distinguishedName)")
$store.name = $ATDE.Name[0]
$store.singlevalued = $ATDE.isSingleValued.ToString()
$store.GC = $ATDE.isMemberOfPartialAttributeSet.ToString()
[int]$number = $ATDE.searchflags.ToString()
While ($number -gt 0){
switch ($number){
{$_ -ge 512} {$number = $number-512;$store.RODCenabled=$true;break}
{$_ -ge 256} {$number = $number-256;$store.AttributeAuditing=$true;break}
{$_ -ge 128} {$number = $number-128;$store.Confidential=$true;break}
{$_ -ge 64} {$number = $number-64;$store.SubtreeIndexing=$true;break}
{$_ -ge 32} {$number = $number-32;$store.ToupleIndexing=$true;break}
{$_ -ge 16} {$number = $number-15;$store.CopyonCopy=$true;break}
{$_ -ge 8} {$number = $number-8;$store.PreserveonDelete=$true;break}
{$_ -ge 4} {$number = $number-4;$store.ANR=$true;break}
{$_ -ge 2} {$number = $number-2;$store.ContainerIndexing=$true;break}
{$_ -ge 1} {$number = $number-1;$store.indexed=$true;break}
}
}

$store.lDAPDisplayName = $ATDE.lDAPDisplayName.ToString()
$collection += $store

}
$collection | Export-Csv "schema-atts-$($forest.name).csv" -NoTypeInformation



The basis of it is to get the schema attributes - $attributes = $schema.psbase.children | where {$_.objectClass -eq "attributeSchema"} and 'foreach' them. Store the searchflags attribute as an integer - [int]$number = $ATDE.searchflags.ToString() and while the number is greater than zero, switch through the number removing the largest 'bit' value each time from number {$_ -ge 512} {$number = $number-512;... . For each bit that is removed the corresponding csv output is set to true and the switch is reset  ...$store.RODCenabled=$true;break}.

If you need a better explanation, let me know.

cheers!

Comments

  1. Thanks Adam - Your script was just what I was looking for. Worked a treat.

    MPAD

    ReplyDelete
  2. Cleaner (PS should not require much string manipulation):

    $schema = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema().GetDirectoryEntry()

    There is also a very interesting "isInGlobalCatalog" attribute.

    ReplyDelete

Post a Comment