J'ai vu plusieurs réponses sur l'utilisation de Handle ou Process Monitor , mais j'aimerais pouvoir découvrir dans mon propre code (C #) quel processus verrouille un fichier.
J'ai le sentiment désagréable que je vais devoir faire de la spéléologie dans l'API win32, mais si quelqu'un l'a déjà fait et peut me mettre sur la bonne voie, j'apprécierais vraiment l'aide.
Mettre à jour
Liens vers des questions similaires
c#
file-locking
UN J.
la source
la source
Réponses:
L'un des avantages
handle.exe
est que vous pouvez l'exécuter en tant que sous-processus et analyser la sortie.Nous faisons cela dans notre script de déploiement - fonctionne comme un charme.
la source
Il y a longtemps, il était impossible d'obtenir de manière fiable la liste des processus de verrouillage d'un fichier car Windows ne suivait tout simplement pas ces informations. Pour prendre en charge l' API Restart Manager , ces informations sont désormais suivies.
J'ai assemblé du code qui prend le chemin d'un fichier et renvoie un
List<Process>
de tous les processus qui verrouillent ce fichier.Utilisation à partir d'une autorisation limitée (par exemple, IIS)
Cet appel accède au registre. Si le processus n'a pas l'autorisation de le faire, vous obtiendrez ERROR_WRITE_FAULT, ce qui signifie
An operation was unable to read or write to the registry
. Vous pouvez accorder sélectivement l'autorisation à votre compte restreint à la partie nécessaire du registre. Il est cependant plus sûr d'avoir votre processus d'accès limité définir un indicateur (par exemple dans la base de données ou le système de fichiers, ou en utilisant un mécanisme de communication interprocessus tel que la file d'attente ou le tube nommé) et qu'un deuxième processus appelle l'API Restart Manager.L'octroi d'autorisations autres que minimales à l'utilisateur IIS constitue un risque pour la sécurité.
la source
tasklist /m YourDllName.dll
et analyser la sortie. Voir stackoverflow.com/questions/152506/…Il est très complexe d'appeler Win32 à partir de C #.
Vous devez utiliser l'outil Handle.exe .
Après cela, votre code C # doit être le suivant:
la source
/accepteula
. J'ai mis à jour la réponse de Gennady avec le changement.handle.exe
J'ai eu des problèmes avec la solution de Stefan . Voici une version modifiée qui semble bien fonctionner.
METTRE À JOUR
Si vous voulez simplement savoir quel (s) processus verrouillent une DLL particulière, vous pouvez exécuter et analyser la sortie de
tasklist /m YourDllName.dll
. Fonctionne sur Windows XP et versions ultérieures. VoirQu'est-ce que cela fait? liste des tâches / m "mscor *"
la source
myProcessArray
un membre de la classe est (mais aussi renvoyé par getFileProcesses ()? Il en va de mêmemyProcess
.Cela fonctionne pour les DLL verrouillées par d'autres processus. Cette routine ne découvrira pas par exemple qu'un fichier texte est verrouillé par un traitement de texte.
C #:
VB.Net:
la source
plus simple avec linq:
la source