2009-01-09 14 views
16

J'écris une application pour gérer l'accès des utilisateurs aux fichiers. La version courte d'une très longue histoire est que je dois utiliser le répertoire et les privilèges de fichiers pour le faire. Pas de système de gestion de documents pour notre PDG bon marché ...Autorisations de fichier/répertoire C#

Quoi qu'il en soit ... J'ai tout fonctionné sauf dans le cas où l'utilisateur peut voir quels fichiers sont dans le répertoire mais ne voient pas réellement le contenu du fichier. (Il peut y avoir des données de ressources humaines sensibles dans les fichiers.)

J'ai essayé FileSystemRights.ListDirectory, mais cela semble (dispense de la documentation MS) définir ReadData à true aussi. J'éteins ReadData (la capacité de lire les fichiers) et je n'ai soudainement plus accès au répertoire. Les deux semblent liés.

Avez-vous des idées sur les autorisations à définir pour atteindre cet objectif?

Mon code actuel est:

SetSecurity(pth, usr, FileSystemRights.ListDirectory, AccessControlType.Allow); 

... 

public void SetSecurity(string dirName, string account, 
    FileSystemRights rights, AccessControlType controlType) 
{ 
    // Get a FileSecurity object that represents the 
    // current security settings. 
    DirectorySecurity dSecurity = Directory.GetAccessControl(dirName); 

    dSecurity.AddAccessRule(new FileSystemAccessRule(account, rights, controlType)); 

    // Set the new access settings. 
    Directory.SetAccessControl(dirName, dSecurity); 
} 

Merci.

--Jerry

Répondre

7

Le FileSystemRights enum cartes à la fois ReadData et listDirectory à la valeur 1, de sorte que les deux sont équivalents à 100% dans la mesure du .NET est concerné.

Avez-vous essayé Traverse par opposition à ListDirectory?

Éditer: Basé sur this l'article de KB il semble que Windows XP les considère aussi les mêmes, juste un s'applique seulement aux dossiers, et on applique seulement aux annuaires.

Édition 2: Tant que vous définissez la règle d'accès ReadData/ListDirectory sur NON héritée par les objets enfants, vous devriez pouvoir l'appliquer au répertoire sans l'appliquer aux fichiers du répertoire. La classe FileSystemAccessRule prend en charge la modification des indicateurs d'héritage.

3

Les fichiers héritent probablement des propriétés de sécurité de parent.

Vous pouvez essayer d'appeler DirectorySecurity.SetAccessRuleProtection(true, false) pour empêcher les fichiers d'hériter, avant d'appeler Directory.SetAccessControl();

+0

Oui. Les fichiers héritent du dossier. Pourtant, un autre «PDG refuse d'acheter une véritable solution de gestion de documents» que nous devons avoir mis en place. – Jerry

+0

Après un test sans héritage sur un dossier particulier, vous avez raison. Vous pouvez activer le dossier, puis désactiver le fichier lui-même et cela fonctionne comme vous le souhaitez ... mais pour d'autres raisons, ce n'est pas une option pour nous. – Jerry

1

Oui. Traverse (je pense que c'est mal nommé) me permet d'exécuter un programme dans un dossier, mais pas afficher le contenu d'un dossier. Je ne sais pas pourquoi c'est utile, pour être honnête.

Je suis sur le point de dire au PDG que cela ne peut pas être fait et regarder les étincelles voler à nouveau. : P

+2

Etre capable de contourner les contrôles de cheminement permet d'accéder au fichier O (1) au lieu de O (n). Imaginez essayer d'ouvrir 100 fichiers imbriqués 12 répertoires profonds. Si vous pouvez contourner les vérifications transversales, il vous suffit de faire 100 contrôles ACL; sinon, vous devez faire 1200 chèques. – Gabe

0

Ce sont les valeurs de l'héritage et de propagation qui ne sont pas réglées lorsque l'FileSystemAccessRule est instancié ..

Questions connexes