Поделиться через


Конфиденциальная информация WindowsВ ожидании RunOnce

Рэймонд Чен (Raymond Chen)

ПРЕДСТАВИМ СЕБЕ установку, требующую перезапуска компьютера в середине процесса. Например, программе может потребоваться обновить системную DLL-библиотеку, используемую в данный момент. Для установки нового DLL-файла понадобится инициировать промежуточный перезапуск компьютера, чтобы затем использовать обновленную DLL-библиотеку на следующей стадии установки.

Раздел реестра RunOnce предназначен именно для этой цели — использование программами установки для завершения установки после промежуточной перезагрузки. (Это было в те времена, когда считалось, что программы не могут принести никакого вреда.)

Windows® Explorer ожидает завершения работы программы, указанной в разделе RunOnce, перед созданием рабочего стола и панели задач. Это сделано, исходя из предположения о том, что RunOnce используется программами установки. Программа, указанная в разделе RunOnce, может изменять данные конфигурации системы, а работа пользователя в системе в процессе изменения конфигурации нежелательна.

Пусть, например, программа из раздела RunOnce выполняет перемещение и компоновку только что установленных файлов, при этом некоторые из них являются частью расширения оболочки. Ясно, что попытки пользователя запустить программу или активировать расширение во время продолжающегося обновления исполняемого файла совершенно нежелательны.

Другой подводный камень подхода к использованию раздела RunOnce как раздела «для программ установки» заключается в том, что указанная в этом разделе программа будет запущена только при входе в систему пользователя с правами администратора. Таким образом, пользователи, не являющиеся администраторами, не смогут выполнить установку. Кроме того, если бы программы, указанные в разделе RunOnce, запускались для пользователей, не являющихся администраторами, это уже не было «один раз» и привело бы к серьезным затруднениям. Как можно уведомить систему о том, что данная программа уже была запущена и запускать ее снова не нужно? Для изменения этого глобального состояния системы необходимы административные привилегии. Очевидно, что пользователь, не являющийся администратором, не обладает такими привилегиями. Программа перестала бы быть «запускаемой один раз»; вместо этого она стала бы «запускаемой снова и снова до входа в систему администратора».

  (Щелкните изображение, чтобы увеличить его)

Раздел RunOnce, предназначенный для завершения установки программ, доступен самой программе установки Windows. При попытке установить пакет обновления или обновить операционную систему до новой версии Windows мастер установки проверяет значение раздела RunOnce. Если это значение не пустое, выдается сообщение об ошибке: «Обнаружена незавершенная установка программного обеспечения. Завершите установку перед обновлением операционной системы». Это справедливо, поскольку вряд ли кто-то захочет сменить операционную систему посреди установки программы.

Весь принцип работы раздела RunOnce выдает его прошлое. Этот раздел появился в Windows 95, операционной системе, не видящей разницы между администраторами и прочими пользователями. Поскольку в Windows 95 каждый пользователь фактически был администратором, программа установки, использующая раздел RunOnce, могла быть уверена в том, что действия, указанные в этом разделе, будут выполнены при следующей перезагрузке.

В более современных операционных системах Windows (особенно это касается Windows Vista™) возможна ситуация, когда за несколько месяцев в систему не войдет ни один пользователь с административными привилегиями. В результате программе, требующей выполнения RunOnce, придется ждать очень и очень долго.

В порядке отступления от темы: мне приходилось видеть «вечный RunOnce». Эта программа добавляла себя в раздел RunOnce при каждом запуске. Это явным образом противоречит предназначению раздела RunOnce, поскольку такие действия уже не являются частью установки программы, а являются частью ее обычной работы. Более того, такое поведение приводит к тому, что программа установки Windows всегда сообщает о наличии незавершенной установки.

Таким образом, пользователь никогда не сможет обновить операционную систему из-за того, что какая-то надоедливая программа постоянно говорит: «Я только хочу выполнить еще несколько мелких операций, и уж после этого обещаю закончить». Программа не завершит установку сегодня, но «завтра — обязательно». Это в чем-то напоминает ожидание Годо, впрочем, будем надеяться, все обойдется без экзистенциального кризиса.

**Рэймонд Чен (Raymond Chen)**ведет свой сайт The Old New Thing (хорошо забытое старое), на котором обсуждаются вопросы истории Windows и программирования в среде Win32. В настоящее время он работает над книгой, как бы по случайному совпадению названной "The Old New Thing" (издательство Addison-Wesley, 2007 г.).

© 2008 Корпорация Майкрософт и компания CMP Media, LLC. Все права защищены; полное или частичное воспроизведение без разрешения запрещено.