Probleme mit DACLS



  • Hallo

    Habe Probleme mit den DACL. Also wenn ich ein Ordner erstellt habe, dann werden diesem standard-mässig übergeordnete Objekte vererbt. Jetzt möchte ich das wider aufheben, doch dies klappt nicht.

    ZeroMemory(&ea,  sizeof(EXPLICIT_ACCESS));
        ea.grfAccessPermissions = AccessPerms;
        ea.grfAccessMode       = AccessMode;
        ea.grfInheritance      = NO_PROPAGATE_INHERIT_ACE; //NO_INHERITANCE;
        ea.Trustee.TrusteeForm  = TRUSTEE_IS_NAME;
        ea.Trustee.TrusteeType  = TRUSTEE_IS_USER;
        ea.Trustee.ptstrName    = (LPTSTR) trustee;
    
        Res = SetEntriesInAcl(1, &ea, NULL, &newdacl);
        if(Res != ERROR_SUCCESS) {
            printf("SetEntriesInAcl() failed: %i",GetLastError());
            return FALSE;
        }
    
        Res = SetNamedSecurityInfo((LPTSTR) object ,objecttype ,GROUP_SECURITY_INFORMATION ,NULL ,NULL ,newdacl ,NULL);
        if(Res != ERROR_SUCCESS) {
            printf("SetNamedSecurityInfo() failed: %i",GetLastError());
            return FALSE;
        }
    

    So setze ich doch dem Objekt eine neue DACL mit den von mir vordefiniertem User, und mit NO_PROPAGATE_INHERIT_ACE. So sollte es doch funtionieren!? Aber tut es nicht... wäre dankbar um ein Rat.

    Oder kann man dass nur bei Ordnererstellung einstellen... über den security-deskriptor?
    [code]


  • Mod

    Du kannst so die Vererbung nicht aufheben. Du musst dazu die Rechte "kopieren". So macht es der Explorer auch.

    Also bisherige DACL holen, evtl. Änderungen machen und neu setzen.



  • Aber wie kann man den die Dacl kopieren oder löschen, vom übergeordneten object? Dass verstehe ich nicht. So wie oben setze ich sie einfach ganz neu oder nicht?
    Verstehe es gerade nicht mehr....


  • Mod

    Gut, dann frage ich mal anders: Was tut es nicht?
    Was passiert und was passiert nicht?



  • Es soll eine neue DACL erstellen und die alte dann ersetzen + so einstellen das übergeordnete ACE's nicht vererbt werden (So wie im Code), denn die sind mir ein Dorn im Auge!

    Aber es tut sich nichts, und es kommt kein Fehler bei keiner Funktion.



  • Wenn man im Explorer zbsp. ein Ordner erstellt, dan Eigenschaften/Sicherheit/erweitert wählt, hats ja unten ein Hacken der standard-mässig aktiviert ist, und der besagt das die übergeordneten objecte standard-mässig vererbt werden. Jetz mächte ich Programmtechnisch diesen Hacken entfernen! Und eigentlich nichts anderes. Also weiter ... Wenn ich im Explorer diesen Hacken herausnehme kommt eine Dialogbox die mir sagt das ich löschen könne und kopieren. löschen ist was isch möchte! Also wie kann ich sowas umsetzen?

    DWORD Res = 0;
    	PACL newdacl = NULL;
    	EXPLICIT_ACCESS ea;
    
        ZeroMemory(&ea,  sizeof(EXPLICIT_ACCESS));
        ea.grfAccessPermissions = AccessPerms;
        ea.grfAccessMode       = AccessMode;
        ea.grfInheritance      = NO_INHERITANCE;
        ea.Trustee.TrusteeForm  = TRUSTEE_IS_NAME;
        ea.Trustee.TrusteeType  = TRUSTEE_IS_USER;
        ea.Trustee.ptstrName    = (LPTSTR) trustee;
    	ea.Trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
    	ea.Trustee.pMultipleTrustee = NULL;
    
        Res = SetEntriesInAcl(1, &ea, NULL, &newdacl);
        if(Res != ERROR_SUCCESS) {
            printf("SetEntriesInAcl() failed: %i",GetLastError());
            return FALSE;
        }
    
        Res = SetNamedSecurityInfo((LPTSTR) object ,objecttype ,DACL_SECURITY_INFORMATION ,NULL ,NULL ,newdacl ,NULL);
        if(Res != ERROR_SUCCESS) {
            printf("SetNamedSecurityInfo() failed: %i",GetLastError());
            return FALSE;
        }
    
        LocalFree(newdacl);
    

    So funktionierts nicht...


  • Mod

    1. Wenn Du nicht mehr verererbst, dann gibt es keine Rechte mehr. Oder? (Natürlich außer dene, die auf dem Verzeichnis extra eingeragen wurden).
    2. Also musst Du die bestehende ACL nehmen und kopieren, oder eben eine neue ACL mit den Rechten schreiben die Du möchtest.



  • 1. 👍
    2. Aber das mach ich ja im Code oben oder etwa nicht?



  • push



  • push 😉



  • pop



  • pop 😉



  • push


Anmelden zum Antworten