Вопрос или проблема
Сначала немного предыстории:
Я работаю над подготовкой около 20 ноутбуков для образовательной программы в тюрьме. Эта обстановка имеет некоторые… особые вызовы. Один из них заключается в том, что студентам (узникам) не разрешается ни при каких обстоятельствах иметь доступ к электронным письмам или электронным сообщениям.
Это означает, что они не могут иметь учетные записи Microsoft и не будут иметь доступа к домену AD или Entra Identity; только локальные учетные записи подойдут (и вопрос о том, как убрать уведомления по поводу учетной записи MS, будет отдельным вопросом), а управление групповыми политиками/системным центром/intune/другими MDM не рассматриваться.
Это также означает, что у них не может быть OneDrive на компьютере. Если студент случайно откроет OneDrive и подключится к нему, он сможет создать общую папку для кого-то за пределами тюрьмы и обмениваться сообщениями, помещая текстовые файлы.
Да, нам действительно нужно быть настолько осторожными, и узнавать задним числом, что мы не сделали это правильно, влечет за собой такие наказания, о которых я не хочу даже думать.
Кроме того, неважно, что служба OneDrive будет заблокирована в тюремной сети. Машины будут проверены перед передачей, и, насколько я понимаю, по разговору с другими организациями, обнаружение OneDrive приведет к провалу проверки.
Еще один аспект ситуации заключается в том, что на месте нет реальной технической поддержки. Согласно моему текущему пониманию (которое также может быть неверным), координатор образования в тюрьме получает локальную учетную запись администратора и подробные инструкции о том, как открыть управление компьютером и создать нового локального пользователя с отдельным паролем для каждого студента (который также известен координатору). Таким образом, мне нужно, чтобы это работало как стандартный опыт для новых пользователей.
Снова, у меня есть партия таких устройств, с потенциальной необходимостью добавить еще в будущем. Я знаю, что всегда начинаю с чистой установки Windows, и в данный момент они все одной и той же марки/модели. Но я также знаю, что маловероятно, что следующая партия будет такой же марки, так что я не могу рассчитывать на то, что системы будут выглядеть абсолютно одинаково. Это не единственное странное/дополнительное, что мне нужно сделать для этих машин, так что мне очень хотелось бы, чтобы это было запрограммировано, чтобы процесс был повторяемым.
Короче говоря (слишком поздно), я сильно мотивирован убедиться, что OneDrive действительно полностью удален с этих систем повторяемым образом; скорее всего, я даже буду запускать финальный скрипт ночью как запланированную задачу, чтобы защититься от случайной переустановки. Это действительно должно касаться всех пользователей, включая пользователей, которые еще не созданы, и это больше, чем просто обычное: “Ох, мне не нравится OneDrive, почему я должен с этим мириться?” нытье.
Пока у меня есть это:
# Убедитесь, что OneDrive позже не будет изменен на приложение Windows Store
Get-AppxPackage -AllUsers "*OneDrive*" | Remove-AppxPackage -AllUsers
# Но на самом деле OneDrive использует любое из пяти возможных местоположений:
# Windows\System, Windows\System32, Windows\SysWOW64, Program Files и Program Files (x86)
# Необходимо проверить все пять
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"
}
# Папки Program Files также имеют подпапку с номером версии, которая может меняться со временем
if (Test-path "C:\Program Files\Microsoft OneDrive") {
$folder = (get-childitem "C:\Program Files\Microsoft OneDrive").Name | ?{ $_ -match "^\d{2}.*" }
# может быть несколько папок. Только одна будет иметь программу удаления
$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}.*" }
# может быть несколько папок. Только одна будет иметь программу удаления
$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"
}
}
}
# Также посмотрите в WinSXS
$ods = get-childitem "C:\Windows\WinSxS\amd64_microsoft-windows-onedrive-setup*"
if ($ods) {
$path = "C:\Windows\WinSxS\$($ods.Name)\*.*"
# Не нужно удалять; просто удалите файлы. Но также необходимо сначала овладеть правами
takeown /F $path /A | Out-Null
icacls $path /grant Administrators:M | Out-Null
remove-item -path $path -force
}
Я включаю этот скрипт, чтобы показать, что уже сделано, и не потому, что мне нужна помощь с кодом (и именно поэтому я здесь на Super User, а не на Stack Overflow).
Кроме того, у меня есть возможность в другом месте в моем скрипте легко добавлять изменения в реестр профиля по умолчанию и локальную машину:
reg load HKU\default c:\users\default\ntuser.dat
reg import .\DefaultRegistryFixes.reg
reg unload HKU\default
В результате все, что в файле DefaultRegistryFixes.reg
, может ссылаться на HKEY_USERS\default
и будет записано в настройки реестра, предоставленные новым пользователям. В файле в настоящее время около 40 правок реестра. Пока там ничего не касается OneDrive, так как мне действительно нужно, чтобы OneDrive был полностью удален, а не просто отключен. Однако все, что я могу сделать здесь, чтобы также отключить OneDrive, будет хорошо, так как мне также нужно защититься от обновления системы, которое вернет OneDrive на компьютер, и если изменение реестра – единственный способ остановить его работу для нового пользователя, я готов к этому.
И теперь, наконец, моя проблема:
После всего этого я вижу, что OneDrive пропал из первоначальной учетной записи администратора, которую я использую для запуска скрипта. Но если я затем создаю нового локального пользователя и вхожу в систему, я вижу, что OneDrive работает в области уведомлений. Диспетчер задач показывает, что файл .exe находится в папке App Data этого пользователя (нового).
Что я упустил, что OneDrive все еще работает в системе, когда я добавляю нового пользователя, даже после удаления его из этих других мест? И как я могу окончательно избавиться от него раз и навсегда?
Теперь у меня все так, что я верю, что OneDrive полностью удален с помощью скрипта и файла реестра. Скрипт:
Write-Host "Удаление OneDrive"
# Сначала внесем изменения в реестр. Для этого нам нужно загрузить хранилище пользователя по умолчанию
reg load HKU\default c:\users\default\ntuser.dat
# Теперь, прежде чем импортировать изменения, ищем местоположение установщика OneDrive Personal (оно нам понадобится позже)
# Также KHU по умолчанию недоступен, так что проверьте это тоже
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"
}
# Импортируем наши изменения в реестр
# Это удаляет команду установки OneDrive снова из шаблона пользователя по умолчанию
reg import .\DefaultRegistryFixes.reg
reg unload HKU\default
# Закончено с реестром
# Убедитесь, что OneDrive позже не будет изменен на приложение Windows Store
Get-AppxPackage -AllUsers "*OneDrive*" | Remove-AppxPackage -AllUsers
# OneDrive установлен в одном или нескольких из пяти возможных местоположений:
# Windows\System, Windows\System32, Windows\SysWOW64, Program Files и Program Files (x86)
# Необходимо проверить все пять
# Сначала рассматриваем Windows местоположения
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"
}
# Затем папка Program Files.
# Эти местоположения также имеют подпапку с номером версии, которая может меняться со временем
# Поэтому нам нужны дополнительные шаги, чтобы найти эту папку
if (Test-path "C:\Program Files\Microsoft OneDrive") {
$folder = (get-childitem "C:\Program Files\Microsoft OneDrive").Name | ?{ $_ -match "^\d{2}.*" }
# может быть несколько папок. Только одна будет иметь программу удаления
$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}.*" }
# может быть несколько папок. Только одна будет иметь программу удаления
$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"
}
}
}
# Теперь посмотрите в WinSXS для резервной копии файла установки
$ods = get-childitem "C:\Windows\WinSxS\amd64_microsoft-windows-onedrive-setup*"
if ($ods) {
$path = "C:\Windows\WinSxS\$($ods.Name)\*.*"
# Не нужно удалять. Просто удалите файлы. Но также необходимо сначала овладеть правами
takeown /F $path /A | Out-Null
icacls $path /grant Administrators:M | Out-Null
remove-item -path $path -force | out-null
}
# И наконец очистим установочную программу, найденную ранее в реестре
if ($odp)
{
$odp = $odp.Replace(" /thfirstsetup", "") # удаление аргумента командной строки
takeown /F $odp /A | Out-Null
icacls $odp /grant Administrators:M | Out-Null
remove-item $odp | out-null
}
Файл реестра:
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"=-
Помните, что скрипт загрузил хранилище пользователя по умолчанию специально для того, чтобы этот .reg файл был эффективным.
Это успешно удаляет OneDrive из системы, и я больше не вижу его работы после создания нового пользователя.
Но я не закончил.
Я ожидаю, что приведенный выше скрипт будет эффективен в течение месяца или трех, но затем обновление Windows в конечном итоге исправит установщик и значения по умолчанию в реестре. Это не даже Microsoft, которая слишком старается продвигать свои собственные продукты. Это просто естественный результат обслуживания платформы, когда она делает свою работу, либо после исправления CVE, либо когда новая версия становится доступной в рамках ежегодного обновления функций.
Таким образом, чтобы предотвратить возвращение OneDrive, этот код (и некоторые другие вещи) также будут включены как регулярная запланированная задача. Затем, когда OneDrive в конечном итоге вернется, его просто удалят снова. Это должно остановить его появление для новых пользователей, что является более редким событием. Я также рассматриваю дополнительные изменения в реестре, которые могу использовать, чтобы сделать его менее агрессивным в течение потенциального периода до одного дня, когда он может существовать в системе, чтобы он не оказывался установленным в папке AppData пользователя.
Кроме того, я рассматриваю возможность изменения кода скрипта, чтобы записывать временные файлы поверх существующих файлов OneDriveSetup.exe с настраиваемыми списками контроля доступа, которые не допускают запись для прав SYSTEM или TRUSTED INSTALLER. Но меня беспокоит, что это может привести к сбоям и вынудить откат для более крупных обновлений, оставляя системы в небезопасном состоянии, поэтому это не входит в текущий план.
Наконец, мы также можем внести ручные изменения в политику безопасности на каждой системе, чтобы заблокировать установщики от запуска. Но поскольку я не видел способа сделать это скриптируемым/повторяемым, я оставляю это как последний ресурс.
Ответ или решение
Полное и окончательное удаление OneDrive для всех пользователей Windows 11 с помощью PowerShell
Введение
Ваша задача требует тщательной проработки вопросов безопасности и администрирования при подготовке ноутбуков для образовательной программы в учреждении с особыми условиями. Полное удаление OneDrive является критически важным аспектом, чтобы обеспечить, что пользователи не смогут обмениваться сообщениями или файлами с внешним миром. Для этой цели требуется решение, которое эффективно удаляет OneDrive и исключает его возможность повторной установки в будущем.
Обзор
OneDrive может быть установлен в нескольких местах на системе, и просто его удаление из одного местоположения не гарантирует полное удаление. Поэтому необходимо подойти к этому вопросу комплексно. Ниже представлен скрипт PowerShell, который поможет вам удалить OneDrive и предотвратить его повторную установку при создании новых пользователей.
Шаги по удалению OneDrive
- Регистровые изменения для установки по умолчанию:
Для того чтобы гарантировать, что новые учетные записи пользователей не будут получать OneDrive, необходимо внести изменения в реестр. Загружая хранилище по умолчанию, можно удалить любые команды, связанные с запуском OneDrive.
# Загрузка реестра пользователя по умолчанию
reg load HKU\default C:\Users\Default\NTUSER.DAT
# Удаление команд из запуска
Set-ItemProperty -Path "HKU:\default\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" -Name "OneDriveSetup" -Value $null
# Завершение работы с загрузкой реестра
reg unload HKU\default
- Удаление установленных компонентов OneDrive:
После внесения изменений в реестр, следующий шаг — это удаление всех возможных реализаций OneDrive на системе.
# Удаление OneDrive из всех возможных мест
$paths = @(
"C:\Windows\System\OneDriveSetup.exe",
"C:\Windows\System32\OneDriveSetup.exe",
"C:\Windows\SysWOW64\OneDriveSetup.exe",
"C:\Program Files\Microsoft OneDrive",
"C:\Program Files (x86)\Microsoft OneDrive"
)
foreach ($path in $paths) {
if (Test-Path $path) {
Start-Process -FilePath $path -ArgumentList "/uninstall", "/qn" -Wait
}
}
# Удаление из каталога WinSXS
Get-ChildItem "C:\Windows\WinSxS\amd64_microsoft-windows-onedrive-setup*" | ForEach-Object {
takeown /F $_.FullName /A
icacls $_.FullName /grant Administrators:M
Remove-Item $_.FullName -Recurse -Force
}
- Проверка установки OneDrive для новых учетных записей:
После удаления OneDrive, необходимо убедиться, что ни одна учетная запись не получит доступ к нему при создании.
Теперь стоит добавить эти команды в спокойный скрипт, который будет исполняться регулярно, чтобы гарантировать отсутствие OneDrive в системе.
Настройка регулярного выполнения скрипта
Вы можете создать задачу в планировщике Windows, чтобы ваш скрипт выполнялся каждые сутки, тем самым гарантируя, что любой случайный процесс, пытающийся установить OneDrive, будет немедленно удален.
$action = New-ScheduledTaskAction -Execute "Powershell.exe" -Argument "C:\Path\To\YourScript.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At "12:00PM"
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "RemoveOneDriveTask" -User "SYSTEM" -RunLevel Highest
Дополнительные рекомендации
-
Мониторинг обновлений Windows: Регулярно проверяйте, нет ли изменений, касающихся установки OneDrive в обновлениях Windows. С помощью этой проверки вы сможете предотвращать нежелательную переустановку OneDrive.
-
Использование дополнительных мер безопасности: Рассмотрите возможность создания пользовательских политик безопасности, которые блокируют выполнение инсталляторов OneDrive, позволяя тем самым более эффективно ограничить доступ к этому облачному сервису.
Заключение
Решение, представленное выше, обеспечивает полный контроль над удалением OneDrive в среде с особенными требованиями безопасности. Будьте готовы к любым обновлениям Windows, и ваш подход к созданию и выполнению скриптов поможет избежать ненужных последствий, сохраняя целостность системы.