2013-05-08 3 views
3

Служба Windows создает значение реестра (для надстройки Excel) под ключом реестра HKEY_CURRENT_USER для каждого зарегистрированного пользователя (путем вызова ImpersonateLoggedOnUser() и RegSetValueEx()). Мне нужно удалить это значение реестра, когда пользователь выходит из системы, включая выключение системы. Если он не удаляется при выходе из системы и программное обеспечение удаляется одним пользователем, запись в реестре остается для любого другого пользователя, который вошел в систему в течение срока службы службы, что вызывает отображение ошибки в поле сообщения каждый раз, когда Excel начинается потому, что он пытается загрузить надстройку, которая больше не существует.Удалить значение HKEY_CURRENT_USER при отключении пользователя

Рассмотренный но отклонил следующее:

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

Есть ли какие-либо другие механизмы, которые могли бы обеспечить это решение? Windows версии XP, Vista и 7.

+0

Как насчет ['WM_QUERYENDSESSION'] (http://msdn.microsoft.com/en-ca/library/windows/desktop/aa376890 (v = vs.85) .aspx)? – chris

+0

@chris, как вызывается идентификатор пользователя? – hmjd

+0

Вы управляете сервисной программой и/или установкой программного обеспечения? Если это так, вы можете просто отключить значение, когда программное обеспечение завершается (используйте RAII, если вы действительно используете C++). Если вы контролируете программу установки/удаления, есть опции для удаления любых таких значений из реестра при деинсталляции. –

ответ

2

Поскольку вы уже находитесь на службе, ваша жизнь (должна быть) легко. На самом деле вы можете зарегистрироваться, чтобы получить событие SERVICE_CONTROL_SESSIONCHANGE. В частности, вы захотите найти причину WTS_SESSION_LOGOFF.

Необходимо зарегистрировать эти события в рутине обслуживания, при запуске, добавив SERVICE_ACCEPT_SESSIONCHANGE. Когда событие равно SERVICE_CONTROL_SESSIONCHANGE, параметр lpEventData является указателем на структуру WTSSESSION_NOTIFICATION с информацией о завершении сеанса (таким образом, об отключении пользователя).

Отъезд подробной информации о MSDN1, MSDN2, MSDN3 - the data structure that contains the dwSessionId of the interesting session

Выезда это связанно (но не дублирует) question слишком

То есть, я нашел уборщик решения João Augusto; Я бы использовал это для аналогичной проблемы; Однако, я хотел бы добавить это решение за то, что ответ на более широкий вопрос (для будущих справочных читателей)

EDIT: Еще один способ заключается в использовании SENS, проверьте этот MSDN article

+0

Как определить, какой пользователь выходит из системы, если вошел пользователь mutliple? – hmjd

+0

С помощью параметра dwSessionId. Затем вы можете использовать его (я думаю, через WTSQuerySessionInformation, как предложил chris в комментариях), чтобы получить информацию о пользователе для пользователя –

+0

. Я отредактировал свой ответ, чтобы уточнить этот вопрос. –

0

более простой подход был бы поставить команда удаление значения вопроса в ключ RunOnce пользователя, например,

reg.exe delete HKCU\Software\xyzzy /v myvalue /f 

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

Смежные вопросы