blob 10 Geschrieben 14. Juni 2010 Melden Teilen Geschrieben 14. Juni 2010 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? Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 14. Juni 2010 Melden Teilen Geschrieben 14. Juni 2010 Moin, in diesem Artikel findest du eine passende Routine. Delegated permissions are not available and inheritance is automatically disabled Gruß, Nils Zitieren Link zu diesem Kommentar
blob 10 Geschrieben 14. Juni 2010 Autor Melden Teilen Geschrieben 14. Juni 2010 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 :-( Zitieren Link zu diesem Kommentar
blob 10 Geschrieben 14. Juni 2010 Autor Melden Teilen Geschrieben 14. Juni 2010 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. Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 14. Juni 2010 Melden Teilen Geschrieben 14. Juni 2010 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. Zitieren Link zu diesem Kommentar
blob 10 Geschrieben 14. Juni 2010 Autor Melden Teilen Geschrieben 14. Juni 2010 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. Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 14. Juni 2010 Melden Teilen Geschrieben 14. Juni 2010 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 Zitieren Link zu diesem Kommentar
blob 10 Geschrieben 14. Juni 2010 Autor Melden Teilen Geschrieben 14. Juni 2010 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 Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 14. Juni 2010 Melden Teilen Geschrieben 14. Juni 2010 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. Zitieren Link zu diesem Kommentar
blob 10 Geschrieben 14. Juni 2010 Autor Melden Teilen Geschrieben 14. Juni 2010 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! Zitieren Link zu diesem Kommentar
P.Foeckeler 11 Geschrieben 26. Juni 2010 Melden Teilen Geschrieben 26. Juni 2010 Noch eine kleine Anregung hinterher: Das kostenlose Tool LIZA kann die Objektrechte im AD sehr gut analysieren: LIZA - Active Directory Analyse für Security, Berechtigungen und ACLs Gruß, Philipp Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.