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'.
piątek, kwietnia 06, 2007
enumeracja atrybotow obiektu AD cz.2
Subskrybuj:
Komentarze do posta (Atom)
 
 
 
2 komentarze:
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:)
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 (:
Prześlij komentarz