Jump to content
Sign in to follow this  
blob

Vererbung von Benutzerobject aktiv? Mit VBS auslesen

Recommended Posts

Hallo,

 

ich habe hier ein AD wo sehr viel mit Hand dran rumgebastelt wurde. Unter anderem gibt es hunderte Accounts, wo über die Jahre aus irgendeinen Grund die Vererbung deaktiviert wurde.

Also ich gehe im AD BuC auf ein Benutzerkonto, auf den Security Reiter und dann auf Advanced... dort ist der Haken nicht gesetzt das die Rechte vom übergeordneten Objekt übernommen werden sollen. Ich möchte gerne mittels VBS alle User auslesen und mir dijenigen anzeigen lassen, die den Haken nicht gesetzt haben. Das VBS Gerüst ist kein Problem, nur wüsste ich jetzt nicht wie ich dieses Attribut auslesen könnte. Kann da jmd weiterhelfen? Oder evtl. ist es sogar noch einfacher: Gibt es ein LDAP Query was man verwenden könnte?

Share this post


Link to post

Jau, das geht schonmal super in die Richtung, Danke! :-)

 

Das Script dort setzt ja auch gleich wieder die Vererbung, aber ich will ja erstmal reporten und mir ausgeben, wer alles dieses Flag nicht gesetzt hat.

 

Jetzt habe ich ein Problem mit der Funktion in dem Script, also ich steige nicht so recht dahinter was es von der Logik her macht:

 

Private Function SetInheritanceFlag(ADsPath)

   Const SE_DACL_PROTECTED = 4096
   Dim oSD
   Dim oDACL
   Dim lFlag
   Dim oIADs

   Set oIADs = GetObject(ADsPath)

   Set oSD = oIADs.Get("nTSecurityDescriptor")

   If oSD.Control And SE_DACL_PROTECTED Then
       oSD.Control = oSD.Control - SE_DACL_PROTECTED
   End If

   oIADs.Put "nTSecurityDescriptor", oSD
   oIADs.SetInfo

   If Err.Number <> 0 Then
       SetInheritanceFlag = Err.Number
   Else
       SetInheritanceFlag = 0
   End If

End Function

 

