<p>J’ai maintenant les choses en place pour que je pense qu’OneDrive est entièrement supprimé à l’aide d’un script et d’un fichier reg. Le script :</p>
<pre><code class="lang-auto">Write-Host "Removing OneDrive"
First make our registry tweaks. To do this, we need the default user's hive loaded
reg load HKU\default c:\users\default\ntuser.dat
Now, before importing changes, look for the OneDrive Personal installer location (we'll need it later)
Also, KHU isn't available by default, so check that, too
if ((Get-PSDrive -PSProvider Registry).Name -notcontains 'HKU') {
New-PSDrive HKU Registry HKEY_USERS | Out-Null
$removeHKU = $true
}
$odp = (Get-ItemProperty -path 'HKU:\default\SOFTWARE\Microsoft\Windows\CurrentVersion\Run').OneDriveSetup
if ($removeHKU) {
Remove-PSDrive -Name "HKU"
}
Import our registry changes
This removes the command to install OneDrive again from the default user template
reg import .\DefaultRegistryFixes.reg
reg unload HKU\default
Done with registry
Make sure OneDrive isn't later changed to be a Windows Store app
Get-AppxPackage -AllUsers "OneDrive" | Remove-AppxPackage -AllUsers
OneDrive is installed in one or more of five possible locations:
Windows\System, Windows\System32, Windows\SysWOW64, Program Files, and Program Files (x86)
Need to check all five
First, the Windows locations
if (Test-Path "C:\Windows\System\OneDriveSetup.exe") {
start -wait -filepath "C:\Windows\System\OneDriveSetup.exe" -argumentlist "/uninstall","/qn"
}
if (Test-Path "C:\Windows\System32\OneDriveSetup.exe") {
start -wait -filepath "C:\Windows\System32\OneDriveSetup.exe" -argumentlist "/uninstall","/qn"
}
if (Test-Path "C:\Windows\SysWOW64\OneDriveSetup.exe") {
start -wait -filepath "C:\Windows\SysWOW64\OneDriveSetup.exe" -argumentlist "/uninstall","/qn"
}
Then Program Files.
These locations also have a version number subfolder that may change over time
So we need extra steps to find that folder
if (Test-path "C:\Program Files\Microsoft OneDrive") {
$folder = (get-childitem "C:\Program Files\Microsoft OneDrive").Name | ?{ $_ -match "\d{2}.*" }
can be several folders. Only one will have the uninstaller
$folder | % {
if (Test-Path "C:\Program Files\Microsoft OneDrive\$\OneDriveSetup.exe") {
$path = "C:\Program Files\Microsoft OneDrive\$\OneDriveSetup.exe"
start -wait -filepath $path -argumentlist "/uninstall","/qn"
}
}
}
if (Test-path "C:\Program Files (x86)\Microsoft OneDrive") {
$folder = (get-childitem "C:\Program Files (x86)\Microsoft OneDrive").Name | ?{ $_ -match "\d{2}.*" }
can be several folders. Only one will have the uninstaller
$folder | % {
if (Test-Path "C:\Program Files (x86)\Microsoft OneDrive\$\OneDriveSetup.exe") {
$path = "C:\Program Files (x86)\Microsoft OneDrive\$\OneDriveSetup.exe"
start -wait -filepath $path -argumentlist "/uninstall","/qn"
}
}
}
Now look in WinSXS for the setup file backup
$ods = get-childitem "C:\Windows\WinSxS\amd64_microsoft-windows-onedrive-setup"
if ($ods) {
$path = "C:\Windows\WinSxS\$($ods.Name)*."
Don't need to uninstall. Just remove the files. But also need to take ownership first
takeown /F $path /A | Out-Null
icacls $path /grant Administrators:M | Out-Null
remove-item -path $path -force | out-null
}
And finally clean up installer program found earlier in the registry
if ($odp)
{
$odp = $odp.Replace(" /thfirstsetup", "") # remove command line argument
takeown /F $odp /A | Out-Null
icacls $odp /grant Administrators:M | Out-Null
remove-item $odp | out-null
}
</code></pre>
<p>Le fichier de registre :</p>
<pre><code class="lang-auto">Windows Registry Editor Version 5.00
[HKEY_USERS\default\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"OneDriveSetup"=-
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"OneDriveSetup"=-
"OneDrive"=-
</code></pre>
<p>N’oubliez pas que le script a chargé la ruche de l’utilisateur par défaut spécialement pour que ce fichier .reg soit efficace.</p>
<p>Cela supprime avec succès OneDrive d’un système <strong>neuf</strong>, et je ne le vois plus en cours d’exécution après la création d’un nouvel utilisateur. S’il y a d’autres utilisateurs déjà créés sur le système, un travail supplémentaire sera nécessaire. Mais ce n’est pas ma situation actuelle.</p>
<p><em><strong>Mais je n’ai pas terminé.</strong></em></p>
<p>Je m’attends à ce que le script ci-dessus soit efficace pendant un à trois mois, mais ensuite une mise à jour Windows finira par corriger l’installateur et le registre par défaut. Ce n’est même pas Microsoft qui essaie trop de pousser ses propres produits. C’est simplement le résultat naturel de la plateforme de maintenance qui fait son travail, soit après la correction d’un CVE, soit lorsqu’une nouvelle version est disponible dans le cadre d’une mise à jour annuelle de fonctionnalités.</p>
<p>Donc, pour empêcher OneDrive de revenir, ce code (et d’autres choses) sera également inclus comme tâche planifiée récurrente. Ainsi, quand OneDrive reviendra, il sera simplement supprimé à nouveau. Cela devrait empêcher son apparition pour les nouveaux utilisateurs, ce qui est un événement plus rare. J’examine également des modifications de registre supplémentaires que je peux utiliser pour le rendre moins agressif pendant la période potentielle pouvant aller jusqu’à environ un jour où il pourrait exister sur un système, afin qu’il ne finisse pas installé dans le dossier AppData d’un utilisateur.</p>
<p>Comme autre mesure, j’envisage de modifier le code du script pour écrire des fichiers de remplacement par-dessus les fichiers OneDriveSetup.exe existants, avec des listes de contrôle d’accès personnalisées qui ne permettent pas l’accès en écriture aux principaux SYSTEM ou TRUSTED INSTALLER. Mais je crains que cela ne casse et force des restaurations pour les mises à jour plus importantes, laissant les systèmes dans un état non sécurisé, donc ce n’est pas dans le plan actuel.</p>
<p>Enfin, nous pourrions également apporter des modifications manuelles de politique de sécurité sur chaque système, pour bloquer l’exécution des installateurs. Mais comme je n’ai pas trouvé de moyen de rendre cela scriptable/reproductible, je le garde en dernier recours.</p>