IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Savoir si un fichier est ouvert


Sujet :

Windows

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Savoir si un fichier est ouvert
    Bonjour,

    Je suis un débutant coté API Windows depuis bien des années.
    Il faut dire que je bouffe des sacré doses de Windows, mais coté systèmes et réseau (je suis administrateur/ingénieur/responsable matériel systèmes et réseaux)

    Parfois un probème se pose à moi que je pense ne pouvoir résoudre que par le devellopement... Et là, c'est le cas.

    Je cherches differents infos si possible via l'API Win 32 ou l'API Native. à défaut, en batch , ou en sript , ou à défaut en autre chose...
    (que je chercherais à priori à utiliser en C++ tres C tout ce qu'il y a de plus basique, probablement en mode console)

    Je ne demande pas forcement de code, si il le faut, ça me prendra des mois avant d'y arriver, mais je n'arrive pas à trouver les méthodes

    Je cherche à savoir si un fichier est ouvert ou non.

    Je voudrais pouvoir savoir quels thread/processus/appli accédent à un fichier.
    (un peu ce que fait unlocker avant de unlocker (ou comme l'une des fonctionalités de process explorer de Sysinternals si il faut vraiment passer par une énumération des handles process par process (doit on effectivemet faire une énumération process par process?)).

    Dans le cas d'un serveur terminal server, je voudrais en plus savoir dans quelles sessions sont lancés les process.

    Dans le cas d'accès réseaux, je voudrais savoir quelles machines et quels comptes windows sont utilisés pour acceder à ces fichiers (un peu comme ce que l'on trouve dans compmgmt.msc (gestion systéme) dans la partie gestion de l'ordinateur -> outils systèmes -> dossiers partagés -> fichiers ouverts (ou ouvrir les fichiers sous 2000), mais en plus complet)

    En tout cas, si quelqu'un a ça en magasin, je lui serais trés reconnaissant!

    Merci de ne pas me répondre qu'il faut tenter d'ouvrir le fichier

    Merci, et à bientôt

    Cyril

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Dans codeguru (http://www.codeguru.com/Cpp/W-P/file...cle.php/c1287/) tu as un source qui permet de supprimer un fichier locké par un processus.

    Dans le source, il y a donc une fonction qui trouve tous les processus qui accèdent au fichier.

    Voilà la partie qui t'intéresse plus particulièrement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    //Closes the file handles in the processes which are using this file
    void CloseRemoteFileHandles( LPCTSTR lpFileName )
    {
    	CString deviceFileName;
    	CString fsFilePath;
    	CString name;
    	CString processName;
    	SystemHandleInformation hi;
    	SystemProcessInformation pi;
    	SystemProcessInformation::SYSTEM_PROCESS_INFORMATION* pPi;
    	
    	//Convert it to device file name
    	if ( !SystemInfoUtils::GetDeviceFileName( lpFileName, deviceFileName ) )
    	{
    		_tprintf( _T("GetDeviceFileName() failed.\n") );
    		return;
    	}
    	
    	//Query every file handle (system wide)
    	if ( !hi.SetFilter( _T("File"), TRUE ) )
    	{
    		_tprintf( _T("SystemHandleInformation::SetFilter() failed.\n") );
    		return;
    	}
    
    	if ( !pi.Refresh() )
    	{
    		_tprintf( _T("SystemProcessInformation::Refresh() failed.\n") );
    		return;
    	}
    
    	//Iterate through the found file handles
    	for ( POSITION pos = hi.m_HandleInfos.GetHeadPosition(); pos != NULL; )
    	{
    		SystemHandleInformation::SYSTEM_HANDLE& h = hi.m_HandleInfos.GetNext(pos);
    
    		if ( !pi.m_ProcessInfos.Lookup( h.ProcessID, pPi ) )
    			continue;
    
    		if ( pPi == NULL )
    			continue;
    
    		//Get the process name
    		SystemInfoUtils::Unicode2CString( &pPi->usName, processName );
    
    		//NT4 Stupid thing if I query the name of a file in services.exe
    		//Messengr service brings up a message dialog ??? :(
    		if ( INtDll::dwNTMajorVersion == 4 && _tcsicmp( processName, _T("services.exe") ) == 0 )
    			continue;
    		
    		//what's the file name for this given handle?
    		hi.GetName( (HANDLE)h.HandleNumber, name, h.ProcessID );
    
    		//This is what we want to delete, so close the handle
    		if ( _tcsicmp( name, deviceFileName ) == 0 )
    			CloseRemoteHandle( processName, h.ProcessID, (HANDLE)h.HandleNumber );
    	}
    }
    Est-ce que ça correspond à ce que tu cherches ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Comme je le disais dans mon premier post, je suis un néophyte permanent...
    Il va me falloir un moment avant d'être sur de ce que je vais cependant ennoncer maintenant...
    En cas d'erreur, veuillez m'en excuser!

    Il semble que ce code réponde parfaitement à l'un de mes problématiques qui est de trouver les processus qui accédent à un fichier. Et de cela Karl3i je te remercie grandement car avant de poster j'avais déjà fais beaucoup de recherches (Mais je ne suis pas devellopeur et il est difficile de trouver les solutions lorsqu'on ne sais pas forcement par quel bout prendre les problèmes)

    En tout cas, voila un bout de code bien sympatique qui va me prendre un certain temps à comprendre!

    Et Par contre, il me reste 2 problèmatiques:

    1. Trouver la session dans laquelle sont ouvertes les applications qui accedent au fichier dans le cas d'un serveur TSE (même si je sais que cela necessiterais peut être un autre post).

    2. (Bien plus important) Dans le cas d'un accès à un fichier par le réseau savoir quelle machine et quel user accèdent au fichier.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Points : 341
    Points
    341
    Par défaut
    Salut,

    la plupart des infos relatives aux Handles des processus se cache dans les différentes structures.

    Par exemple :
    La structure SYSTEM_HANDLE contient entre autres les membres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ProcessID: Used to display the owners process name 
    ObjectType: Type of Object (e.g. OB_TYPE_FILE == File-Object) 
    *pObject: Address of the kernel mode data structure for this object
    Tu peux donc retrouver entre autres le PID du processus.

    De manière exhaustive, voici le contenu, je crois, de SYSTEM_PROCESS_INFORMATION

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        ULONG           NextEntryDelta;         // offset to the next entry
        ULONG           ThreadCount;            // number of threads
        ULONG           Reserved1[6];           // reserved
        LARGE_INTEGER   CreateTime;             // process creation time
        LARGE_INTEGER   UserTime;               // time spent in user mode
        LARGE_INTEGER   KernelTime;             // time spent in kernel mode
        UNICODE_STRING  ProcessName;            // process name
        KPRIORITY       BasePriority;           // base process priority
        ULONG           ProcessId;              // process identifier
        ULONG           InheritedFromProcessId; // parent process identifier
        ULONG           HandleCount;            // number of handles
        ULONG           Reserved2[2];           // reserved
        VM_COUNTERS     VmCounters;             // virtual memory counters
    #if _WIN32_WINNT >= 0x500
        IO_COUNTERS     IoCounters;             // i/o counters
    #endif
        SYSTEM_THREAD_INFORMATION Threads[1];   // threads
    Je n'ai pas trouvé explicitement la donnée "user name", mais n'est-ce pas possible de la retrouver à partir du PID ?

    Karl.

Discussions similaires

  1. [C#] Savoir si un fichier est ouvert
    Par djoao dans le forum Windows Forms
    Réponses: 1
    Dernier message: 18/12/2006, 10h38
  2. [VB]Savoir si un fichier est ouvert ou non
    Par voileux dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2006, 16h01
  3. savoir si un fichier est ouvert
    Par niclalex dans le forum Access
    Réponses: 2
    Dernier message: 12/10/2005, 19h19
  4. Unix - Comment savoir si un fichier est ouvert
    Par freddyboy dans le forum C
    Réponses: 7
    Dernier message: 06/10/2004, 15h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo