ACE & ACL



  • Hallo an alle...

    Ich habe ein Directory erstellt mit diesem security attribut:

    JEDER und SYSTEM haben vollen Zugriff und vererben an alle Unterordner und Dateien.

    BOOL CreateMyDACL(SECURITY_ATTRIBUTES *SA)
    {
    	char *szSD = "D:(A;CIOINP;GA;;;SY)(A;CIOINP;GA;;;WD)";
    
    	if(NULL == SA) {
    		return 0;
    	}
    
    	if( ConvertStringSecurityDescriptorToSecurityDescriptor(szSD ,SDDL_REVISION_1 ,&(SA->lpSecurityDescriptor) ,NULL) == 0 ) {
    		printf("ConvertStringSecurityDescriptorToSecurityDescriptor Error %u",GetLastError());
    		return 0;
    	}
    
    	return 1;
    
    }
    

    Wenn ich jetzt nach dem einfügen von Dateien das ACE "JEDER" entfernen möchte, klappt das auch. Doch dann hauts mir den Hacken "Berechtigung übergeordneter Objekte auf untergeordnete Objekte, sofern anwendbar, vererben" hinein! wie kann ich verhindern das das Passiert?
    Für jede Hilfe wäre ich dankbar. Probiere dies jetzt schon seit ner Woche hinzukriegen. Doch es will nicht.

    Gruss peter



  • Hi

    WINAPI schrieb:

    Doch dann hauts mir den Hacken "Berechtigung übergeordneter Objekte auf untergeordnete Objekte, sofern anwendbar, vererben" hinein! wie kann ich verhindern das das Passiert?

    Dass kannst Du indem DU dein (String-Security-Deskriptor) so anpasst :

    D:P(A;CIOI;GA;;;SY)(A;CIOI;GA;;;WD)
    

    folglich :

    ConvertStringSecurityDescriptorToSecurityDescriptor(D:P(A;CIOI;GA;;;SY)(A;CIOI;GA;;;WD) ,SDDL_REVISION_1 ,&(SA->lpSecurityDescriptor) ,NULL);
    

    wobei das "P" für (SDDL_PROTECTED -> The SE_DACL_PROTECTED flag is set) steht.

    http://msdn.microsoft.com/en-us/library/windows/desktop/aa379570%28v=vs.85%29.aspx

    Kannst Du Dir auch mal zu gemüte führen:
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa379582%28v=vs.85%29.aspx

    Dass bewirkt im Grunde das gleiche, wenn du es richtig anwendest.

    SetSecurityDescriptorControl( &SecDesc, SE_DACL_PROTECTED, SE_DACL_PROTECTED );
    

    Denn Benutzer JEDER würde ich anschliessend mit sowas entfernen :

    int main(){
    ...
    ...
    AddAceToFileWithUseralias("DATA" ,"WD" ,GENERIC_ALL ,REVOKE_ACCESS ,SUB_CONTAINERS_AND_OBJECTS_INHERIT);
    ...
    ...
    return 0;
    }
    
    DWORD AddAceToObjectsSecurityDescriptor(
        char *objectname,
        SE_OBJECT_TYPE ObjectType,
        char *trustee,
        TRUSTEE_FORM TrusteeForm,
        DWORD dwAccessRights,
        ACCESS_MODE AccessMode,
        DWORD dwInheritance	
    	)
    {
        DWORD dwRes = 0;
        PACL pOldDACL = NULL, pNewDACL = NULL;
        PSECURITY_DESCRIPTOR pSD = NULL;
        EXPLICIT_ACCESS ea;
    
    	if(NULL == objectname) {
            return ERROR_INVALID_PARAMETER;
    	}
    
        // Get a pointer to the existing DACL.
    
        dwRes = GetNamedSecurityInfo(objectname, ObjectType, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD);
        if(ERROR_SUCCESS != dwRes) {
            goto Cleanup; 
        }
    
        // Initialize an EXPLICIT_ACCESS structure for the new ACE. 
    
        ZeroMemory(&ea ,sizeof(EXPLICIT_ACCESS));
        ea.grfAccessPermissions = dwAccessRights;
        ea.grfAccessMode = AccessMode;
        ea.grfInheritance= dwInheritance;
        ea.Trustee.TrusteeForm = TrusteeForm;
        ea.Trustee.ptstrName = trustee;
    
        // Create a new ACL that merges the new ACE
        // into the existing DACL.
    
        dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);
        if(ERROR_SUCCESS != dwRes)  {
            goto Cleanup; 
        }
    
        // Attach the new ACL as the object's DACL.
    
        dwRes = SetNamedSecurityInfo(objectname ,ObjectType ,DACL_SECURITY_INFORMATION ,NULL ,NULL ,pNewDACL ,NULL);
        if(ERROR_SUCCESS != dwRes)  {
            goto Cleanup; 
        }  
    
        Cleanup:
    
            if(pSD != NULL) 
                LocalFree((HLOCAL) pSD); 
            if(pNewDACL != NULL) 
                LocalFree((HLOCAL) pNewDACL); 
    
            return dwRes;
    }
    
    DWORD AddAceToFileWithUseralias(char *nameofobject ,char *SDDLuseralias ,ACCESS_MASK access_mask ,ACCESS_MODE access_mode ,DWORD inheritance)
    {
    	DWORD rc = 0;
    	PSID sid = NULL;
    
    	if( ConvertStringSidToSid(SDDLuseralias ,&sid ) == 0 ) {
    		return 0;
    	}
    
    	rc = AddAceToObjectsSecurityDescriptor(
    		nameofobject,						// name of object
    		SE_FILE_OBJECT,						// type of object
    		sid,								// trustee for new ACE
    		TRUSTEE_IS_SID,						// format of trustee structure
    		access_mask,						// access mask for new ACE
    		access_mode,						// type of ACE 
    		inheritance							// inheritance flags for new ACE - 
    	);
    
    	if(sid != NULL) {
    		LocalFree((HLOCAL) sid);
    	}
    
    	return rc;
    }
    

Anmelden zum Antworten