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