⚙️ О разделах реестра RunOnce и RunOnceEx, а также Run
RunOnce и RunOnceEx - очень и очень древние разделы реестра для однократного запуска команд при входе в систему. Другими словами, прописанные там команды удаляются после выполнения. Когда-то эти разделы были популярным способом установки программ и даже драйверов. Каждый раздел предусмотрен в HKLM и HKCU - всего четыре расположения. Однако из коробки в реестре имеется только RunOnce в HKLM.
Недавно волею случая я смотрел документацию и обнаружил пару любопытных статей: RunOnce Registry Key и KB2021405. Из первой следует, что поведение этих разделов изменилось еще в Windows Vista. Вторая была срочно опубликована в 2010 году, когда пропустившие Vista клиенты стали наступать на грабли в Windows 7 :)
❌ KB202140 несколько коряво гласит, что выполнение команд из этих разделов не работает в обычной учетной записи. Мол, так задумано. Действительно, если у пользователя нет прав администратора, логично улучшить UX и запретить ему напрочь эти команды... в HKLM! А в HKCU обычный пользователь обладает правами на запись. Зачем же лишать его возможности выполнять свои задачи однократно при входе?
👉 Я проверил работу обоих параметров при входе в систему на чистой Windows 11. Тестирование подтвердило мое предположение об HKCU и высветило две ошибки в статье:
1. RunOnce все-таки работает из HKCU обычного пользователя. Более того, клиент OneDrive с первого выпуска Windows 10 и по сей день использует этот раздел для самообслуживания 😎
2. RunOnceEx не работает в HKCU у администратора. Возможно, так было всегда, не помню уже.
Похоже, при публикации статьи MSKB не разобрались и причесали все варианты под одну гребенку. Но тогда неточность в документации перевела вполне рабочий сценарий в разряд неподдерживаемых решений 🤷♂️
Ладно, допустим, вам требуется однократно запускать команды в рамках официально поддерживаемого решения. Нет проблем - создайте параметры с запуском команд в разделе Run (myCommand1, myCommand2) и добавьте их удаление в конце своей команды или скрипта.
Remove-ItemProperty -Path "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" -Name *myCommand*
✌️