Jump to content

Vererbung von Benutzerobject aktiv? Mit VBS auslesen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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?

Link zu diesem Kommentar

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 :-(

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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

Link zu diesem Kommentar

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.

Link zu diesem Kommentar
  • 2 Wochen später...
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...