{"id":353674,"date":"2024-09-18T09:11:43","date_gmt":"2024-09-18T09:11:43","guid":{"rendered":"https:\/\/www.ninjaone.com\/script-hub\/automatiser-la-desinstallation-d-une-application-sur-windows-avec-un-script-powershell\/"},"modified":"2024-10-13T19:03:23","modified_gmt":"2024-10-13T19:03:23","slug":"automatiser-la-desinstallation-d-une-application-sur-windows-avec-un-script-powershell","status":"publish","type":"script_hub","link":"https:\/\/www.ninjaone.com\/fr\/script-hub\/automatiser-la-desinstallation-d-une-application-sur-windows-avec-un-script-powershell\/","title":{"rendered":"Comment automatiser la d\u00e9sinstallation d&rsquo;une application sur Windows avec PowerShell ?"},"content":{"rendered":"<p>Dans le monde de l&rsquo;informatique, la gestion des logiciels sur plusieurs machines est une t\u00e2che complexe et essentielle. L&rsquo;un des d\u00e9fis les plus courants auxquels sont confront\u00e9s les administrateurs informatiques est la d\u00e9sinstallation des applications d&rsquo;une mani\u00e8re <a href=\"https:\/\/www.ninjaone.com\/fr\/efficacite\" target=\"_blank\" rel=\"noopener\">efficace<\/a> et standardis\u00e9e.<\/p>\n<p>La d\u00e9sinstallation manuelle, en particulier sur plusieurs terminaux, prend du temps et est \u00e9galement sujette \u00e0 des erreurs. C&rsquo;est l\u00e0 que les scripts <a href=\"https:\/\/www.ninjaone.com\/fr\/it-hub\/endpoint-management\/qu-est-ce-que-powershell\" target=\"_blank\" rel=\"noopener\">PowerShell<\/a>, comme celui dont nous allons parler, entrent en jeu.<\/p>\n<p>Ce script particulier automatise\u00a0<strong>la d\u00e9sinstallation d&rsquo;une application<\/strong>\u00a0\u00e0 l&rsquo;aide de UninstallString et d&rsquo;arguments personnalis\u00e9s, offrant ainsi une approche rationalis\u00e9e de la gestion des suppressions de logiciels.<\/p>\n<h2>N\u00e9cessit\u00e9 d&rsquo;un script de d\u00e9sinstallation automatis\u00e9<\/h2>\n<p>La d\u00e9sinstallation de logiciels, en particulier dans les grandes entreprises, n&rsquo;est pas une t\u00e2che facile. Les professionnels de l&rsquo;informatique et les <a href=\"https:\/\/www.ninjaone.com\/fr\/quest-ce-quun-msp\" target=\"_blank\" rel=\"noopener\">fournisseurs de services g\u00e9r\u00e9s (MSP)<\/a> ont souvent affaire \u00e0 un ensemble vari\u00e9 d&rsquo;applications install\u00e9es sur diverses machines. Chaque application peut n\u00e9cessiter des commandes de d\u00e9sinstallation diff\u00e9rentes ou suivre des protocoles diff\u00e9rents.<\/p>\n<p>Le script que nous analysons est con\u00e7u pour g\u00e9rer ces nuances, en ajoutant automatiquement les arguments n\u00e9cessaires tels que \/qn \/norestart ou \/S, qui sont essentiels pour une d\u00e9sinstallation silencieuse et sans red\u00e9marrage. Cette automatisation est essentielle pour maintenir la coh\u00e9rence et l&rsquo;<a href=\"https:\/\/www.ninjaone.com\/fr\/efficacite\" target=\"_blank\" rel=\"noopener\">efficacit\u00e9<\/a> des environnements informatiques \u00e0 grande \u00e9chelle.<\/p>\n<h2>Le script\u00a0:<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">#Requires -Version 5.1\r\n\r\n&lt;#\r\n.SYNOPSIS\r\n    Uninstall an application using the UninstallString and custom arguments. This script will auto-add \/qn \/norestart or \/S arguments.\r\n\r\n    This script will only uninstall apps that follow typical uninstall patterns such as msiexec \/X{GUID} \/qn \/norestart.\r\n.DESCRIPTION\r\n    Uninstall an application using the UninstallString and custom arguments. This script will auto-add \/qn \/norestart or \/S arguments.\r\n\r\n    This script will only uninstall apps that follow typical uninstall patterns such as msiexec \/X{GUID} \/qn \/norestart.\r\n.EXAMPLE\r\n    -Name \"VLC media Player\"\r\n    \r\n    Beginning uninstall of VLC media player using MsiExec.exe \/X{9675011C-2395-4AD7-B1CC-92910F991F58} \/qn \/norestart...\r\n    Exit Code for VLC media player: 0\r\n    Successfully uninstalled your requested apps!\r\n\r\nPARAMETER: -Name \"ReplaceMeWithNameOfApp\"\r\n    Exact name of the application to uninstall, separated by commas. E.g., 'VLC media player, Everything 1.4.1.1024 (x64)'.\r\n\r\nPARAMETER: -Arguments \"\/SILENT, \/NOREBOOT\"\r\n    Additional arguments to use when uninstalling the app, separated by commas. E.g., '\/SILENT, \/NOREBOOT'.\r\n\r\nPARAMETER: -Reboot\r\n    Schedules a reboot for 1 minute after the uninstall process succeeds.\r\n\r\nPARAMETER: -Timeout \"ReplaceMeWithTheNumberOfMinutesToWait\"\r\n    Specify the amount of time in minutes to wait for the uninstall process to complete. \r\n    If the process exceeds this time, the script and uninstall process will be terminated.\r\n\r\n.NOTES\r\n    Minimum OS Architecture Supported: Windows 10, Windows Server 2016\r\n    Release Notes: Initial Release\r\n.COMPONENT\r\n    Misc\r\n#&gt;\r\n\r\n[CmdletBinding()]\r\nparam (\r\n    [Parameter()]\r\n    [String]$Name,\r\n    [Parameter()]\r\n    [String]$Arguments,\r\n    [Parameter()]\r\n    [switch]$Reboot = [System.Convert]::ToBoolean($env:reboot),\r\n    [Parameter()]\r\n    [int]$Timeout = 10\r\n)\r\n\r\nbegin {\r\n    # Replace parameters with dynamic script variables\r\n    if ($env:nameOfAppToUninstall -and $env:nameOfAppToUninstall -notlike \"null\") { $Name = $env:nameOfAppToUninstall }\r\n    if ($env:arguments -and $env:arguments -notlike \"null\") { $Arguments = $env:arguments }\r\n    if ($env:timeoutInMinutes -and $env:timeoutInMinutes -notlike \"null\") { $Timeout = $env:timeoutInMinutes }\r\n\r\n    # Check if application name is provided\r\n    if (-not $Name) {\r\n        Write-Host -Object \"[Error] No name given, please enter in the name of an app to uninstall!\"\r\n        exit 1\r\n    }\r\n\r\n    # Check if timeout is provided\r\n    if (-not $Timeout) {\r\n        Write-Host -Object \"[Error] No timeout given!\"\r\n        Write-Host -Object \"[Error] Please enter in a timeout that's greater than or equal to 1 minute or less than or equal to 60 minutes.\"\r\n        exit 1\r\n    }\r\n\r\n    # Validate the timeout is within the acceptable range\r\n    if ($Timeout -lt 1 -or $Timeout -gt 60) {\r\n        Write-Host -Object \"[Error] An invalid timeout was given of $Timeout minutes.\"\r\n        Write-Host -Object \"[Error] Please enter in a timeout that's greater than or equal to 1 minute or less than or equal to 60 minutes.\"\r\n        exit 1\r\n    }\r\n\r\n    # Create a list to hold application names after splitting\r\n    $AppNames = New-Object System.Collections.Generic.List[String]\r\n    $Name -split ',' | ForEach-Object {\r\n        $AppNames.Add($_.Trim())\r\n    }\r\n\r\n    # Function to check if the script is run with elevated permissions\r\n    function Test-IsElevated {\r\n        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()\r\n        $p = New-Object System.Security.Principal.WindowsPrincipal($id)\r\n        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)\r\n    }\r\n\r\n    # Get all users registry hive locations\r\n    function Get-UserHives {\r\n        param (\r\n            [Parameter()]\r\n            [ValidateSet('AzureAD', 'DomainAndLocal', 'All')]\r\n            [String]$Type = \"All\",\r\n            [Parameter()]\r\n            [String[]]$ExcludedUsers,\r\n            [Parameter()]\r\n            [switch]$IncludeDefault\r\n        )\r\n    \r\n        # User account SID's follow a particular pattern depending on if they're Azure AD, a Domain account, or a local \"workgroup\" account.\r\n        $Patterns = switch ($Type) {\r\n            \"AzureAD\" { \"S-1-12-1-(\\d+-?){4}$\" }\r\n            \"DomainAndLocal\" { \"S-1-5-21-(\\d+-?){4}$\" }\r\n            \"All\" { \"S-1-12-1-(\\d+-?){4}$\" ; \"S-1-5-21-(\\d+-?){4}$\" } \r\n        }\r\n    \r\n        # We'll need the NTUSER.DAT file to load each user's registry hive. So we grab it if their account SID matches the above pattern. \r\n        $UserProfiles = Foreach ($Pattern in $Patterns) { \r\n            Get-ItemProperty \"HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\*\" |\r\n                Where-Object { $_.PSChildName -match $Pattern } | \r\n                Select-Object @{Name = \"SID\"; Expression = { $_.PSChildName } },\r\n                @{Name = \"UserName\"; Expression = { \"$($_.ProfileImagePath | Split-Path -Leaf)\" } }, \r\n                @{Name = \"UserHive\"; Expression = { \"$($_.ProfileImagePath)\\NTuser.dat\" } }, \r\n                @{Name = \"Path\"; Expression = { $_.ProfileImagePath } }\r\n        }\r\n    \r\n        # There are some situations where grabbing the .Default user's info is needed.\r\n        switch ($IncludeDefault) {\r\n            $True {\r\n                $DefaultProfile = \"\" | Select-Object UserName, SID, UserHive, Path\r\n                $DefaultProfile.UserName = \"Default\"\r\n                $DefaultProfile.SID = \"DefaultProfile\"\r\n                $DefaultProfile.Userhive = \"$env:SystemDrive\\Users\\Default\\NTUSER.DAT\"\r\n                $DefaultProfile.Path = \"C:\\Users\\Default\"\r\n    \r\n                $DefaultProfile | Where-Object { $ExcludedUsers -notcontains $_.UserName }\r\n            }\r\n        }\r\n    \r\n        $UserProfiles | Where-Object { $ExcludedUsers -notcontains $_.UserName }\r\n    }\r\n\r\n    # Function to find the uninstallation key of an application\r\n    function Find-UninstallKey {\r\n        [CmdletBinding()]\r\n        param (\r\n            [Parameter(ValueFromPipeline = $True)]\r\n            [String]$DisplayName,\r\n            [Parameter()]\r\n            [Switch]$UninstallString\r\n        )\r\n        process {\r\n            $UninstallList = New-Object System.Collections.Generic.List[Object]\r\n\r\n            # Search for uninstall key in 32-bit registry location\r\n            $Result = Get-ChildItem \"Registry::HKEY_USERS\\*\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*\" | Get-ItemProperty | Where-Object { $_.DisplayName -match \"$([regex]::Escape($DisplayName))\" }\r\n            if ($Result) { $UninstallList.Add($Result) }\r\n\r\n            # Search for uninstall key in 32-bit user locations\r\n            $Result = Get-ChildItem HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Get-ItemProperty | Where-Object { $_.DisplayName -match \"$([regex]::Escape($DisplayName))\" }\r\n            if ($Result) { $UninstallList.Add($Result) }\r\n\r\n            # Search for uninstall key in 64-bit registry location\r\n            $Result = Get-ChildItem HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Get-ItemProperty | Where-Object { $_.DisplayName -match \"$([regex]::Escape($DisplayName))\" }\r\n            if ($Result) { $UninstallList.Add($Result) }\r\n\r\n            # Search for uninstall key in 64-bit user locations\r\n            $Result = Get-ChildItem \"Registry::HKEY_USERS\\*\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*\" | Get-ItemProperty | Where-Object { $_.DisplayName -match \"$([regex]::Escape($DisplayName))\" }\r\n            if ($Result) { $UninstallList.Add($Result) }\r\n    \r\n            # Optionally return the DisplayName and UninstallString\r\n            if ($UninstallString) {\r\n                $UninstallList | ForEach-Object { $_ | Select-Object DisplayName, UninstallString -ErrorAction SilentlyContinue }\r\n            }\r\n            else {\r\n                $UninstallList\r\n            }\r\n        }\r\n    }\r\n\r\n    # Initialize the exit code variable\r\n    $ExitCode = 0\r\n}\r\nprocess {\r\n    # Check for administrative privileges\r\n    if (-not (Test-IsElevated)) {\r\n        Write-Host -Object \"[Error] Access Denied. Please run with Administrator privileges.\"\r\n        exit 1\r\n    }\r\n\r\n    # Load unloaded profiles\r\n    $UserProfiles = Get-UserHives -Type \"All\"\r\n    $ProfileWasLoaded = New-Object System.Collections.Generic.List[string]\r\n\r\n    # Loop through each profile on the machine.\r\n    Foreach ($UserProfile in $UserProfiles) {\r\n        # Load user's NTUSER.DAT if it's not already loaded.\r\n        If ((Test-Path Registry::HKEY_USERS\\$($UserProfile.SID)) -eq $false) {\r\n            Start-Process -FilePath \"cmd.exe\" -ArgumentList \"\/C reg.exe LOAD HKU\\$($UserProfile.SID) `\"$($UserProfile.UserHive)`\"\" -Wait -WindowStyle Hidden\r\n            $ProfileWasLoaded.Add(\"$($UserProfile.SID)\")\r\n        }\r\n    }\r\n\r\n    # Retrieve similar applications based on names provided\r\n    $SimilarAppsToName = $AppNames | ForEach-Object { Find-UninstallKey -DisplayName $_ -UninstallString }\r\n    if (-not $SimilarAppsToName) {\r\n        Write-Host \"[Error] The requested app(s) was not found and none were found that are similar!\"\r\n        exit 1\r\n    }\r\n\r\n    # Unload all hives that were loaded for this script.\r\n    ForEach ($UserHive in $ProfileWasLoaded) {\r\n        If ($ProfileWasLoaded -eq $false) {\r\n            [gc]::Collect()\r\n            Start-Sleep 1\r\n            Start-Process -FilePath \"cmd.exe\" -ArgumentList \"\/C reg.exe UNLOAD HKU\\$($UserHive)\" -Wait -WindowStyle Hidden | Out-Null\r\n        }\r\n    }\r\n\r\n    # Create a list to store apps that are confirmed for uninstallation\r\n    $AppsToUninstall = New-Object System.Collections.Generic.List[Object]\r\n    $SimilarAppsToName | ForEach-Object {\r\n        foreach ($AppName in $AppNames) {\r\n            if ($AppName -eq $_.DisplayName) {\r\n                # A matching app has been found\r\n                $ExactMatch = $True\r\n    \r\n                if ($_.UninstallString) {\r\n                    # Uninstall string is available\r\n                    $UninstallStringFound = $True\r\n                    # Add app to uninstall list\r\n                    $AppsToUninstall.Add($_)\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    # Check if any exact matches were found\r\n    if (-not $ExactMatch) {\r\n        Write-Host \"[Error] Your requested apps were not found. Please see the below list and try again.\"\r\n        $SimilarAppsToName | Format-Table DisplayName | Out-String | Write-Host\r\n        exit 1\r\n    }\r\n\r\n    # Check if uninstall strings were found for the apps\r\n    if (-not $UninstallStringFound) {\r\n        Write-Host \"[Error] No uninstall string found for any of your requested apps!\"\r\n        exit 1\r\n    }\r\n\r\n    # Check if there are apps without uninstall strings or not found at all\r\n    $AppNames | ForEach-Object {\r\n        if ($AppsToUninstall.DisplayName -notcontains $_) {\r\n            Write-Host \"[Error] Either the uninstall string was not present or the app itself was not found for one of your selected apps! See the below list of similar apps and try again.\"\r\n            $SimilarAppsToName | Format-Table DisplayName | Out-String | Write-Host\r\n            $ExitCode = 1\r\n        }\r\n    }\r\n\r\n    # Convert timeout from minutes to seconds\r\n    $TimeoutInSeconds = $Timeout * 60\r\n    $StartTime = Get-Date\r\n\r\n    # Process each app to uninstall\r\n    $AppsToUninstall | ForEach-Object {\r\n        $AdditionalArguments = New-Object System.Collections.Generic.List[String]\r\n\r\n        # If the uninstall string contains msiexec that's what our executable will be.\r\n        if($_.UninstallString -match \"msiexec\"){\r\n            $Executable = \"msiexec.exe\"\r\n        }\r\n\r\n        # If it contains a filepath we'll use that as our executable.\r\n        if($_.UninstallString -notmatch \"msiexec\" -and $_.UninstallString -match '[a-zA-Z]:\\\\(?:[^\\\\\\\/:*?\"&lt;&gt;|\\r\\n]+\\\\)*[^\\\\\\\/:*?\"&lt;&gt;|\\r\\n]*'){\r\n            $Executable = $Matches[0]\r\n        }\r\n\r\n        # Confirm we have an executable.\r\n        if(-not $Executable){\r\n            Write-Host -Object \"[Error] Unable to find uninstall executable!\"\r\n            exit 1\r\n        }\r\n\r\n        # Split uninstall string into executable and possible arguments\r\n        $PossibleArguments = $_.UninstallString -split ' ' | ForEach-Object { $_.Trim() } | Where-Object { $_ -match \"^\/\"}\r\n\r\n        # Decide executable and additional arguments based on uninstall string analysis\r\n        $i = 0\r\n        foreach ($PossibleArgument in $PossibleArguments) {\r\n            if (-not ($PossibleArgument -match \"^\/I{\") -and $PossibleArgument) {\r\n                $AdditionalArguments.Add($PossibleArgument)\r\n            }\r\n\r\n            if ($PossibleArgument -match \"^\/I{\") {\r\n                $AdditionalArguments.Add(\"$($PossibleArgument -replace '\/I', '\/X')\")\r\n            }\r\n\r\n            $i++\r\n        }\r\n\r\n        # Add custom arguments from the user\r\n        if ($Arguments) {\r\n            $Arguments.Split(',') | ForEach-Object {\r\n                $AdditionalArguments.Add($_.Trim())\r\n            }\r\n        }\r\n\r\n        # Add the usual silent uninstall arguments if not present\r\n        if($Executable -match \"Msiexec\"){\r\n            if($AdditionalArguments -notcontains \"\/qn\"){\r\n                $AdditionalArguments.Add(\"\/qn\")\r\n            }\r\n\r\n            if($AdditionalArguments -notcontains \"\/norestart\"){\r\n                $AdditionalArguments.Add(\"\/norestart\")\r\n            }\r\n        }elseif($Executable -match \"\\.exe\"){\r\n            if($AdditionalArguments -notcontains \"\/S\"){\r\n                $AdditionalArguments.Add(\"\/S\")\r\n            }\r\n\r\n            if($AdditionalArguments -notcontains \"\/norestart\"){\r\n                $AdditionalArguments.Add(\"\/norestart\")\r\n            }\r\n        }\r\n\r\n        # Verify that executable for uninstallation is found\r\n        if (-not $Executable) {\r\n            Write-Host \"[Error] Could not find the executable from the uninstall string!\"\r\n            exit 1\r\n        }\r\n\r\n        # Start the uninstallation process\r\n        Write-Host -Object \"Beginning uninstall of $($_.DisplayName) using $Executable $AdditionalArguments...\"\r\n        try{\r\n            if ($AdditionalArguments) {\r\n                $Uninstall = Start-Process $Executable -ArgumentList $AdditionalArguments -NoNewWindow -PassThru\r\n            }\r\n            else {\r\n                $Uninstall = Start-Process $Executable -NoNewWindow -PassThru\r\n            }\r\n        }catch{\r\n            Write-Host \"[Error] $($_.Exception.Message)\"\r\n            return\r\n        }\r\n\r\n        # Calculate the remaining time for the uninstall process and enforce timeout\r\n        $TimeElapsed = (Get-Date) - $StartTime\r\n        $RemainingTime = $TimeoutInSeconds - $TimeElapsed.TotalSeconds\r\n\r\n        # Wait for the uninstall process to complete within the remaining time\r\n        try {\r\n            $Uninstall | Wait-Process -Timeout $RemainingTime -ErrorAction Stop\r\n        }\r\n        catch {\r\n            Write-Host -Object \"[Alert] The uninstall process for $($_.DisplayName) has exceeded the specified timeout of $Timeout minutes.\"\r\n            Write-Host -Object \"[Alert] The script is now terminating.\"\r\n            $Uninstall | Stop-Process -Force\r\n            $ExitCode = 1\r\n        }\r\n\r\n        # Check and report the exit code of the uninstallation process\r\n        Write-Host -Object \"Exit code for $($_.DisplayName): $($Uninstall.ExitCode)\"\r\n        if ($Uninstall.ExitCode -ne 0) {\r\n            Write-Host -Object \"[Error] Exit code does not indicate success!\"\r\n            $ExitCode = 1\r\n        }\r\n    }\r\n\r\n    # Pause for 30 seconds before final checks\r\n    Start-Sleep -Seconds 30\r\n\r\n    $UserProfiles = Get-UserHives -Type \"All\"\r\n    $ProfileWasLoaded = New-Object System.Collections.Generic.List[string]\r\n\r\n    # Loop through each profile on the machine.\r\n    Foreach ($UserProfile in $UserProfiles) {\r\n        # Load user's NTUSER.DAT if it's not already loaded.\r\n        If ((Test-Path Registry::HKEY_USERS\\$($UserProfile.SID)) -eq $false) {\r\n            Start-Process -FilePath \"cmd.exe\" -ArgumentList \"\/C reg.exe LOAD HKU\\$($UserProfile.SID) `\"$($UserProfile.UserHive)`\"\" -Wait -WindowStyle Hidden\r\n            $ProfileWasLoaded.Add(\"$($UserProfile.SID)\")\r\n        }\r\n    }\r\n\r\n    # Re-check for any remaining apps to confirm they were uninstalled\r\n    $SimilarAppsToName = $AppNames | ForEach-Object { Find-UninstallKey -DisplayName $_ }\r\n    $SimilarAppsToName | ForEach-Object {\r\n        foreach ($AppName in $AppNames) {\r\n            if ($_.DisplayName -eq $AppName) {\r\n                Write-Host -Object \"[Error] Failed to uninstall $($_.DisplayName).\"\r\n                $UninstallFailure = $True\r\n                $ExitCode = 1\r\n            }\r\n        }\r\n    }\r\n\r\n    # Unload all hives that were loaded for this script.\r\n    ForEach ($UserHive in $ProfileWasLoaded) {\r\n        If ($ProfileWasLoaded -eq $false) {\r\n            [gc]::Collect()\r\n            Start-Sleep 1\r\n            Start-Process -FilePath \"cmd.exe\" -ArgumentList \"\/C reg.exe UNLOAD HKU\\$($UserHive)\" -Wait -WindowStyle Hidden | Out-Null\r\n        }\r\n    }\r\n\r\n    # Confirm successful uninstallation if no failures detected\r\n    if (-not $UninstallFailure) {\r\n        Write-Host \"Successfully uninstalled your requested apps!\"\r\n    }\r\n\r\n    # Handle reboot if requested and there were no uninstall failures\r\n    if ($Reboot -and -not $UninstallFailure) {\r\n        Write-Host -Object \"[Alert] a reboot was requested. Scheduling restart for 60 seconds from now...\"\r\n        Start-Process shutdown.exe -ArgumentList \"\/r \/t 60\" -Wait -NoNewWindow\r\n    }\r\n\r\n    # Exit script with the final exit code\r\n    exit $ExitCode\r\n}\r\nend {\r\n    \r\n    \r\n    \r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n\n<div class=\"blog-cta-new blog-cta-style-1\"><div class=\"cta-left\"><h2><\/h2><p><\/p><\/div><div class=\"cta-right\"><a class=\"button\" href=\"\"><\/a><\/div><\/div>\n<h2>Comment fonctionne le script<\/h2>\n<p>Ce script est con\u00e7u pour d\u00e9sinstaller des applications sur la base de leur nom et g\u00e8re une vari\u00e9t\u00e9 de sc\u00e9narios qui peuvent survenir au cours du processus de d\u00e9sinstallation. Vous trouverez ci-dessous une description \u00e9tape par \u00e9tape du fonctionnement du script :<\/p>\n<h3>1. D\u00e9finition des param\u00e8tres et traitement des entr\u00e9es :<\/h3>\n<ul>\n<li>Le script commence par d\u00e9finir plusieurs param\u00e8tres, tels que -Name pour le nom de l&rsquo;application, -Arguments pour les arguments de d\u00e9sinstallation suppl\u00e9mentaires, -Reboot pour planifier un red\u00e9marrage et -Timeout pour sp\u00e9cifier la dur\u00e9e pendant laquelle le script doit attendre le processus de d\u00e9sinstallation.<\/li>\n<li>Le script v\u00e9rifie ensuite si ces param\u00e8tres sont fournis et les valide, en s&rsquo;assurant qu&rsquo;ils r\u00e9pondent \u00e0 des crit\u00e8res sp\u00e9cifiques, par exemple que la valeur du d\u00e9lai d&rsquo;attente est comprise entre 1 et 60 minutes.<\/li>\n<\/ul>\n<h3>2. Gestion des profils et des ruches d&rsquo;utilisateurs :<\/h3>\n<ul>\n<li>Il comprend une fonction permettant de charger et de g\u00e9rer les profils d&rsquo;utilisateur et les ruches de registre, n\u00e9cessaires pour acc\u00e9der aux cha\u00eenes de d\u00e9sinstallation de chaque application. Ceci est crucial car la d\u00e9sinstallation d&rsquo;une application n\u00e9cessite souvent d&rsquo;acc\u00e9der au registre pour localiser le chemin de d\u00e9sinstallation correct.<\/li>\n<\/ul>\n<h3>3. Identification des applications et r\u00e9cup\u00e9ration des cl\u00e9s de d\u00e9sinstallation :<\/h3>\n<ul>\n<li>Le script utilise une fonction appel\u00e9e Find-UninstallKey pour rechercher dans le registre la cl\u00e9 de d\u00e9sinstallation associ\u00e9e au nom de l&rsquo;application fourni. Cette op\u00e9ration s&rsquo;effectue \u00e0 diff\u00e9rents endroits du registre, \u00e0 la fois en 32 bits et en 64 bits, afin d&rsquo;assurer une couverture compl\u00e8te.<\/li>\n<\/ul>\n<h3>4. Processus de d\u00e9sinstallation :<\/h3>\n<ul>\n<li>Une fois la cha\u00eene de d\u00e9sinstallation identifi\u00e9e, le script la traite pour en extraire le chemin d&rsquo;acc\u00e8s \u00e0 l&rsquo;ex\u00e9cutable et les arguments n\u00e9cessaires \u00e0 la d\u00e9sinstallation.<\/li>\n<li>Il garantit que les arguments de d\u00e9sinstallation silencieuse n\u00e9cessaires tels que \/qn, \/norestart ou \/S sont ajout\u00e9s s&rsquo;ils ne sont pas d\u00e9j\u00e0 pr\u00e9sents. Cela garantit que la d\u00e9sinstallation est effectu\u00e9e sans interaction de l&rsquo;utilisateur et sans forcer le red\u00e9marrage du syst\u00e8me, sauf indication contraire.<\/li>\n<\/ul>\n<h3>5. Traitement des erreurs et contr\u00f4les finaux :<\/h3>\n<ul>\n<li>Le script comprend une gestion robuste des erreurs, garantissant que si quelque chose se passe mal pendant la d\u00e9sinstallation, l&rsquo;administrateur en est inform\u00e9 et le script se termine avec un code d&rsquo;erreur appropri\u00e9.<\/li>\n<li>Apr\u00e8s la d\u00e9sinstallation, le script v\u00e9rifie \u00e0 nouveau que l&rsquo;application a bien \u00e9t\u00e9 supprim\u00e9e, en s&rsquo;assurant qu&rsquo;aucun composant r\u00e9siduel n&rsquo;est laiss\u00e9 sur place.<\/li>\n<\/ul>\n<h2>Application dans le monde r\u00e9el: Une \u00e9tude de cas<\/h2>\n<p>Imaginons un sc\u00e9nario dans lequel un administrateur informatique doit d\u00e9sinstaller une version obsol\u00e8te de VLC Media Player sur 200 ordinateurs d&rsquo;une entreprise. Le faire manuellement prendrait \u00e9norm\u00e9ment de temps. Au lieu de cela, l&rsquo;administrateur pourrait d\u00e9ployer ce script PowerShell sur toutes les machines, en sp\u00e9cifiant \u00ab\u00a0VLC Media Player\u00a0\u00bb comme nom d&rsquo;application.<\/p>\n<p>Le script trouverait automatiquement la cha\u00eene de d\u00e9sinstallation appropri\u00e9e, ex\u00e9cuterait la d\u00e9sinstallation en silence et programmerait m\u00eame un red\u00e9marrage si n\u00e9cessaire. L&rsquo;ensemble du processus, qui aurait pu prendre des jours, est achev\u00e9 en quelques minutes.<\/p>\n<h2>Comparaison avec d&rsquo;autres m\u00e9thodes<\/h2>\n<p>Traditionnellement, les administrateurs peuvent utiliser le panneau de configuration ou un outil de d\u00e9sinstallation tiers pour supprimer des applications. Toutefois, ces m\u00e9thodes n\u00e9cessitent une intervention manuelle, ne sont pas extensibles et manquent souvent de souplesse pour ajouter des arguments personnalis\u00e9s ou g\u00e9rer efficacement les d\u00e9sinstallations silencieuses.<\/p>\n<p>Ce script, en revanche, offre une approche hautement automatis\u00e9e et personnalisable, permettant aux professionnels de l&rsquo;informatique de g\u00e9rer les d\u00e9sinstallations sur plusieurs machines de mani\u00e8re efficace et avec un minimum d&rsquo;intervention manuelle.<\/p>\n<h2>Questions fr\u00e9quemment pos\u00e9es<\/h2>\n<ol>\n<li><strong>Que se passe-t-il si le nom de l&rsquo;application n&rsquo;est pas trouv\u00e9 ?<\/strong>\u00a0Si le script ne trouve pas d&rsquo;application avec le nom exact fourni, il recherche des noms similaires et fournit une liste de correspondances possibles. Cela permet \u00e0 l&rsquo;administrateur d&rsquo;ajuster l&rsquo;entr\u00e9e et de r\u00e9essayer.<\/li>\n<li><strong>Le script peut-il g\u00e9rer plusieurs applications \u00e0 la fois ?<\/strong>\u00a0Oui, le param\u00e8tre -Name peut accepter une liste d&rsquo;applications s\u00e9par\u00e9es par des virgules, ce qui permet au script de d\u00e9sinstaller plusieurs applications en une seule fois.<\/li>\n<li><strong>Que se passe-t-il si le processus de d\u00e9sinstallation d\u00e9passe le d\u00e9lai d&rsquo;attente ?<\/strong>\u00a0Le script mettra fin au processus de d\u00e9sinstallation et sortira avec un code d&rsquo;erreur, garantissant ainsi qu&rsquo;aucun processus ne s&rsquo;ex\u00e9cute ind\u00e9finiment.<\/li>\n<\/ol>\n<h2>Implications pour la s\u00e9curit\u00e9 et la gestion des technologies de l&rsquo;information<\/h2>\n<p>L&rsquo;automatisation du processus de d\u00e9sinstallation \u00e0 l&rsquo;aide de scripts de ce type a des implications importantes pour la <a href=\"https:\/\/www.ninjaone.com\/fr\/blog\/check-list-de-securite-informatique-pour-proteger-votre-entreprise\/\" target=\"_blank\" rel=\"noopener\">s\u00e9curit\u00e9<\/a> et la gestion <a href=\"https:\/\/www.ninjaone.com\/fr\/blog\/check-list-de-securite-informatique-pour-proteger-votre-entreprise\/\" target=\"_blank\" rel=\"noopener\">informatiques<\/a>. En s&rsquo;assurant que les logiciels obsol\u00e8tes ou vuln\u00e9rables sont supprim\u00e9s rapidement et de mani\u00e8re coh\u00e9rente sur toutes les machines, les entreprises peuvent r\u00e9duire le risque de <a href=\"https:\/\/www.ninjaone.com\/fr\/it-hub\/endpoint-security\/qu-est-ce-qu-une-fuite-de-donnees\" target=\"_blank\" rel=\"noopener\">failles de s\u00e9curit\u00e9<\/a>. En outre, l&rsquo;automatisation <a href=\"https:\/\/www.ninjaone.com\/blog\/how-human-error-relates-to-cybersecurity-risks\/\" target=\"_blank\" rel=\"noopener\">r\u00e9duit les erreurs humaines<\/a>, garantissant qu&rsquo;aucune application n&rsquo;est d\u00e9sinstall\u00e9e par inadvertance.<\/p>\n<h2>Meilleures pratiques pour l&rsquo;utilisation de ce script<\/h2>\n<ul>\n<li><strong>Toujours tester dans un environnement contr\u00f4l\u00e9 :<\/strong>\u00a0Avant de d\u00e9ployer le script sur plusieurs machines, testez-le dans un environnement contr\u00f4l\u00e9 pour vous assurer qu&rsquo;il fonctionne comme pr\u00e9vu.<\/li>\n<li><strong>Conserver les journaux :<\/strong>\u00a0Conserver les journaux des processus de d\u00e9sinstallation \u00e0 des fins d&rsquo;audit et de d\u00e9pannage.<\/li>\n<li><strong>Sauvegarde avant d\u00e9sinstallation :<\/strong>\u00a0Assurez-vous que les donn\u00e9es importantes sont sauvegard\u00e9es avant d&rsquo;ex\u00e9cuter les scripts de d\u00e9sinstallation, en particulier pour les applications susceptibles de stocker des donn\u00e9es localement.<\/li>\n<li><strong>Mettez r\u00e9guli\u00e8rement le script \u00e0 jour :<\/strong>\u00a0Au fur et \u00e0 mesure de la sortie de nouvelles applications et mises \u00e0 jour, mettez le script \u00e0 jour pour g\u00e9rer les nouvelles cha\u00eenes et m\u00e9thodes de d\u00e9sinstallation.<\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>Les scripts PowerShell tels que celui pr\u00e9sent\u00e9 ici sont des outils indispensables pour les professionnels de l&rsquo;informatique qui g\u00e8rent de grands r\u00e9seaux. En automatisant la d\u00e9sinstallation des applications, ils gagnent du temps, r\u00e9duisent les erreurs et renforcent la s\u00e9curit\u00e9. <a href=\"https:\/\/www.ninjaone.com\/fr\/\" target=\"_blank\" rel=\"noopener\">NinjaOne<\/a> peut compl\u00e9ter ces scripts avec ses outils de gestion informatique complets, fournissant des <a href=\"https:\/\/www.ninjaone.com\/fr\/blog\/tout-ce-que-vous-devez-savoir-sur-lautomatisation\/\" target=\"_blank\" rel=\"noopener\">couches suppl\u00e9mentaires d&rsquo;automatisation<\/a>, de surveillance et de contr\u00f4le, garantissant que votre infrastructure informatique reste robuste, <a href=\"https:\/\/www.ninjaone.com\/fr\/top-5-des-principes-fondamentaux-de-securite-informatique\/\" target=\"_blank\" rel=\"noopener\">s\u00e9curis\u00e9e<\/a> et \u00e0 jour.<\/p>\n","protected":false},"author":35,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"_acf_changed":false,"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_lmt_disableupdate":"","_lmt_disable":""},"operating_system":[4212],"use_cases":[4281],"class_list":["post-353674","script_hub","type-script_hub","status-publish","hentry","script_hub_category-windows"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/script_hub\/353674","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/script_hub"}],"about":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/types\/script_hub"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/comments?post=353674"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/media?parent=353674"}],"wp:term":[{"taxonomy":"script_hub_category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/operating_system?post=353674"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/use_cases?post=353674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}