Supprimer un fichier verrouillé par Windows avec PowerShell

0
(0)

Supprimer un fichier verrouillé par Windows peut dans certains cas relever du cauchemar. En effet, ces fichiers rebelles sont parfois difficile à éradiquer sous Windows, notamment après l’arrêt d’un service. Ce guide présente une solution pour marquer ces fichiers à supprimer au prochain redémarrage du système en utilisant PowerShell et l’API MoveFileEx.

Pourquoi utiliser PowerShell pour supprimer un fichier verrouillé ?

Dans certains cas, des fichiers comme des exécutables d’agents (ex: Zabbix) peuvent être impossibles à supprimer via des méthodes classiques fourni par l’explorateur de fichier, pas même avec des commandes telles que Remove-Item ou une Method WMI. Cela peut provoquer des blocages lors de mises à jour ou désinstallations.

Présentation du script PowerShell pour supprimer un fichier

Voici le script qui utilise l’API Windows via la fonction MoveFileEx pour marquer un fichier à supprimer lors du prochain redémarrage :

PowerShell
Function Remove-ItemAnyway {
    [CmdletBinding()]
    Param(
        [parameter(Mandatory=$true)]
        [string] $Path
    )

    Add-Type @'
        using System;
        using System.Text;
        using System.Runtime.InteropServices;

        public class Posh
        {
            public enum MoveFileFlags
            {
                MOVEFILE_DELAY_UNTIL_REBOOT = 0x00000004
            }

            [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
            static extern bool MoveFileEx(string lpExistingFileName, string lpNewFileName, MoveFileFlags dwFlags);

            public static bool MarkFileDelete(string sourcefile)
            {
                return MoveFileEx(sourcefile, null, MoveFileFlags.MOVEFILE_DELAY_UNTIL_REBOOT);
            }
        }
'@

    $Path = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($PWD.Path, $Path))

    Try {
        Remove-Item $Path -ErrorAction Stop
    } Catch {
        $deleteResult = [Posh]::MarkFileDelete($Path)
        If ($deleteResult) {
            Write-Warning -Message "$Path has been marked for deletion"
        }
    }
}

Comment fonctionne ce script ?

  • Add-Type : Permet d’intégrer du code C# directement dans PowerShell pour utiliser la fonction MoveFileEx du fichier kernel32.dll.
  • MoveFileEx : Fonction native de l’API Windows qui permet de déplacer, renommer ou marquer un fichier pour suppression au redémarrage.
  • $Path : Le chemin du fichier à supprimer, reconstruit pour s’assurer qu’il est complet et correct.
  • Remove-Item : La cmdlet tente d’abord de supprimer le fichier de façon classique.
  • Catch : Si la suppression échoue (par exemple, accès refusé), le fichier est marqué pour suppression au prochain redémarrage.

Exemple d’usage

Supposons que vous ayez un fichier récalcitrant nommé ZabbixAgent.exe dans le dossier C:\Program Files\Zabbix que vous n’arrivez pas à supprimer.

PowerShell
Remove-ItemAnyway -Path "C:\Program Files\Zabbix\ZabbixAgent.exe"

Ce script tentera de supprimer le fichier. Si cela échoue, il marquera le fichier pour qu’il soit supprimé automatiquement au prochain redémarrage.

Étendre le script

Le script utilise ici la fonction MoveFileEx avec l’option MOVEFILE_DELAY_UNTIL_REBOOT, mais il est possible d’étendre ses capacités en utilisant d’autres flags proposés par l’API, comme MOVEFILE_REPLACE_EXISTING ou MOVEFILE_COPY_ALLOWED. Cela pourrait être utile dans des cas spécifiques où le fichier doit être déplacé ou remplacé plutôt que simplement supprimé. Voici une liste des autres options disponibles :

C#
Public enum MoveFileFlags
{
    MOVEFILE_REPLACE_EXISTING = 0x00000001,
    MOVEFILE_COPY_ALLOWED = 0x00000002,
    MOVEFILE_DELAY_UNTIL_REBOOT = 0x00000004,
    MOVEFILE_WRITE_THROUGH = 0x00000008,
    MOVEFILE_CREATE_HARDLINK = 0x00000010,
    MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x00000020
}

Bien que ces options existent, leur utilité dans le cadre de la suppression de fichiers est limitée.

Conclusion

Ce script s’avère être un outil puissant pour forcer la suppression de fichiers récalcitrants lors du redémarrage du système. Que vous soyez administrateur système ou développeur, il vous permettra de surmonter les erreurs d’accès refusé lorsque vous tentez de supprimer certains fichiers verrouillés par le système ou les services. C’est une solution simple et efficace pour éviter les blocages en environnement de production.


Sources

heyscriptingguy

leeholmes

Microsoft



Cette publication était-elle utile ?

Cliquez sur une étoile pour l'évaluer !

Note moyenne 0 / 5. Nombre de votes : 0

Aucun vote pour le moment ! Soyez le premier à évaluer cette publication.

Laisser un commentaire