Сценарий выхода из Windows для изменения реестра в HKCU
Я пытаюсь изменить записи реестра в HKCU при выходе из системы. Соответствующий скрипт работает нормально при вызове вручную. Я боялся, что могут возникнуть проблемы с включением политики обратной связи, но, согласно rsop.msc, это не так, то есть сценарий должен быть выполнен. Однако желаемого эффекта в реестре не будет при следующем входе в систему.
Есть ли общая проблема просто потому, что скрипт запускается "слишком поздно"? Если так, что можно сделать? Что еще это может быть?
РЕДАКТИРОВАТЬ: я должен был указать, что мой logoff.vbs
Сценарий выглядит (минимизировано):
const HKCU = &H80000001
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
' ...
oReg.SetStringValue HKCU,"SOFTWARE\Foo","Bar", "Baz"
3 ответа
На самом деле были две проблемы.
Во-первых, при наличии политики обратной петли следует быть осторожным с rsop.msc, поскольку простое использование значения по умолчанию (т. Е. Отметка "перейти на последнюю страницу мастера без сбора дополнительных данных" сразу после выбора контейнеров пользователя и компьютера) может не отражать истинные результаты политики. Чтобы получить реалистичные результаты, нужно хотя бы поставить галочку на второй странице (и заменить или объединить). Осторожность помогает правильно диагностировать, будет ли скрипт выполняться при выходе из системы.
Во-вторых, SetStringValue
создает значения, если они не существуют ранее, но не создают несуществующие ключи. Следовательно,
oReg.CreateKey HKCU,"SOFTWARE\Foo"
должен быть выдан в сценарии (для записи, CreateKey
создает рекурсивные несуществующие ключи, но, конечно, "HKCU\SOFTWARE" уже существует).
Я использую сценарии выхода из системы довольно часто. Реестр пользователя по-прежнему загружается при запуске сценария, и в его реестр можно вносить изменения. Сценарии выхода выполняются синхронно, по замыслу. У меня есть сценарии выхода из системы, которые считываются из реестра пользователя, но мне никогда не приходилось писать. Несмотря на это, я ожидаю, что это будет работать нормально.
Я взял приведенный выше фрагмент кода, поместил его в файл и назначил его в качестве сценария выхода из системы в локальной групповой политике на виртуальной машине Windows XP с пакетом обновления 3 (SP3) и получил желаемый результат. Я поставил HKCU\Software\Foo\Bar
равно xxx
, вышли из системы, снова вошли в систему и обнаружили, что значение было изменено на Baz
, как и ожидалось.
Я думаю, что у вас есть другая проблема, кроме выполнения скрипта. Я добавил MsgBox
вызовите код, чтобы я мог "увидеть" код, выполняющийся при выходе из системы. Добавление MsdBox не изменило поведение, связанное с реестром, но дало мне визуальную индикацию того, что код работал (и отложенный выход из системы, пока я не закрыл диалоговое окно).
(Я могу пойти и протестировать Windows 7, если хотите, но я не ожидаю никаких изменений в функциональности.)
Я полагаю, вы используете reg.exe
для изменения записей реестра. Проблема в том, что reg.exe
выполняется в отдельном процессе, а сценарий выхода из системы ожидает только завершения самого себя. Поэтому вполне вероятно, что куст реестра выгружается до того, как редактирование завершено.
Я думаю, что вы можете решить эту проблему, используя две строки WScript, как в следующем примере:
Set objShell = CreateObject("WScript.Shell")
objShell.Run "REG ADD HKCU\key ...",,true
Третий параметр objShell.Run
, называется bWaitOnReturn
, сообщает сценарию дождаться завершения внешнего процесса, прежде чем продолжить выполнение.