2010-06-05 7 views
4

Tout d'abord: Je sais que ce n'est pas fiable pour réellement vérifier si je peux écrire. J'écris un client de transfert de fichiers, et je veux la parité des fonctionnalités entre les volets "distant" et "local" du navigateur de fichiers. Je comprends parfaitement que je devrai gérer toutes les exceptions liées à l'autorisation pour toute opération effectuée indépendamment; ce n'est pas une vérification de programmation, c'est juste pour afficher à l'utilisateur.Comment vérifier si un fichier Windows est lisible/inscriptible?

J'ai vu plusieurs exemples pour ces postés, mais tout ce que j'ai essayé soit n'était pas compréhensible ou ne fonctionnait pas. J'ai essayé les deux méthodes, mais les deux reviens tout juste « oui » pour des choses que je ne peux certainement pas écrire à suivre (le contenu de C: \ Windows ou C: \ Program Files, par exemple):

System.Security.Permissions.FileIOPermission fp = new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Write, Path); 
return System.Security.SecurityManager.IsGranted(fp); 

et

System.Security.Permissions.FileIOPermission fp = new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.Write, element.Path); 
try 
{ 
    fp.Assert(); 
    return true; 
} 
catch(Exception x) 
{ 
    return false; 
} 

(Encore une fois, je suis conscient du fait que les deux attraper Exception est horrible et en utilisant try/catch pour la logique est un peu moins horrible, je vais juste essayer d'obtenir que cela fonctionne).

Le premier me dit que IsGranted est dépréciée et que nous devrions utiliser AppDomain.PermissionSet ou Application.PermissionSet, mais je ne peux trouver aucune explication de la façon d'utiliser ceux-ci qui est logique. J'ai aussi vu que je devrais énumérer manuellement toutes les listes de contrôle d'accès pour les comprendre moi-même, mais encore une fois, il n'y a pas de véritable exemple de cela. Il y a pas mal d'exemples pour définir les permissions, mais peu pour les vérifier.

Toute aide serait grandement appréciée.

Répondre

2

Eh bien, voici ce que je finalement liquidée avec: Bien sûr,

private readonly static WindowsIdentity _identity = WindowsIdentity.GetCurrent(); 
    protected static bool GetPermission(FileSystemRights right, string path) 
    { 
     FileSecurity fs; 
     try 
     { 
      fs = System.IO.File.GetAccessControl(path); 
     } 
     catch(InvalidOperationException) 
     { 
      // called on a disk that's not present, ... 
      return false; 
     } 
     catch(UnauthorizedAccessException) 
     { 
      return false; 
     } 
     foreach(FileSystemAccessRule fsar in fs.GetAccessRules(true, true, typeof(SecurityIdentifier))) 
     { 
      if(fsar.IdentityReference == _identity.User && fsar.FileSystemRights.HasFlag(right) && fsar.AccessControlType == AccessControlType.Allow) 
      { 
       return true; 
      } 
      else if(_identity.Groups.Contains(fsar.IdentityReference) && fsar.FileSystemRights.HasFlag(right) && fsar.AccessControlType == AccessControlType.Allow) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

ce n'est pas idéal, car il ne tient pas compte des droits Deny. Mais je n'ai aucune idée de l'ordre dans lequel appliquer les différentes ACE (je pense?) Afin de trouver la capacité "correcte". Pourtant, les règles de Deny sont relativement rares, donc ça marche la plupart du temps pour moi.

Questions connexes