
У нас есть программа, которая из-за утечек памяти на некоторых экранах не завершается чисто, когда пользователь выходит. Проблема в том, что это блокирует обычную процедуру выхода из системы — вы выбираете выход из системы, и несколько процессов исчезают, но пользователь на самом деле не выходит из системы.
Поскольку я не могу исправить программу, я подумал, что буду использовать скрипт, запускаемый при выходе из системы, чтобы убить процесс. Я проверил, что скрипт убивает процесс, если я запускаю его двойным щелчком, и добавил скрипт в Параметры Windows -> Скрипты -> Выход из системы на моей машине в gpedit.
К сожалению, похоже, что скрипты выхода из системы не запускаются до тех пор, пока не будут завершены все процессы, поэтому они никогда не запускаются.
Есть ли способ заставить скрипты выхода из системы запускаться на более раннем этапе процесса? Или есть лучший подход к решению проблемы?
решение1
Вы пробовали установить параметр реестра HKEY_CURRENT_USER\Control Panel\Desktop AutoEndTasks на 1? Если это сработает, вам не понадобится этот скрипт.
решение2
Вы можете использовать программу для выхода из системы, напримерhttp://www.karenware.com/powertools/ptstopper.aspкоторый запускает скрипты перед выходом из системы.
решение3
добавьте это в конец вашего скрипта
Set strComputer = "."
Set OpSysSet = GetObject("winmgmts:{(Shutdown)}//" & strComputer & "/root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")
for each OpSys in OpSysSet
OpSys.Win32Shutdown 0
next
WScript.Quit(0)
попросите их использовать этот сценарий вместо обычного выхода из системы.
В настоящее время я не уверен, как заставить его запустить скрипт перед завершением процессов, но могу продолжить поиски, если это не сработает. Кроме того, у меня не было возможности протестировать, но это должен быть правильный синтаксис для команды. Дайте мне знать, если потребуются какие-то изменения.
решение4
Мне кажется забавным, что проблема в том, что пользователь никогда не выходит полностью из системы, когда выходит из нее, поэтому вы пишете скрипт, который говорит "убить этот процесс при выходе", но скрипт не может быть запущен, потому что пользователь никогда не выходит из системы. Вы хотите, чтобы скрипт запускался, когда пользователь нажимает "выйти из системы", а не когда пользователь полностью вышел из системы.
Я не очень хорошо разбираюсь в VBScript или даже в API Windows, которые отвечают за выход из системы, но я бы предложил один из следующих вариантов:
Выясните, есть ли отдельное событие/триггер, который выдается, когда пользователь выбирает «Выйти», и запустите свой скрипт в этот момент. Если это легче сказать, чем сделать, я извиняюсь, но это кажется наиболее очевидным способом получить то, что вы на самом деле имели в виду.
Выясните, есть ли процесс, который определенно завершается после того, как пользователь выбирает «Выйти» (
explorer.exe
возможно?). Это будет хорошей идеей только в том случае, если процесс, который вы пытаетесь завершить, не является критическим для системы или сеанса (или если процесс, к которому вы привязываете свой скрипт завершения, ЯВЛЯЕТСЯ критическим для системы), поскольку вы не хотите, чтобы скрипт завершал процесс просто потому, что пользователь закрыл что-то в трее.Я думаю, что идея иметь скрипт выхода из системы довольно хороша, но я бы предложил выяснить, можно ли заменить кнопку «выход из системы» в меню «Пуск» кнопкой, которая запускает этот скрипт. Я знаю, что видел что-то похожее в компьютерных лабораториях. Но если вы полагаетесь на то, что пользователи будут помнить о необходимости нажать пользовательскую кнопку «выход из системы» на рабочем столе, и они все равно смогут выйти из системы обычным способом, эта мышечная память только разочарует всех.