2010-08-11 17 views
11

ottengo un UnautorizedAccessException esecuzione di questo codice:Controllo di accesso autorizzazioni file/cartella

string[] fileList = Directory.GetFiles(strDir, strExt); 

L'eccezione si verifica in c:\users\username\appdata Come posso verificare se ho il permesso di accesso (per elencare e leggere i file)?

+0

hai già un modo per controllare - GetFiles :) Cosa c'è che non va? –

+4

È lento quando si rilevano le eccezioni. –

risposta

11

Prima di tutto, vorrei controllare manualmente le autorizzazioni e vedere che cosa ti blocca e cosa no. Sto usando qualcosa di simile per verificare i permessi (per il file copy):

AuthorizationRuleCollection acl = fileSecurity.GetAccessRules(true, true,typeof(System.Security.Principal.SecurityIdentifier)); 
bool denyEdit = false; 
for (int x = 0; x < acl.Count; x++) 
{ 
    FileSystemAccessRule currentRule = (FileSystemAccessRule)acl[x]; 
    AccessControlType accessType = currentRule.AccessControlType; 
    //Copy file cannot be executed for "List Folder/Read Data" and "Read extended attributes" denied permission 
    if (accessType == AccessControlType.Deny && (currentRule.FileSystemRights & FileSystemRights.ListDirectory) == FileSystemRights.ListDirectory) 
    { 
     //we have deny copy - we can't copy the file 
     denyEdit = true; 
     break; 
    } 
... more checks 
} 

Inoltre, ci sono alcuni casi strani in cui un certo diritto sulla cartella cambia il diritto per i file a prescindere dalle loro singole autorizzazioni (volontà vedi se riesco a trovare quello che è).

5

Controlla l'articolo sul progetto di codice che riguarda la cosa che ti serve, la classe è creata per questo: Lo scopo di questa classe è di fornire una risposta semplice a una domanda comune, "Ho il permesso di leggere o scrivere questo file?".

A simple way to test individual access rights for a given file and user

Nota: non possono inserire tutto il codice qui perché la sua troppo lunga.

+2

Questo esempio è tutto tranne che semplice. – dahvyd

+0

@dahvyd: Il codice veramente funzionante è raramente. –

+2

@Quandary, io tenderei a non essere d'accordo in generale, ma quell'esempio specifico fa cinquanta miliardi di cose con codice terribile, quando l'OP chiedeva di un requisito molto specifico. Overhoill IMHO. – dahvyd

3

Innanzitutto, chiamare Directory.GetFiles per la directory principale. Catch UnauthorizedAccessException - se nessuno, hai pieno accesso.

Se preso - chiama la funzione per ogni subdir ricorsiva, cattura l'eccezione, se catturata - aggiungi tale dir alla lista.

Scrivi una funzione ricorsiva con la lista esterna per dirs proibiti

Problemi correlati