Az Active Directory sémája sok hasznos információt szolgáltathat számunkra, ha tudjuk, hogyan kezeljük az ott található információkat. Például nem is olyan egyszerű felderíteni, hogy egy felhasználónak milyen attribútumokat is definiálhatunk. Ez azért problematikus, mert nem csak azok az attribútumok vannak, amelyek közvetlenül az adott objektumtípusnál vannak definiálva, hanem a kiegészítő objektumoknál definiáltakkal is. Hogy jobban érthető legyen, nézzük mindezt a grafikus felületen:
131 . ábra Felhasználó AD attribútumai
A fenti ábrán Budai Máriának van msExchAssistantName attribútuma, de vajon ez honnan jön? Ha a sémakezelő eszközt nézzük, akkor ott látszólag nincs ilyen:
132 . ábra Látszólag nincs msExchAssistantName attribútum
De valójában ehhez hozzá jön a kiegészítő osztályokban definiált attribútumok listája is, azaz ezek között is szét kell nézni. Ismét a sémakezelőből idézek, nézzük a user osztály tulajdonságlapját:
133 . ábra A kiegészítő osztályok listája
Ez így elég hosszadalmas folyamat, de erre való a PowerShell! Az ezt megvalósító kód az alább látható:
$syntaxhash = @{
'2.5.5.8-1' = 'Boolean'
'2.5.5.9-2' = 'Integer'
'2.5.5.10-4' = 'String(Octet)'
'2.5.5.17-4' = 'String(Sid)'
'2.5.5.2-6' = 'String(Object-Identifier)'
'2.5.5.9-10' = 'Enumeration'
'2.5.5.6-18' = 'String(Numeric)'
'2.5.5.5-19' = 'String(Printable)'
'2.5.5.4-20' = 'CaseIgnoreString(Teletex)'
'2.5.5.5-22' = 'String(IA5)'
'2.5.5.11-23' = 'String(UTC-Time)'
'2.5.5.11-24' = 'String(Generalized-Time)'
'2.5.5.3-27' = 'Case-Sensitive String'
'2.5.5.12-64' = 'String(Unicode)'
'2.5.5.16-65' = 'LargeInteger'
'2.5.5.15-66' = 'String(NT-Sec-Desc)'
'2.5.5.1-127' = 'Object(DN-DN)'
'2.5.5.7-127' = 'Object(DN-Binary)'
'2.5.5.13-127' = 'Object(Presentation-Address)'
'2.5.5.14-127' = 'Object(DN-String)'
'2.5.5.0-' = 'Undefined'
}
filter get-systemAuxiliaryClass
{
$ado = Get-ADObject -Properties
maycontain, systemmaycontain, systemAuxiliaryClass -Filter {
objectClass -eq 'ClassSchema' -and lDAPDisplayName -eq $_} `
-SearchBase
((Get-ADForest).partitionscontainer -replace "partitions","schema")
if($ado.systemAuxiliaryClass){
$ado.systemAuxiliaryClass | get-systemAuxiliaryClass
}
$ado
}
"user" | get-systemAuxiliaryClass | %{
$_.maycontain, $_.systemmaycontain
} | %{$_}
| %{
Get-ADObject -Properties * -Filter
{objectClass -eq 'attributeSchema' -and lDAPDisplayName -eq $_} `
-SearchBase
((Get-ADForest).partitionscontainer -replace "partitions","schema")
} | select-object
name, @{n="syntax";e={$syntaxhash.($_.attributesyntax
+"-"+$_.oMSyntax)}},
ismemberofpartialattributeset, issinglevalued | Sort-Object -Property name | ft -AutoSize
Ebben definiálok egy függvényt, ami rekurzívan végiglépked a kiegészítő osztályok listáján, majd ezekre mind kikeresem a megfelelő attribútumlistát. Hogy még teljesebb legyen a kimenet, ezért még hozzáteszem az adott attribútumelem sémában definiált szintaxisát. A végső kimenet valami ilyesmi lesz:
name syntax ismemberofpartialat issinglevalued
tributeset
---- ------ ------------------- --------------
Account-Expires LargeInteger True
Account-Name-Histor String(Unicode) False
y
ACS-Policy-Name String(Unicode) True
Address-Home String(Unicode) True
Admin-Count Integer True
Alt-Security-Identi String(Unicode) True False
ties
…
Ezzel teljes mértékben fel tudjuk térképezni a különböző AD objektumtípusok attribútumait.