czwartek, kwietnia 05, 2007

enumeracja atrybotow obiektu AD aka LDIFDE

ciekawy problem - w jaki sposob zrobic zrzut obiektu AD do pliq, ze wszystkimi mozliwymi wartosciami atrybutow? odpowiedzia prawidlowa jest oczywiscie LDIFDE lub CSVDE ale wiadomo - co wlasny skrypt, to walsny skrypt. pojedynczy mechanizm mozna zlozyc w calosciowe rozwiazanie - np. do odtworzenia srodowiska produkcyjnego w labie.
najpierw metody ktore wydawaly mi sie intuicyjne a nie zadzialaly, poniewaz - jak to czesto bywa, intuicja zawiodla. nie uda sie wylistowac atrybutow ani poprzez trywialna probe enumeracji:

set oUser=getObject("LDAP://dc=test,dc=com")
for each attribute in oUser
wscript.echo attribute.name &" "&attribute.value
next

nie uda sie rowniez zastosowac zapytania ADODB, wstawiajac '*' w miejsce odpytywanych atrybutow:

[...]
adoCmd.CommandText = "<LDAP://"&domDNS&"/"&namingContext&_
">;(&(ObjectCategory=Person)(samAccountName="&toFind&"));*;SubTree"
[...]

o dziwo taka operacja zawsze zwraca parametr ADsPath [ciekawe jak to jest zdefiniowane, ze aqrat ten]. gibon nakierowal mnie na wlasciwy tor podsylajac linka do skryptu enumerujacego atrybuty. skrypt jednak jest dla ADAM a nie AD, ale to juz nieduzy krok i tak po poprawkach mozna uzyskac takie rozwiazanie:

OPTION EXPLICIT
ON ERROR RESUME NEXT
CONST objectCN = "test test"
CONST objectOU = "OU=test"
CONST strObjectType = "user" 'ie "organizationalunit", "group", "user"

Dim oDom, domDNS, namingContext
Dim oObj, oObjectProperties
Dim strAttribute,strValues, strItem
Dim strObjectDN

'*******************************************************************************
set oDom=getObject("LDAP://RootDSE")
domDNS=oDom.dnshostname
namingContext=oDom.defaultNamingContext
domDNS=join( split( right(namingContext, len(namingContext)-3),",DC="),"." )

Set oObj = GetObject("LDAP://cn=" & objectCN & "," & ObjectOU & "," & namingContext)
Set oObjectProperties = GetObject("LDAP://"&domDNS &"/schema/" & strObjectType)

For Each strAttribute in oObjectProperties.MandatoryProperties
strValues = oObj.GetEx(strAttribute)
For Each strItem in strValues
err.clear
Wscript.Echo strAttribute & " -- " & strItem
if err.number<>0 then
wscript.echo "ERROR getting "&strAttribute&": "&cstr(hex(err.number))&" "&err.description
err.clear
end if
Next
Next

For Each strAttribute in oObjectProperties.OptionalProperties
strValues = oObj.GetEx(strAttribute)
If Err = 0 Then
For Each strItem in strValues
Wscript.Echo strAttribute & " -- " & strItem
Next
Else
'Wscript.Echo strAttribute & " -- No value set"
Err.Clear
End If
Next


to co jest najwazniejsze to fakt, iz aby wylistowac wszystkie atrybuty... nalezy miec ich liste! to jest wlasnie to, czego nie moglem przeskoczyc. najpierw skrypt laczy sie do obiektu, nastepnie do obiektu wlasciwosci w schemacie dla danego typu obiektu - lub bardziej po ludzku, do listy zawierajacej spis dostepnych atrybutow dla danego typu obiektu.
nastepnie dla kazdego obiektu z listy, sprawdzane jest czy zadany obiekt ma go ustawionego czy nie - innymi slowy dzialanie od tzw. d*py strony.

Brak komentarzy: