J'ai besoin de tester si un utilisateur peut écrire dans un dossier avant d'essayer de le faire.
J'ai implémenté la méthode suivante (en C # 2.0) qui tente de récupérer les autorisations de sécurité pour le dossier à l'aide de la méthode Directory.GetAccessControl () .
private bool hasWriteAccessToFolder(string folderPath)
{
try
{
// Attempt to get a list of security permissions from the folder.
// This will raise an exception if the path is read only or do not have access to view the permissions.
System.Security.AccessControl.DirectorySecurity ds = Directory.GetAccessControl(folderPath);
return true;
}
catch (UnauthorizedAccessException)
{
return false;
}
}
Lorsque je cherchais sur Google comment tester l'accès en écriture, rien de tel ne s'est produit et il m'a semblé très compliqué de tester les autorisations dans Windows. Je crains de trop simplifier les choses et que cette méthode ne soit pas robuste, même si elle semble fonctionner.
Ma méthode pour tester si l'utilisateur actuel a un accès en écriture fonctionnera-t-elle correctement?
c#
permissions
directory
Chris B
la source
la source
Réponses:
C'est un moyen parfaitement valide de vérifier l'accès aux dossiers en C #. Le seul endroit où il peut tomber est si vous devez appeler cela dans une boucle serrée où la surcharge d'une exception peut être un problème.
D'autres questions similaires ont déjà été posées.
la source
J'apprécie que ce soit un peu tard dans la journée pour cet article, mais vous pourriez trouver ce morceau de code utile.
Déposez-le dans une application console et voyez s'il fait ce dont vous avez besoin.
la source
GetAccessControl
mais mon logiciel est actuellement capable d'écrire dans le répertoire que je regarde ..?la source
string tempFileName = Path.GetRandomFileName();
évidemmentJ'ai essayé la plupart d'entre eux, mais ils donnent des faux positifs, tous pour la même raison .. Il ne suffit pas de tester le répertoire pour une autorisation disponible, vous devez vérifier que l'utilisateur connecté est membre d'un groupe qui a cela autorisation. Pour ce faire, vous obtenez l'identité des utilisateurs et vérifiez s'il est membre d'un groupe qui contient le FileSystemAccessRule IdentityReference. J'ai testé cela, fonctionne parfaitement.
la source
(AccessRight & rule.FileSystemRights) > 0
parce que tout sous-type d'accès refusé qui fait partie desAccessRight
moyens que vous n'avez pas plein accès àAccessRight
À mon humble avis, le seul moyen fiable à 100% de tester si vous pouvez écrire dans un répertoire est d'y écrire et éventuellement d'attraper des exceptions.
la source
Par exemple, pour tous les utilisateurs (Builtin \ Users), cette méthode fonctionne très bien - profitez-en.
la source
Essaye ça:
la source
fsAccessRule.AccessControlType
pourrait êtreAccessControlType.Deny
.Votre code obtient le
DirectorySecurity
pour un répertoire donné et gère correctement une exception (car vous n'avez pas accès aux informations de sécurité). Cependant, dans votre exemple, vous n'interrogez pas réellement l'objet retourné pour voir quel accès est autorisé - et je pense que vous devez l'ajouter.la source
Voici une version modifiée de la réponse de CsabaS , qui tient compte des règles d'accès de refus explicites. La fonction parcourt toutes les FileSystemAccessRules d'un répertoire et vérifie si l'utilisateur actuel est dans un rôle qui a accès à un répertoire. Si aucun de ces rôles n'est trouvé ou si l'utilisateur est dans un rôle avec un accès refusé, la fonction renvoie false. Pour vérifier les droits de lecture, transmettez FileSystemRights.Read à la fonction; pour les droits d'écriture, transmettez FileSystemRights.Write. Si vous souhaitez vérifier les droits d'un utilisateur arbitraire et non ceux en cours, remplacez le WindowsIdentity de WindowsIdentity par currentUser WindowsIdentity. Je déconseillerais également de s'appuyer sur des fonctions comme celle-ci pour déterminer si l'utilisateur peut utiliser le répertoire en toute sécurité. Cette réponse explique parfaitement pourquoi.
la source
Les solutions ci-dessus sont bonnes mais pour moi, je trouve ce code simple et réalisable. Créez simplement un fichier temporaire. Si le fichier est créé, son utilisateur moyen a l'accès en écriture.
la source
Create
autorisation, mais pasDelete
dans ce cas, cela retournerait false même si l'utilisateur dispose d' une autorisation d'écriture.Path.Combine
plutôt commePath.Combine(tempfilepath, "temp.txt")
.Vous pouvez essayer le bloc de code suivant pour vérifier si le répertoire dispose d'un accès en écriture. Il vérifie le FileSystemAccessRule.
la source
Vous avez une condition de concurrence potentielle dans votre code - que se passe-t-il si l'utilisateur dispose des autorisations d'écrire dans le dossier lorsque vous vérifiez, mais avant que l'utilisateur n'écrive réellement dans le dossier, cette autorisation est retirée? L'écriture lèvera une exception que vous devrez attraper et gérer. Le contrôle initial est donc inutile. Vous pouvez aussi bien écrire et gérer les exceptions. C'est le modèle standard pour votre situation.
la source
http://www.codeproject.com/KB/files/UserFileAccessRights.aspx
Classe très utile, vérifiez la version améliorée dans les messages ci-dessous.
la source
Essayer simplement d'accéder au fichier en question ne suffit pas nécessairement. Le test s'exécutera avec les autorisations de l'utilisateur exécutant le programme - Ce qui n'est pas nécessairement les autorisations utilisateur que vous souhaitez tester.
la source
Je suis d'accord avec Ash, ça devrait aller. Sinon, vous pouvez utiliser CAS déclaratif et empêcher le programme de s'exécuter en premier lieu s'ils n'y ont pas accès.
Je crois que certaines des fonctionnalités CAS peuvent ne pas être présentes dans C # 4.0 d'après ce que j'ai entendu, je ne sais pas si cela pourrait être un problème ou non.
la source
Je n'ai pas pu obtenir GetAccessControl () pour lever une exception sur Windows 7 comme recommandé dans la réponse acceptée.
J'ai fini par utiliser une variante de la réponse de sdds :
J'espère que cela t'aides.
la source
J'ai rencontré le même problème: comment vérifier si je peux lire / écrire dans un répertoire particulier. Je me suis retrouvé avec la solution simple pour ... le tester. Voici ma solution simple mais efficace.
J'espère que ça aide !
la source
La plupart des réponses ici ne vérifient pas l'accès en écriture. Il vérifie simplement si l'utilisateur / groupe peut «lire l'autorisation» (lire la liste ACE du fichier / répertoire).
Également itérer via ACE et vérifier s'il correspond à l'identificateur de sécurité ne fonctionne pas car l'utilisateur peut être membre d'un groupe dont il pourrait obtenir / perdre des privilèges. Pire encore, ce sont les groupes imbriqués.
Je sais que c'est un vieux fil mais il y a une meilleure façon pour quiconque regarde maintenant.
À condition que l'utilisateur dispose du privilège d'autorisation de lecture, on peut utiliser l'API Authz pour vérifier l'accès effectif.
https://docs.microsoft.com/en-us/windows/win32/secauthz/using-authz-api
https://docs.microsoft.com/en-us/windows/win32/secauthz/checking-access-with-authz-api
la source