Maison >développement back-end >C++ >Comment identifier les processus verrouillant un fichier dans .NET à l'aide de l'API Win32 ?

Comment identifier les processus verrouillant un fichier dans .NET à l'aide de l'API Win32 ?

DDD
DDDoriginal
2025-01-19 22:36:09983parcourir

How to Identify Processes Locking a File in .NET Using the Win32 API?

Déverrouiller le mystère : identification des processus de verrouillage de fichiers dans .NET

Le framework .NET, combiné à l'API Win32, offre une solution puissante pour identifier les processus qui détiennent des verrous sur des fichiers spécifiques. Ce guide détaille le processus.

Exploiter l'API Restart Manager

Windows utilise l'API Restart Manager pour suivre les processus détenant des verrous de fichiers. Cette API fournit un mécanisme robuste pour identifier ces processus. Le code suivant le démontre :

<code class="language-c#">using System.Runtime.InteropServices;
using System.Diagnostics;
using System;
using System.Collections.Generic;

public static class FileUtil
{
    ...
    // See code in provided response
    ...
}</code>

Étapes de mise en œuvre

Pour utiliser ce code et identifier les processus de verrouillage de fichiers, suivez ces étapes :

<code class="language-c#">// Initialize a list to hold processes with file locks.
var processes = new List<Process>();

// Set up required variables and resources.
uint handle;
string key = Guid.NewGuid().ToString();

int res = RmStartSession(out handle, 0, key);

if (res != 0) { throw new Exception("Restart session initiation failed. Unable to identify file locker."); }

try
{
    const int ERROR_MORE_DATA = 234;
    uint pnProcInfoNeeded = 0,
         pnProcInfo = 0,
         lpdwRebootReasons = RmRebootReasonNone;

    string[] resources = new string[] { path };

    res = RmRegisterResources(handle, (uint)resources.Length, resources, 0, null, 0, null);

    if (res != 0) { throw new Exception("Resource registration failed."); }

    res = RmGetList(handle, out pnProcInfoNeeded, ref pnProcInfo, null, ref lpdwRebootReasons);

    if (res == ERROR_MORE_DATA)
    {
        ...  // See code in provided response

    }
    else if (res != 0) 
    { 
        throw new Exception("Failed to list processes locking the resource. Could not retrieve result size."); 
    }
}
finally
{
    RmEndSession(handle);
}</code>

N'oubliez pas de remplacer path par le chemin réel du fichier.

Résolution des autorisations limitées

Les processus exécutés avec des privilèges limités (comme ceux sous IIS) peuvent rencontrer des problèmes d'accès. Dans de tels scénarios, des méthodes alternatives peuvent être nécessaires, ou des ajustements d'autorisation soigneusement étudiés pour les clés de registre pertinentes peuvent être nécessaires. Donnez la priorité aux meilleures pratiques de sécurité lors de la modification des autorisations.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn