3 votes

Comment puis-je définir les autorisations de fichier pour empêcher quiconque d'obtenir un verrouillage exclusif sur mon fichier?

Je veux ouvrir le fichier en mode ajout sur un hôte Windows 7 en utilisant C#/.NET. Je veux utiliser les opérations de sortie de fichier habituelles à cette fin. J'ai trouvé une telle solution :

FileStream trace_fd = new FileStream(r"c:\temp\testlog.txt", 
                                     FileMode.Append, 
                                     FileAccess.Write, 
                                     FileShare.ReadWrite)

Mon fichier de trace est lisible même si mon programme avec la ligne ci-dessus est en cours d'exécution. Je n'ai plus d'exception indiquant que le fichier est utilisé par un autre processus à partir du bon code comme ceci :

FileStream good_logreader_fd = new FileStream("c:\temp\testlog.txt", 
                                              FileMode.Read, 
                                              FileAccess.Read,
                                              FileShare.ReadWrite)

Ensuite, j'ai un autre programme (un scanner de journal bogué) avec une ligne telle que :

FileStream bad_logreader_fd = new FileStream("c:\temp\testlog.txt", 
                                             FileMode.Read, 
                                             FileAccess.Read, 
                                             FileShare.None)

Cette ligne est évidemment un bug pour le scanner de journal. Si mon programme ne fonctionne pas, alors le scanner de journal buggy obtiendra un verrou exclusif et les exécutions suivantes de mon programme échoueront à obtenir un fd pour le fichier de trace.

Ma question est que puis-je faire pour éviter qu'un tel scénario horrifique ne se produise. Par exemple, puis-je définir des autorisations de fichier pour le fichier de trace pour empêcher quiconque de prendre un verrou exclusif ? Si oui, alors comment ? Y a-t-il autre chose qui peut protéger mon programme du problème du scanner de journal bogué ? Notez que je dois conserver le même nom de fichier de trace entre les exécutions de mon programme.

3voto

Alexei Levenkov Points 49945

Vous ne pouvez pas définir des autorisations pour permettre un accès complet à un fichier, mais restreindre de quelque manière le mode de partage de fichiers FileShare.None n'est pas lié aux autorisations d'accès.

Les autorisations donnent à un processus (en fonction du compte sous lequel il s'exécute) un accès à un fichier/ressource. Si l'accès est accordé, le processus peut ouvrir le fichier avec le mode de partage qu'il désire. Si ce mode de partage ne entre pas en conflit avec les modes de partage existants sur le fichier, la demande réussit et le fichier aura désormais ce mode de partage (combiné à l'ancien). Voir la section CreateFile- dwShareMode pour plus de détails.

Dans votre cas, le lecteur de journal a besoin d'avoir les autorisations pour ouvrir le fichier, afin qu'il puisse définir ShareMode.None s'il est le premier processus à ouvrir le fichier. Comme le dit devshorts, il n'y a pas grand-chose que vous puissiez faire à court de changer le processus fautif OU de pirater les méthodes d'accès aux fichiers (chercher "hook CreateFile").

Notez bien : si votre lecteur de journal s'exécute sous le même compte que d'autres processus, les autorisations ne seront pas utiles pour une raison supplémentaire - car il n'existe pas de "permissions par processus" dans Windows et tous les processus partageront les mêmes autorisations de l'utilisateur.

2voto

devshorts Points 2741

À ma connaissance, vous ne pouvez pas empêcher quelqu'un d'essayer d'ouvrir le fichier dans un autre mode d'accès sans modifier leur code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X