Cum verificam bifa “Allow inheritable permissions” (in Active Directory)

By Andrei Ungureanu - Last updated: Tuesday, November 24, 2009 - Save & Share - 2 Comments

 

Stiu ca foarte multi administratori de Active Directory s-au lovit de problema asta. In special cand preiei administrarea unui domeniu de la altcineva sau cand obiectele care le ai in domeniul tau au venit printr-o migrare.

Bifa din imaginea de mai jos se refera la mostenirea permisiunilor de pe containerul care contine obiectul (sau pot fi mai multe nu numai unul).

image

E nevoie ca aceste permisiuni sa se propage la obiectele din container, pentru ca la nivel de container se fac delegarile de permisiuni. Sa luam exemplul in care delegam permisiunea de a reseta parole unui admin regional pentru toti userii care se afla intr-o anumita locatie, mai exact toti userii care se afla intr-un anumit container (OU).

image

Daca obiectele din containerul meu nu au bifa de care pomeneam mai sus activa, delegarea nu o sa functioneze. By default bifa e activa, insa pe parcursul vietii unui obiect in AD, se poate schimba. Cateodata poate fi facuta manual sau de anumite procese – gen cazul cand un user este adaugat in grupul Domain Admins, iar cand este scos nu este pusa la loc.

 

Cum putem sa fortam activarea acestei bife sau sa vedem daca este activa? In cazul unui singur utilizator e simplu, problema apare atunci cand avem zeci sau sute de utilizatori (poate chiar mai multi dar ne oprim aici) de modificat sau verificat.

Ca de obicei VBScript ne sare in ajutor. Mai jos avem un exemplu de script care verifica toti userii dintr-un anumit OU din AD si activeaza optiunea Allow inheritable permissions.

 

‘Script created by Andrei Ungureanu
‘www.winadmin.ro

On Error Resume Next

Const ADS_SCOPE_SUBTREE = 2
Const SE_DACL_PROTECTED = 0

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Size Limit")= 10000

objCommand.Properties("Page Size") = 10000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE

objCommand.CommandText = _
"<LDAP://ou=accounts,dc=itboard,dc=local>;"_
& "(objectCategory=user);sAMAccountName,distinguishedname;subtree"

Set objRecordSet = objCommand.Execute

objRecordSet.MoveFirst
Do Until objRecordSet.EOF

userDN = objRecordSet.Fields("distinguishedName").Value
set objObject = getobject("LDAP://" & userDN & "")
Set objntSD = objObject.Get("nTSecurityDescriptor")

intNTSDControl = objNtSD.Control

If intNTSDControl <> 35844 Then
    ‘ Enable "allow inheritable permissions".
    intNTSDControl = intNTSDControl And SE_DACL_PROTECTED
    objntSD.Control = intNTSDControl
    objObject.Put "nTSecurityDescriptor", objntSD
    objObject.SetInfo
    WScript.Echo "Obiectul " & userDN & " a fost modificat"
End If

objRecordSet.MoveNext
Loop

Calea LDAP://ou=accounts,dc=itboard,dc=local trebuie inlocuita cu locatia in care avem obiectele ce trebuiesc scanate. Merge specificat chiar si domain root insa nu recomand asa ceva. Recomand ca inainte sa folositi scriptul, sa il verificati pe un mediu de test.

PS: scriptul merge modificat foarte usor si doar pentru a arata starea bifei Allow inheritable permissions.

 

Posted in Active Directory, Scripting • Tags: , Top Of Page

2 Responses to “Cum verificam bifa “Allow inheritable permissions” (in Active Directory)”

Comment from Andrei Ungureanu
Time November 24, 2009 at 7:43 pm

Modificand objectCategory puteti cauta si dupa alte obiecte.

Comment from Dr.DG
Time April 7, 2010 at 3:11 am

Hello Andrei and thank you for this post. Unfortunately I do not read any Romanian at all but I found your code in Google and wanted to use it however with no luck. After some investigation I found a couple of problems.

1. Const SE_DACL_PROTECTED = 0

Instead it should be

Const SE_DACL_PROTECTED = 4096

or hexadecimal

Const SE_DACL_PROTECTED = &H1000

2. Then you want to CLEAR the SE_DACL_PROTECTED bit, right? You better check if it set like this:

‘check if the bit is NOT set
If (intNTSDControl And SE_DACL_PROTECTED) Then

3. You clear the bit with

intNTSDControl = intNTSDControl And SE_DACL_PROTECTED

It should be

intNTSDControl = intNTSDControl Xor SE_DACL_PROTECTED

After the above modifications it worked just fine!

Write a comment