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.
If you need a better explanation, let me know.
cheers!
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.
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}.
$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
If you need a better explanation, let me know.
cheers!
Thanks Adam - Your script was just what I was looking for. Worked a treat.
ReplyDeleteMPAD
Cleaner (PS should not require much string manipulation):
ReplyDelete$schema = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema().GetDirectoryEntry()
There is also a very interesting "isInGlobalCatalog" attribute.