Skip to Content

IT nieuczesane.
category

Category: DevOps/Scripting

skrypty, programy, command line i inne

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.

tworzenie gadzetow

przy okazji konqsu ‚gotowy na nowy dzien’ mozna natrafic na bardzo fajne stronki z opisami howto. polecam zajrzec na informacje o tworzeniu gadzetow – co okazuje sie byc proste, lub trywialne dla wszystkich, ktorzy maja pojecie o hta.

ADS_PROPERTY_OPERATION_ENUM – sprostowanie

jakis czas temu pisalem o hurtowym dodawaniu do grupy. niestety po testach okazuje sie, ze troche sie mylilem, wiec sprosotwanie:

w opisie dostepnych parametrow dla rodzaju operacji przy wykonywaniu putEx dla obiektu AD, znalezc mozna 4 parametry:
ADS_PROPERTY_CLEAR = 1,
ADS_PROPERTY_UPDATE = 2
ADS_PROPERTY_APPEND = 3
ADS_PROPERTY_DELETE = 4

krotki opis baj mła:
DELETE jest jedyna opcja na usuniecie parametru obiektu w AD. generalnie putEx jest uzywany dla modyfikacji parmetrow bedacych tablica [array-type], jednak jesli sie chce usunac parametr [a to duza roznica pomiedzy wstawieniem do parametru null, „” oraz jego usunieciem – kazda z 3 operacji to inna operacja], nalezy uzyc putEx z wartoscia 4 – dla dowolnego typu parametru.

CLEAR – tu nie bede komentowal bo nie testowalem. wedle opisu: „Instructs the directory service to remove all the property value(s) from the object” wynikalo by, ze obiekt jest ‚resetowany’. co ciekawe – caly obiekt a nie pojedyncza wartosc. to troche dziwne, wyjasnienia nie znam.

UPDATE – wymienia wartosci na nowe. i to jest wlasnie blad, ktory poplenilem we wczesniejszym opisie. jak to dziala, na przykladzie czlonkow grupy:
parametr ‚members’ obiektu grupa zawiera tablice ADsPath, gdzie poszczegolne wartsoci to sciezka LDAP uzytkownika/grupy np:

array("LDAP://cn=user1,dc=domain,dc=com","LDAP://cn=user2,dc=domain,dc=com")

jesli zrobie putEx z parametrem UPDATE i wstawie tam inne wartosci:

oGrp.putEx ADS_PROPERTY_UPDATE, "member", array("LDAP://cn=user1,dc=domain,dc=com","LDAP://cn=anotheruser,dc=domain,dc=com")

to nowymi czlonkami beda userzy z tej ostatniej operacji – czyli wypadnie user2. zaleta taka, ze nie wywali bledu z powodu tego, ze user1 byl juz wczesniej czlonkiem.

APPEND – dodaje nowe wartosci. tutaj problem polega na tym, ze jesli zrobi sie append, dla przykladu takiego jak powyzej, skrypt wygeneruje blad, ze taki user juz jest, i nie doda nikogo, nawet jesli w tablicy jest 23 innych userow.

reasumujac, zeby dodac wielu userow mozna:
– dodawac ich jeden po drugim
– najpierw zczytac obecne czlonkowstwo, zsumowac z tymi, ktorych sie chce dodac, i dopiero ta sume pchnac z parametrem UPDATE

CIPA msi

a co… czemu nie? cipa.msi

hurtowe dodawanie czlonkow do grupy

czlonkow do grupy mozna dodac pojedynczo:
oGrp.add(„LDAP://CN=user,CN=users,[…]”)
albo hurtowo za pomoca putEx:

oGRP.PutEx ADS_PROPERTY_VALUE, "member", ARRAY_OF_USERS

ADS_PROPERTY_VALUE to wartosc okreslajaca zachowanie metody putEx – dodaj, usun, update, wyczysc. dzieki putEx m.in. mozna usunac wartosc. w przypadq dodawania do grupy istotne sa dwa szczegoly:
– uzycie ADS_PROPERTY_APPEND spowoduje wywalenie sie jesli w grupie jest juz czlonek, ktorego probujemy dodac. w efekcie nikt nie zostanie dodany. trzeba uzyc ADS_PROPERTY_UPDATE, ktory zachowuje sie w pozadany sposob – dodaje tych co moze.
– ARRAY_OF_USERS musi zawierac tablice Distinguished Names uzytkownikow. jest to dziwne bo przy oGrp.add podaje sie ADsPath czyli dla putEx tablica bedzie skladac sie z np. „CN=user,CN=users,DC=domena,DC=com” a przy ‚add’ poprawna wartoscia bedzie „LDAP://CN=user,CN=users,DC=domena,DC=com”

doawanie hurtowe ma drobna wade – nie ma mozliwosci outputu do zdebudowania, pozwalajacego okreslic czy wszystkie obiekty zostaly dodane [i ktore nie]. po prostu ‚succes’ lub ‚error’. jednak ze wzgledu na wydajnosc – jest to metoda najbardziej efektywna, zwlaszcza jesli dodaje sie kilka set/kilka tysiecy membersow

trywialne? huh.. niemozliwe

wydawalo by sie, ze sprawa prosta – zalozyc ze skryptu grupe domenowa lokalna. konkretnie w domenie NT4.o, chociaz to znaczenia nie ma. problem polega na tym, ze wywolanie tworzenia grupy to:

set oDomain=getObject("WinNT://DOMAIN") 'lub LDAP://....
set oGrp=oDomain.create("group","groupname")
oGrp.setInfo

automatycznie tworzy to grupe globalna (security – w przypadq w2k+). ale jak zalozyc grupe domenowa lokalna [albo universalna czy dystrybucyjna w przypadq w2k+]?
co prawda ADSI definiuje obiekt ‚LocalGroup’, ale jest on typu IADsGroup, ktory tworzy sie ‚create(„group”,”groupname”)’… i kolko sie zamyka.

*****UPDATE 16.o3.2oo7
dzieki jednemu z czytelnikow jest rozwizanie! dzieki arturze!
rozwiazaniem jest parametr groupType ktorego nie znalalzlem, pomimo usilnych poszukiwan. i rozwiazanie, zaiste, staje sie trywialne [i dziala na NT4.o – co bylo mi potrzebne!]:

Set oDom=GetObject("WinNT://DOMAIN")

Set oGrp = oDom.create("group","grupatestowa")
oGrp.put "groupType",&H4
oGrp.setInfo

CIPA o.51

kosmetyczne zmiany – m.in. dodany MACaddr.

arty, ktore trzeba znac

wumik – jeden z czlonkow ekipy longhornowej nie pochwalil sie, ale i tak wyszperalem q:
dwa arty warte polecenia, zwlaszcza dla srednio-zaawansowanych skrypterow:
zdalne odpytywanie kompow
skryptowanie eventloga

CIPA v o.5

nowa wersja skrypciq Change IP Address
– ‚obsluga’ vista [polegajaca na niewyswietlaniu IPv6 (; ]
– liczne zmiany w logice skryptu
– dodana mozliwosc usuwania favsa bez koniecznosci grzebania w pliq
– dodane ustawienie IE Proxy

wszelkie informacje o bug’ach mile widziane (:

obowiazkowa lektura o NTFS

z cyklu stare ale jare – ten art sporo mi rozjasnij kiedy jakis czas temu bawilem sie w skryptowanie uprawnien.
teraz sie go musialem naszukac wiec zostawiam slad