45 votes

Comment obtenir la liste des handles de fichiers ouverts par processus en C# ?

Comment obtenir la liste des handles de fichiers ouverts par identifiant de processus en C# ?

Je suis intéressé à creuser et à obtenir les noms des fichiers aussi.

Je cherche l'équivalent programmatique de ce que fait l'explorateur de processus.

Cela nécessitera très probablement une interopérabilité.

J'envisage d'ajouter une prime à ce sujet, l'implémentation est méchamment compliquée.

6 votes

Une solution finale avec le code source complet ?

3 votes

Pour ceux qui tombent sur ce fil, la réponse proposée par @manuc66 a fini par fonctionner pour moi. MAIS, l'implémentation disponible aquí vise la plate-forme x86. J'ai forké le repo et fait quelques ajustements pour qu'il puisse fonctionner à la fois sur x86 et x64. Vous pouvez trouver l'implémentation modifiée ici : https://github.com/urosjovanovic/MceController/blob/master/VmcServices/DetectOpenFiles.cs

26voto

Sam Saffron Points 56236

Ouch, cela va être difficile à faire à partir du code géré.

Hay un échantillon sur codeproject

La plupart des choses peuvent être faites en interop, mais vous avez besoin d'un pilote pour obtenir le nom du fichier car il se trouve dans l'espace d'adressage du noyau. Process Explorer intègre le pilote dans ses ressources. Obtenir tout cela à partir de C# et supporter 64 bits ainsi que 32, va être un casse-tête majeur.

1 votes

Qui se soucie du code, cette chose est utile ! Même plus beau que Process Explorer, pour ce qu'il fait.

0 votes

Ce n'est pas quelque chose de facile en code géré, je me contenterais probablement d'un programme c++ si je devais construire quelque chose comme ça @Kiquenet

12voto

Mark Cidade Points 53945

Vous pouvez également exécuter l'application en ligne de commande, Poignée par Mark Rusinovich, et analyser la sortie.

4 votes

Pourquoi @bruce ? Des raisons, s'il vous plaît ?

5 votes

Le seul vrai problème avec l'utilisation de handle est la licence - vous ne pouvez pas distribuer handle, pas même dans un freeware.

0 votes

Handle.exe est une application 32 bits, n'est-ce pas ? Vous ne pouvez donc pas la lancer facilement à partir d'une application C# 64 bits.

12voto

manuc66 Points 94

Jetez un coup d'œil à ce fichier : http://vmccontroller.codeplex.com/SourceControl/changeset/view/47386#195318

Et utiliser :

DetectOpenFiles.GetOpenFilesEnumerator(processID);

Démonstration :

using System;
using System.Diagnostics;

namespace OpenFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var openFiles = VmcController.Services.DetectOpenFiles.GetOpenFilesEnumerator(Process.GetCurrentProcess().Id))
            {
                while (openFiles.MoveNext())
                {
                    Console.WriteLine(openFiles.Current);
                }
            }
            Console.WriteLine();
            Console.ReadKey();
        }
    }
}

Il est dépendant de l'assemblage System.EnterpriseServices

0 votes

En l'exécutant comme vous l'avez mentionné GetOpenFilesEnumerator retourne un objet avec 2 membres:<br>ERROR_ACCESS_DENIED et ERROR_INVALID_PARAMETERS

0 votes

Je viens de tester et ce code fonctionne bien. Peut-être que vous n'avez pas l'accès.

0 votes

Une idée de l'assemblage requis pour "EventTrackingEnabledAttribute" ou "ServicedComponent" ?

11voto

Mark Cidade Points 53945

Vous pouvez P/INVOKE dans le NtQuerySystemInformation pour rechercher toutes les poignées, puis de partir de là. Ce site Discussion en groupe sur Google a des détails.

0 votes

De bonnes choses. Je vais voir si je peux faire fonctionner l'interopérabilité.

2voto

mkm Points 19

Handle est un excellent programme, et le lien vers codeproject est bon.

@Brian La raison de ce code est que handle.exe n'est PAS redistribuable. Ils ne publient pas non plus leurs sources.

Il semble que .Net n'y parviendra pas facilement, car il semble qu'un lecteur de périphérique intégré soit nécessaire pour accéder aux informations. Cela ne peut pas être fait dans .net sans une DLL non modifiée. Il s'agit d'un code noyau relativement profond par rapport au codage .net typique. Je suis surpris que WMI n'expose pas cela.

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