piątek, kwietnia 06, 2007

enumeracja atrybotow obiektu AD cz.2

poprzednie rozwiazanie ma wade, jesli chce sie potem wylistowane atrybuty np. pchnac do innego obiektu. po pierwsze jest ich za duzo, po drugie nie wszystkie sa modyfikowalne. wzorujac sie na opisie gibona udalo mi sie napisac troche poprawiona [kwestia tego co sie chce osiagnac - byc moze 'zuobozona'] wersje skryptu, listujacego atrybuty, do ktorych ma sie prawo zapisu:

OPTION EXPLICIT
ON ERROR RESUME NEXT
CONST objectCN = "test test"
CONST objectOU = "OU=test"

Dim oDom, domDNS, namingContext, oObj
Dim allowedAttributes,strAttribute,strValues, strItem

'*******************************************************************************
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)
oObj.getInfoEx array("allowedAttributesEffective"),0
allowedAttributes=oObj.getEx("allowedAttributesEffective")

For Each strAttribute in allowedAttributes
strValues = oObj.GetEx(strAttribute)
if err.number=0 then
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
else
'wscript.echo strAttribute&" skipped"
err.clear
end if
Next


[oba skrypty - i ten i poprzedni, wypisuja tylko atrybuty, ktore da sie wypisac jako ciag, wywalajac blad przy np. atrybutach binarnych. ale to tylko ogolny przyklad a nie komplexowe rozwiazanie]
podstwowa roznica jest to, ze zmiast laczyc sie do schematu i zczytywac 'jakie sa dostepne atrybuty dla obiektu typu "user"' tym razem po dolaczeniu sie do obiektu sprawdzam atrybut 'allowedAttrbutesEffective' i z tej listy probuje je odczytac.

warto zwrocic uwage na zastosowanie getInfoEx - przypominajacym, ze wartosci sa de facto odczytywane z cachu AD, ktory nie zawiera pewnych wartosci wyliczanych. pominiecie tej linijki zwroci blad 'property not found in the cache'.

2 komentarze:

Anonimowy pisze...

W powershellu:
$de = New-Object DirectoryServices.DirectoryEntry $users[0].Path
$de.get_Properties()
(lub '$de.get_Properties() | foramt list' aby sie ladniej wyswietlalo)

gdzie $users[0].Path to sciezka do usera znaleziona np przez:
$Searcher = New-Object DirectoryServices.DirectorySearcher
$Searcher.SearchRoot = $root
$searcher.Filter = "(&(objectClass=User)(!(objectClass=Computer)))";
$users = $searcher.findAll();

Mozna tez zapisac do xml, csv, itp np przez:
$de.get_Properties() | Export-CliXML lista.txt

Powershell jest po prostu prosty:)

n€x¤R pisze...

ma jednak poki jedna podstawowa wade [ktora jeszcze jakis czas bedzie aktualna] - dajac komus skrypt nie mozesz powiedziec 'zainstaluj sobie powershella'. vbs jest na kazdym windowsie, msh to poki co nisza.
to sie bedzie zmieniac w ciagu najblizszych dwoch lat, ale mimo wszystko vbs jest duzo uniwersalniejszy

ps. dzieki za przyklad - sie przyda (: