2009-03-27 6 views
10

Ho bisogno di creare una directory al livello di programmazione che conceda "Controllo completo" al gruppo "Tutti". Se usoCome creare una directory con tutti i diritti concessi a tutti

CreateDirectory(path, NULL); 

Questo, secondo il Win32 SDK documentation, creare una directory che eredita dalla sua directory padre. Non voglio ereditare i diritti di accesso della directory superiore di cui ho bisogno per garantire che "Everyone" abbia il pieno controllo sulla directory.

Ovviamente, ciò richiede la configurazione della struttura SECURITY_ATTRIBUTES con il descrittore di sicurezza appropriato. Come lo faccio?

+0

Penso che tu intenda: "con tutti i diritti concessi" –

+0

Sì, e grazie a dmckee per aver effettuato la modifica! –

risposta

0

vedere se è possibile utilizzare SetSecurityInfo()

Nella descrizione del facoltativa pDacl argomento:

... Se il valore del parametro securityInfo include il flag DACL-SECURITY-informazione e il valore di questo parametro è impostato su NULL, l'accesso completo all'oggetto è concesso a tutti.

+0

Sto cercando una soluzione che utilizzi un SECURITY_ATTRIBUTE non null e inizializzato correttamente con la chiamata CreateDirectory(). –

+0

Avevo il codice che stava accidentalmente impostando un DACL NULL e, con UAC attivato, il risultato finale non era uguale a tutti gli utenti. –

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/17546432) – Dmitry

13

Qui è una tecnica che sembra funzionare:

SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; 
PSID everyone_sid = NULL; 
AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 
    0, 0, 0, 0, 0, 0, 0, &everyone_sid); 

EXPLICIT_ACCESS ea; 
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); 
ea.grfAccessPermissions = SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL; 
ea.grfAccessMode = SET_ACCESS; 
ea.grfInheritance = NO_INHERITANCE; 
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; 
ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; 
ea.Trustee.ptstrName = (LPWSTR)everyone_sid; 

PACL acl = NULL; 
SetEntriesInAcl(1, &ea, NULL, &acl); 

PSECURITY_DESCRIPTOR sd = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, 
            SECURITY_DESCRIPTOR_MIN_LENGTH); 
InitializeSecurityDescriptor(sd, SECURITY_DESCRIPTOR_REVISION); 
SetSecurityDescriptorDacl(sd, TRUE, acl, FALSE); 

SECURITY_ATTRIBUTES sa; 
sa.nLength = sizeof(SECURITY_ATTRIBUTES); 
sa.lpSecurityDescriptor = sd; 
sa.bInheritHandle = FALSE; 

CreateDirectory(path, &sa); 

FreeSid(everyone_sid); 
LocalFree(sd); 
LocalFree(acl); 

Si noti che questo codice di esempio non ha assolutamente alcun controllo degli errori - dovrete fornire tu stesso.

+0

Amico, grazie mille per questo pezzo di codice. Ho cercato di capire il motivo per cui il mio gioco continua a bloccarsi durante la creazione di una directory nella cartella dei dati delle app specifiche dell'utente. Il tuo codice mi ha salvato - niente più arresti anomali. – dimayak

6

Preferisco il seguente frammento di codice poiché crea una cartella che eredita i diritti predefiniti - che sembra la cosa giusta da fare - altro software/l'utente potrebbe aver impostato diritti ereditabili specifici su una directory per un motivo legittimo - quindi aggiunge un messaggio completo Controlla la voce di accesso esplicito per il gruppo "Utenti" integrato.

BOOL CreateDirectoryWithUserFullControlACL(LPCTSTR lpPath) 
{ 
    if(!CreateDirectory(lpPath,NULL)) 
    return FALSE; 

    HANDLE hDir = CreateFile(lpPath,READ_CONTROL|WRITE_DAC,0,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,NULL); 
    if(hDir == INVALID_HANDLE_VALUE) 
    return FALSE; 

    ACL* pOldDACL; 
    SECURITY_DESCRIPTOR* pSD = NULL; 
    GetSecurityInfo(hDir, SE_FILE_OBJECT , DACL_SECURITY_INFORMATION,NULL, NULL, &pOldDACL, NULL, (void**)&pSD); 

    PSID pSid = NULL; 
    SID_IDENTIFIER_AUTHORITY authNt = SECURITY_NT_AUTHORITY; 
    AllocateAndInitializeSid(&authNt,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_USERS,0,0,0,0,0,0,&pSid); 

    EXPLICIT_ACCESS ea={0}; 
    ea.grfAccessMode = GRANT_ACCESS; 
    ea.grfAccessPermissions = GENERIC_ALL; 
    ea.grfInheritance = CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE; 
    ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP; 
    ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; 
    ea.Trustee.ptstrName = (LPTSTR)pSid; 

    ACL* pNewDACL = 0; 
    DWORD err = SetEntriesInAcl(1,&ea,pOldDACL,&pNewDACL); 

    if(pNewDACL) 
    SetSecurityInfo(hDir,SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL, NULL, pNewDACL, NULL); 

    FreeSid(pSid); 
    LocalFree(pNewDACL); 
    LocalFree(pSD); 
    LocalFree(pOldDACL); 
    CloseHandle(hDir); 

    return TRUE; 
} 
Problemi correlati