Also wenn oSD.Control und die Konstante TRUE sind, aktualisiert er oSD.Control und versucht er den Wert im Objekt zu aktualisieren... wenn erfolgreich dann gleich 0, wenn nicht dann err.number. Ich erkenne jetzt nicht welchen Wert oSD.Control haben muss damit man weiss das die Vererbung deaktiviert ist? Sorry stehe da auf dem Schlauch :-(

Share this post


Link to post

Also noch läuft meine Abfrage aber ich habe die Funktion mal folgendermaßen umgebaut:

 

Private Function SetInheritanceFlag(DSObjectPath)

   Dim oSD
   Dim oDACL
   Dim lFlag
   Dim oIADs

   Set oIADs = GetObject(DSObjectPath)

   Set oSD = oIADs.Get("nTSecurityDescriptor")

If oSD.Control = "39940" Then
	WScript.Echo  "found object " & oRst.Fields("ADsPath")
	WScript.echo oSD.Control	WScript.Echo  "=========================================="
End If

End Function

 

Ich vermute wenn oSD.Control den Wert 39940 gesetzt hat, dass dann die Vererbungs Flag nicht gesetzt ist.

Share this post


Link to post

Ein boolscher Vergleich mit einer Konstante dient dazu, zu ermitteln, ob die entspr. Bits in der Variable gesetzt sind, im o.g. Fall das 13.Bit (4096)

D.h. in der Variable "Control" werden mehrere Flags verwaltet!

Daher kann man nicht einfach auf einen bestimmten Wert abprüfen.

Share this post


Link to post

ufff, und wie könnte ich es prüfen ohne den Wert neu setzen zu müssen? Das macht er ja über wenn beim setzen kein Fehler aufkommt.

 

Ich lese nur: wenn oSD.Control und die Konstante TRUE sind, dann nimm oSD.Control minus die Konstante. Mit dem neuen Wert versucht er dann das Objekt zu aktualisieren, klappt das dann kommt err.number = 0 raus ansonsten wirft er halt ein Error. Das Script versucht also bei jedem Userobjekt, das es abarbeitet, die Vererbung wieder zu aktivieren.

 

Da fehlt mir jetzt die Logik :-(

 

Also ich will ja nur abfragen, und nichts setzen. Das ist jetzt mein Hauptproblem.

Share this post


Link to post

Na ja, die IF-Abfrage enthält doch schon alles, was Du brauchst:

   Set oSD = oIADs.Get("nTSecurityDescriptor")
   If oSD.Control And SE_DACL_PROTECTED Then '... TRUE: Flag ist gesetzt, FALSE: Flag nicht gesetzt

 

Der ganze Err-Kladderadatsch bezieht sich ja darauf, ob der neue Descriptor geschrieben werden konnte und setzt entspr. den Rückgabewert der Funktion. Brauchst ja alles nicht.

 

EDIT: Die Logik scheint übrigens die zu sein, dass wenn das "Protected"-Bit gesetzt ist, die Vererbung ausgeschaltet ist!

Daher wird, wenn es gesetzt ist, es durch die Subtraktion zurückgesetzt.

D.h. um zu überprüfen, ob Vererbung aktiv, müsste die Abfrage so lauten:

If oSD.Control AND NOT SE_DACL_PROTECTED then 'Vererbung aktiv

Share this post


Link to post

Ok, was ist dann oSD.Control überhaupt?

 

Also wenn ich nur "If oSD.Control And SE_DACL_PROTECTED Then" verwende und beide dann true sind (SE_DACL_PROTECTED ist immer true weil es einen Wert hat und zwar 4096) rechnet er den einen Wert minus die Konstante, bekomme ich halt immer ein anderes Ergebnis raus je nachdem unter oSD.Control gespeichert ist (daher wäre es ja unwichtig). D.h. er schreibt mir jeden User in das Log obwohl die Vererbung dennoch aktiv ist, will ja aber nur die Deaktivierten. Also als Script meine ich es so:

 

Private Function SetInheritanceFlag(ADsPath)

   Const SE_DACL_PROTECTED = 4096
   Dim oSD
   Dim oDACL
   Dim lFlag
   Dim oIADs

   Set oIADs = GetObject(ADsPath)

   Set oSD = oIADs.Get("nTSecurityDescriptor")

   If oSD.Control And SE_DACL_PROTECTED Then
       wscript.echo "Vererbung ist deaktivert!"
   End If


End Function

Share this post


Link to post

Nochmal: "oSD.Control AND SE_DACL_BLA" ist boolsche Algebra!

Boolesche Algebra ? Wikipedia

 

Da gehts nicht drum, ob oSD.Control TRUE liefert, sondern ob in oSD.Control ein Bit gesetzt ist.

 

Hast Du denn die Abfrage so wie Du's jetzt zusammengestellt hast, mal ausprobiert? Liefert es brauchbare Ergebnisse oder nicht?

 

EDIT: Zur Verdeutlichung. Nehmen wir einfach mal kleinere Zahlen. Control hätte z.B. 9 und SE_DACL 8.

9 ist binär 1001, 8 = 1000. Man sieht, dass das 4. Bit von rechts bei beiden 1 ist, somit liefert Control AND SE_DACL = TRUE.

Hätte Control z.B. den Wert 17 (Binär 10001), wäre dort das 4. Bit von Rechts 0 und somit Control AND SE_DACL = FALSE.

Share this post


Link to post

Okay, Danke Danke für die Erklärung und den Link, ich glaube ich habe es jetzt einigermaßen verstanden und bekomme auch brauchbare Ergebnisse zurück :-) Also wenn ich mit "If oSD.Control And SE_DACL_PROTECTED Then" kommen brauchbare Ergebnisse zurück.

 

Danke!

Share this post


Link to post
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...