Как запустить мою программу перед выходом из системы в Windows XP?

Ищу инверсную версию "RunOnceEx".

RunOnceEx запускает некоторую программу до запуска оболочки пользователя (рабочего стола и панели задач). Процесс входа в систему не будет продолжен до завершения runonceex.

Я хочу сделать то же самое, но при выходе пользователя из системы. Когда он / она выходит из системы, все запущенные программы завершаются, покидает оболочку (рабочий стол и панель задач), затем «« Я хочу, чтобы моя программа была запущена в этот момент »», и наконец, выход.

Я думаю, что это возможно, потому что это делает "mobsync.exe". Но не могу найти, где и как это сделать.

Я просил «программируемый» способ - то есть я могу настроить его во время установки или опцию в приложении. Групповая политика хороша, но она просто не устраняет требования. Microsoft жестко кодирует "mobsync.exe"?

Dennis C 29.11.2009 17:14

Как сказал @VonC, просто добавьте несколько записей в реестр. как это сложно!

TFD 14.12.2009 01:28

Вы ищете решение на C / C++ или .NET? Кроме того, mobsync.exe - это программа Microsoft, которая, скорее всего, использует записи реестра, как и все ответы, от которых вы отказываетесь.

John Bellone 17.12.2009 20:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
3
17 944
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

нашел в первом результате в Google для меня

Чтобы выполнить программу, вы можете создать сценарий для ее запуска и использовать групповую политику для ее применения. В редакторе групповой политики перейдите в Конфигурация пользователя -> Параметры Windows -> Сценарии (Вход / Выход).

больше информации здесь

Поскольку я спрашиваю в stackoverflow, а не в Superuser, я ищу решения для программирования

Dennis C 16.12.2009 17:30

Предупреждение, как сказал здесь, gpedit.msc позволит вам настроить сценарий выхода для пользователей все.

Если вам нужен этот сценарий только для одного пользователя, вам нужно объявить его прямо в реестре, как в HKCU, так и в HKLM.

Вам нужна реализация GINA. Вы можете запускать свои собственные команды в функции WlxIsLogoffOk, которая вызывается, когда пользователь инициирует выход из системы.

Как только вы создадите правильную dll GINA, вы можете зарегистрировать ее здесь: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL

Вот реализация, которая может соответствовать вашим потребностям (она предоставляет ключ реестра для выхода из системы, в котором вы можете указать свою команду): http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html

+1, потому что это законный ответ, но я думаю, что реализация dll GINA для того, что этот человек хочет выполнить, является чрезмерным.

Christopher Tarquini 17.12.2009 08:23

Как уже упоминали VonC и TFD, редактор групповой политики - это еще один способ управления реестром.

Просто внесите с помощью gpedit изменения (в Userconfig - Настройки Windows - Скрипты), которые вам нравятся, а затем загляните в реестр на [HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts]. чтобы узнать, как это сделать напрямую.

Также на моем ПК (висит в домене) есть скрытая папка C:\WINDOWS\System32\GroupPolicy с подпапками для пользователя и машины. У обоих есть дополнительные подпапки, называемые Shutdown и Startup. Может быть, ты тоже сможешь использовать эти.

Если вам нужно что-то простое и работающее для одного (или любого) пользователя, вы можете создать простое приложение, например, на C++ или C#.

Самый простой - иметь C# в лотке (просто добавив компонент лотка в форму), а также регистр и обработчик событий для события Форма. Это выглядело бы так:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason != CloseReason.UserClosing)
        {
            // It's not the user closing the application,
            // Let's do whatever you want here, for example starting a process
            Process notePad = new Process();

            notePad.StartInfo.FileName   = "notepad.exe";
            notePad.StartInfo.Arguments = "ProcessStart.cs";

            notePad.Start();
        }
    }

Итак, ваше приложение будет запускаться с Windows или с пользователем. Он будет ждать (используя немного памяти) и будет что-то делать при выключении системы или выходе пользователя из системы и т. д. (Путем проверки «CloseReason» выше).

Если вы хотите, чтобы запущенная программа выполняла код при выходе из системы, вам следует перехватить сообщение WM_QUERYENDSESSION и найти для lParam значение ENDSESSION_LOGOFF (0x80000000).

Важно проверить это значение lParam, потому что другие указывают на «принудительное закрытие» - т.е. ваш процесс может быть убит еще до того, как ваш код будет запущен. Фактически, большинство сообщений о завершении работы / завершении сеанса предназначены только для того, чтобы дать вам возможность запустить код очистки в последнюю минуту, и они не так безопасны для ответа с помощью длительных действий; но эта конкретная комбинация должна быть в порядке.

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

Если вы находитесь в среде .NET (вы не указали), более быстрый способ - добавить обработчик событий к событию Microsoft.Win32.SystemEvents.SessionEnding.

Ответ принят как подходящий

Чтобы запустить это только для текущего пользователя, вы можете использовать WMI для получения информации при завершении работы / выходе из системы.

Либо вы пишете небольшое приложение C# (или любой другой язык, который может использовать WMI), либо сценарий vbs для прослушивания события Win32_ComputerShutdownEvent WMI.

Пример приложения C# можно найти здесь, в этом вопросе: Получить событие выхода из системы

Другие вопросы по теме