Page 1 sur 1
[R] Détecter les process qui lockent un fichier
Posté : ven. 22 oct. 2010 14:04
par sksbir
Bonjour
Je voudrais savoir si il existe une méthode pour
1/ Déterminer si un fichier est locké
--> trouvé!! ici :
http://www.autoitscript.com/forum/index ... ntry571583
2/ Si c'est le cas, localiser le processus qui locke ce fichier.
Là par contre je n'ai rien trouvé, et dans
Ce topic, ça n'a pas été trouvé non plus.
Quelqu'un a t'il une idée ?
Merci d'avance.
Re: [..] Détecter les process qui lockent un fichier
Posté : dim. 24 oct. 2010 16:43
par TommyDDR
Bonjour,
Désolé, je ne pourrais te dire comment faire ce que tu cherche mais juste te confirmer que c'est faisable.
En effet, le logiciel
Unlocker permet de détecter quel processus a locker un fichier et permet même de débloquer celui ci sans fermer le processus.
Re: [R] Détecter les process qui lockent un fichier
Posté : mer. 03 nov. 2010 08:04
par sksbir
merci de ta réponse, tommyddr.
Je connaissais effectivement unlocker, ainsi que procexp afin de réaliser le travail de façon interactive.
La solution consiste à utiliser un petit utilitaire en ligne de commande créé par sysinternal ( comme procexp hein..) et qui s'appelle handle.exe :
http://technet.microsoft.com/fr-fr/sysi ... 96655.aspx
Par contre, l'objectif est bel et bien de tuer le process, est il a fallu donc passer par la réécriture d'un petit programme autoit qui utilise handle pour identifier le process, et qui le kille avec les commandes internes à autoit.
[edit] mots clés: verrou verou lock locker handle
Voici le code du programme :
► Afficher le texte
Code : Tout sélectionner
FileInstall ( ".\handle.exe", @TempDir & "\",1)
if Not(FileExists(@TempDir & "\handle.exe")) then exit 8
;; $TEST=RunWait(@TempDir & "\handle.exe")
$FICHIER=""
If $CMDLINE[0]=1 Then
$FICHIER=$CMDLINE[1]
Else
ConsoleWriteError("Syntaxe: " & @ScriptName & " FICHIER" & @CRLF)
exit 9
EndIf
If Not(FileExists($FICHIER)) Then
ConsoleWriteError("Fichier " & $FICHIER & " inexistant" & @CRLF)
exit 9
EndIf
If StringLeft($FICHIER,2)="\\" Then
ConsoleWriteError("Fichier " & $FICHIER & " n'est pas un fichier local!" & @CRLF)
exit 9
EndIf
$PID=Run(@TempDir & "\handle.exe","",@SW_HIDE,2)
$RESULTAT=""
Do
$RESULTAT&=StdoutRead($PID)
Until @error
$ANALYSE=StringSplit($RESULTAT,@CRLF,1)
$MEMOPROCESS=""
$NEXTLIGNE=0
For $LIGNE=1 To $ANALYSE[0]
If $NEXTLIGNE Then
$MEMOPROCESS=StringSplit($ANALYSE[$LIGNE]," ")
$NEXTLIGNE=0
Else
If StringMid($ANALYSE[$LIGNE],8,4)="File" Then
If stringinstr(StringMid($ANALYSE[$LIGNE],22),$FICHIER) Then
If $MEMOPROCESS[0]>0 Then
ConsoleWrite("Lock détecté pour processus " & $MEMOPROCESS[1] & ",PID=" & $MEMOPROCESS[3] & @CRLF)
;
ConsoleWrite("ProcessClose " & $MEMOPROCESS[3] & @CRLF)
ProcessClose(Number($MEMOPROCESS[3]))
ProcessWaitClose(Number($MEMOPROCESS[3]),10) ; on attend jusqu'à 10 secondes
If ProcessExists(Number($MEMOPROCESS[3])) Then
ConsoleWriteError("processus " & $MEMOPROCESS[1] & ",PID=" & $MEMOPROCESS[3] & " ne s'est pas arreté après 10 secondes." & @CRLF & "Poursuite du scan..." & @CRLF)
EndIf
$MEMOPROCESS[0]=0
EndIf
EndIf
EndIf
If StringLeft($ANALYSE[$LIGNE],10)="----------" Then $NEXTLIGNE=1
EndIf
Next
Le programme est prévu pour être compilé en mode console.