2010-02-16 17 views
7

Ho notato che se si modificano le impostazioni di sicurezza per una determinata directory, è possibile rendere tale cartella non più "sfogliabile" in Windows. In particolare, la modifica dell'autorizzazione "Lettura" per gli amministratori su "Nega" renderà inaccessibile quella cartella.Leggi autorizzazioni per una directory in C#

La domanda che ho ora, è come faccio a capirlo nel codice? I seguente ottiene me vicino, ma non è ancora quello giusto:

/// <summary> 
/// Takes in a directory and determines if the current user has read access to it (doesn't work for network drives) 
/// THIS IS VERY HACKY 
/// </summary> 
/// <param name="dInfo">directoryInfo object to the directory to examine</param> 
/// <returns>true if read access is available, false otherwise</returns> 
public static bool IsDirectoryReadable(DirectoryInfo dInfo) 
{ 
    try 
    { 
     System.Security.AccessControl.DirectorySecurity dirSec = dInfo.GetAccessControl(); 
     System.Security.Principal.WindowsIdentity self = System.Security.Principal.WindowsIdentity.GetCurrent(); 
     System.Security.Principal.WindowsPrincipal selfGroup = new System.Security.Principal.WindowsPrincipal(self); 
     // Go through each access rule found for the directory 
     foreach (System.Security.AccessControl.FileSystemAccessRule ar in dirSec.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier))) 
     { 
      if (selfGroup.IsInRole((System.Security.Principal.SecurityIdentifier)ar.IdentityReference)) 
      { 
       // See if the Read right is included 
       if ((ar.FileSystemRights & System.Security.AccessControl.FileSystemRights.Read) == System.Security.AccessControl.FileSystemRights.Read) 
       { 
        if (ar.AccessControlType == System.Security.AccessControl.AccessControlType.Allow) 
        { 
         // If all of the above are true, we do have read access to this directory 
         return true; 
        } 
        else 
        { 
         return false; 
        } 
       } 
      } 
     } 
     // If we didn't find anything 
     return false; 
    } 
    catch 
    { 
     // If anything goes wrong, assume false 
     return false; 
    } 
} 

sono vicino con quanto sopra, ma mi manca ancora qualcosa di enorme. Se faccio clic destro su una cartella per impostare le autorizzazioni, vedo (nel mio esempio) 3 gruppi o nomi utente: "Administrators, myUserName e SYSTEM". Se imposto "Leggi" su Nega per "Amministratori" o "Nomeutente", non riesco più a sfogliare la directory. Se imposto solo "Sistema" su "Nega", posso ancora sfogliarlo.

Sembra esserci una sorta di gerarchia di autorizzazioni implicita, dove myUserName o Administrator sostituisce il gruppo/utente SYSTEM.

Il codice sopra cerca il primo permesso per "lettura" che trova per la mia identità utente e restituisce true. Potrei anche scrivere il codice che cerca il primo "Nega" per Read e restituisce false.

Posso impostare una cartella da leggere - "Nega" per SISTEMA e leggi - "Consenti" per gli altri due conti e leggere ancora la cartella. Se cambio il codice per cercare Deny e incontra prima l'identità dell'utente SYSTEM, la mia funzione restituirà "false", che è ... false. Potrebbe benissimo leggere "Consenti" per gli altri due account.

Il problema che ancora non riesco a capire è, come posso determinare quale autorizzazione di identità utente ha la priorità su tutti gli altri?

+2

L'account SYSTEM è solo un account normale, non trattarlo in modo specifico. È usato dai servizi. –

risposta

3

Diventa molto difficile perché ACL consente l'ereditarietà, ma hanno anche un modello di accesso più restrittivo. In altre parole, se hai un DENY in qualsiasi punto della tua catena di utenti verso una risorsa, indipendentemente da quanti altri gruppi possano darti un permesso, ti viene negato. There is a good article on the subect on MSDN.

2

Il gruppo di sistema è correlato al processo O/S e non direttamente correlato al proprio account utente. È quello che l'O/S userebbe per accedere al filesystem se non ci fosse un contesto utente. Poiché la tua applicazione è in esecuzione come "nome utente", i permessi provengono da esso e dai gruppi in cui si trova. Non pensare di dover controllare il sistema in questo caso, a meno che manchi qualcosa.

Aggiornamento: Ricordare che Directory.Exists() controllerà anche se si dispone delle autorizzazioni per leggere la directory.

+0

Ho entrambi "Leggi" e "Elenco contenuti" impostato su Nega per il mio utente corrente per una directory. Non riesco a fare doppio clic su questa directory. Se provo (myDirectoryInfo.Exists), si presenta come "true". Hmmm ... Non sembra funzionare ... Inoltre non funziona con (Directory.Exists()) – Nick

+0

Interessante, dice * Se non si dispone di un permesso di sola lettura per la directory, esiste il metodo restituirà false. * Forse significa permessi di lettura nella cartella genitore poiché puoi vedere la directory ma non i suoi contenuti. –

0

Il problema non è una gerarchia di autorizzazioni. Il problema è che il codice restituisce true o false in base al primo ruolo corrispondente. Hai davvero bisogno di valutare tutte le autorizzazioni.

Recentemente ho dovuto affrontare questo problema ... Ho postato il mio codice here.

+0

"La risorsa che stai cercando è stata rimossa, ha cambiato nome o è temporaneamente non disponibile." Potresti postarlo come una risposta reale, come richiesto dalle linee guida SO? –

Problemi correlati