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
Libérer: 2025-01-19 22:36:09
original
892 Les gens l'ont consulté

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>
Copier après la connexion

É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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal