У отца перестал работать скрипт из папки Документы, который запускается с помощью ярлыка на рабочем столе. Короткое расследование показало, что скрипта по заданному пути нет, потому что папка перенесена в OneDrive. Это был уже второй случай такого нежелательного переноса в облако папок Рабочий стол, Документы и Изображения в системе отца.
После публикации статьи в сферу переноса вошли еще две папки — Музыка и Видео. Текст статьи, скриншоты и видео это изменение не отражают, однако решение (скрипт) учитывает его.
Я уверен, что сами вы не попадетесь на удочку Microsoft. Но многие из нас поддерживают менее опытных пользователей – знакомых, друзей и родственников. Они-то и становятся жертвами агрессивного маркетинга компании. Сегодня я расскажу, как от него застраховаться.
[+] Сегодня в программе
Что приводит к переносу папок
Отец «ничего не нажимал», поэтому причина доподлинно неизвестна. Но понятно, что тем или иным способом пользователю подсовывают нужную кнопку, и остается только нажать. Это может идти в комплекте с другими навязчивыми предложениями. Например, из маркетинговых экранов перед входом в систему неопытному человеку выбраться вообще невозможно. (У отца я отключил это, но не стоит недооценивать Microsoft).
Винить тут надо не пользователей, а Microsoft за давление на них.
Например, перемещение личных папок в облако может подаваться в качестве резервного копирования под соусом защиты от шифровальщиков. Желтый значок в приложении «Безопасность Windows» служит для запугивания. Но от этого предупреждения хотя бы можно избавиться одним щелчком мыши.
Сама по себе идея с облачной страховкой нормальная, и она даже может достигать своей цели. Но бесплатное хранилище всего 5Гб. Поэтому реальная цель мероприятия – продажа подписки Microsoft 365.
OneDrive и так регулярно рекламирует M365 путем уведомлений. А если после переноса объем файлов превысит бесплатный лимит, подписка подается уже в качестве единственного выхода, чтобы нормально продолжать работу. Ведь иначе не получится синхронизировать новые файлы! Ошибка!
Синхронизация с облаком – это не резервное копирование!
Я неоднократно озвучивал этот тезис в различных дискуссиях и, возможно, где-то в публикациях. Хороший повод повторить его! Позиционируя OneDrive в качестве резервного копирования, Microsoft искажает картину. Даже историю файлов компания незаметно выводит из употребления в угоду облачному сервису.
OneDrive может служить в качестве бэкапа, но только при условии, что ни на каких устройствах не устанавливается клиент синхронизации.
Иначе удаление из облака влечет потерю локальных файлов (обратное тоже верно).
Без клиента вы можете загружать файлы в облако через веб-интерфейс. И тогда это будет похоже на резервную копию. С поправкой на то, что облачный провайдер (в данном случае – Microsoft) может в любой момент и без объяснения причин ограничить вам доступ к файлам и/или заблокировать учетную запись.
Как технически выполняется перенос
Если подлежащие переносу папки суммарно занимают больше места, чем может поместиться в облаке, автопилот не срабатывает (кнопка затенена).
В противном случае после запуска резервного копирования:
- В OneDrive создаются папки Desktop, Documents и Pictures. Названия зависят от локализации, поэтому при русском языке интерфейса будут папки Рабочий стол, Документы и Изображения.
- В созданные папки перемещаются файлы из одноименных папок в корне профиля.
- В разделе реестра
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\
для этих папок меняются пути с корня профиля на OneDrive.
В результате внешне ничего не меняется, разве что на значки файлов накладывается оверлей со статусом синхронизации.
В скобках замечу, что не исключено создание еще одного комплекта папок на другом языке. Например, в облаке OneDrive уже создан набор на русском языке, а из ОС подтягиваются английские папки. Это и/или какие-то еще факторы могут приводить к невообразимой путанице. Так, у отца фотографии переместились во вложения электронной почты!
Как отменить перенос
Учтите, что после выключения резервного копирования файлы не возвращаются на свои исходные места. Это сразу написано на экране…
… и подтверждается инспектированием содержимого папок.
Поэтому требуется два шага:
- В свойствах OneDrive – Параметры – Резервное копирование – Управление резервным копированием – Остановить резервное копирование (для каждой папки). Русский интерфейс отдельно доставляет.
- Вручную переместите файлы из папок в корне OneDrive в соответствующие папки в корне профиля. Затем опустевшие папки в OneDrive можно удалить.
- Проверьте пути к папкам в разделе реестра
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\
и восстановите правильные при необходимости. См. также https://support.microsoft.com/kb/2936105
Третий пункт — контрольный. В идеале прежние пути в разделе реестра User Shell Folders
восстанавливаются автоматически, хотя вместо %USERPROFILE%
там прописывается абсолютный путь. При тесте на чистой ВМ все прошло гладко. Однако в хорошо обжитой системе отца пути перепутались. Поэтому я советую вам заглянуть в реестр. Если пути по-прежнему ведут в локальную папку OneDrive (как на скриншоте редактора реестра выше), исправьте их на пути к папкам из пункта 2 и завершите сеанс для вступления изменений в силу.
Как предотвратить перенос
Настроек OneDrive для этого не предусмотрено. Групповая политика есть, но только для корпоративного OneDrive, см. ниже. Можно создать искусственный недостаток места разреженными файлами, но это обеспокоит пользователя.
Способ 1 — символическая ссылка
Этот способ точно работает во всех изданиях Windows. Решение мне подсказал сам OneDrive, когда я попробовал запустить бэкап на основном ноутбуке.
Автоматический перенос папки невозможен, если в ней есть символическая ссылка!
Я набросал скрипт PowerShell (скачайте ZIP, разблокируйте его, потом выполняйте от имени администратора). Он создает символическую ссылку на калькулятор и присваивает ей атрибуты «Скрытый» и «Системный», чтобы скрыть файл с глаз долой.
# Создание скрытых символических ссылок в пользовательских папках для препятствия их переносу в OneDrive # Запускать от имени администратора # https://www.outsidethebox.ms/21844 param( [string[]]$folders ) # проверка прав if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) { Write-Host "Insufficient privileges. Run this script as administrator." -ForegroundColor 'red' Exit } # создание ссылок в текущем аккаунте if (!$folders) { $folders = @('Desktop', 'MyDocuments', 'MyPictures', 'MyMusic', 'MyVideos') foreach ($folder in $folders) { # путь для ссылки с учетом определения пользовательских папок https://t.me/sterkin_ru/1372 $link = Join-Path -Path $([Environment]::GetFolderPath("$folder")) -ChildPath "\calc.exe" # создание символической ссылки на калькулятор New-Item -ItemType SymbolicLink -Path $link -Target "C:\Windows\System32\calc.exe" # скрытие ссылки путем назначения атрибутов "Скрытый" и "Системный" https://t.me/sterkin_ru/1359 Get-ChildItem -Path $link | ForEach-Object {$_.Attributes += 'Hidden'; $_.Attributes += 'System'} } } # создание ссылок в любых аккаунтах # пути к папкам передаются скрипту параметром -folders # .\create-symlinks.ps1 -folders 'C:\Users\Username\Desktop', 'C:\Users\Username\Pictures' else { foreach ($folder in $folders) { $link = Join-Path -Path $folder -ChildPath "\calc.exe" New-Item -ItemType SymbolicLink -Path $link -Target "C:\Windows\System32\calc.exe" Get-ChildItem -Path $link | ForEach-Object {$_.Attributes += 'Hidden'; $_.Attributes += 'System'} } } <# # удаление созданных ссылок (пример для текущего аккаунта) $folders = @('Desktop', 'MyDocuments', 'MyPictures', 'MyMusic', 'MyVideos') foreach ($folder in $folders) { $link = Join-Path -Path $([Environment]::GetFolderPath("$folder")) -ChildPath "\calc.exe" Remove-Item -Path $link -Force } #>
Запускать скрипт нужно от имени администратора. При этом:
- Только для текущего пользователя, обладающего полными правами, можно запускать скрипт без параметров. Ссылки создаются во всех трех папках.
- Для любых пользователей, в том числе без прав администратора, запускайте скрипт с параметром
-folders
и перечисляйте через запятую пути к папкам, в которых хотите создать ссылки.
Результат:
Скрипт простенький, но отмечу несколько моментов:
- Определение пути к пользовательским папкам методом
Environment.GetFolderPath
самое корректное с учетом их возможного перемещения, хотя он все равно смотрит в реестр. - Командлет Join-Path ранее не фигурировал в блоге, но недавно был его антипод Split-Path.
- 7 лет назад я рассказывал в блоге о добавлении в командлет New-Item опции создания ссылок NTFS. Повседневно я продолжаю пользоваться нативной командой mklink, но в скрипте органичнее смотрится командлет.
Способ 2 — групповая политика (корпоративный OneDrive)
Этот способ работает только с OneDrive организации.
Политику я сам не нашел, потому что искал только в XLSX, где не описан поставляемый с OneDrive шаблон. Но ее любезно подсказал в чате Александр Рыжов: Prevent users from moving their Windows known folders to OneDrive.
Предотвращение переноса добавляется в реестр одной командой:
reg add HKLM\SOFTWARE\Policies\Microsoft\OneDrive /v KFMBlockOptIn /t REG_DWORD /d 1 /f
Согласно описанию, это отключает предложение переместить папки в облако и блокирует функцию бэкапа в клиенте OneDrive.
Заключение
Мне нравится OneDrive в качестве сервиса, доставляющего единый набор файлов на все моих ПК. При этом я не считаю его надежным средством резервного копирования из-за двухсторонней синхронизации и отсутствия гарантий доступа к аккаунту. Но лучше уж хранить копии в облаке, чем не иметь никакого бэкапа, в том числе размещая файлы на другом разделе того же физического диска.
Однако решение пользователя по переводу файлов в облако должно быть не только осознанным, но и невынужденным. В данном случае Microsoft переступает тонкую грань, снижая уровень доверия к своим сервисам. Теперь вы знаете, как защитить от этого неопытных пользователей!
strafer
Мне как раз такое поведение напоминает модель работы собственно вирусов-шифровальщиков.
Lecron
Символическая ссылка может иметь название отличное от оригинального. Кмк, лучше ее создавать как «OneDrive_protection». Возможно без всяких меток hidden/system. Пусть названием напоминает о сучности Микрософта. И если через длительное время захочется защиту отключить, будет проще вспомнить, почему нет бекапа/синхронизации.
При написании скрипта не возникало желание указать параметром имя пользователя, которое автоматически развернется в пути до этих трех папок? Это, более удобно, чем прямое указание пути.
Vadim Sterkin
Это ваш выбор :)
Нет, потому что папки мб перенесены из профиля и еще 11 вещей, которые не придут в голову.