2009-09-14 3 views
2

У меня есть служба C#, работающая под управлением LocalSystem (вызывается Serv.exe), и мне нужна эта служба для мониторинга доступа к реестру.Как контролировать доступ к реестру? [C#]

В частности, всякий раз, когда вызов HKEY_CURRENT_USER \ Software *. * Производится любым из процессов, которые он запускает, мне нужно поймать этот вызов (либо изменение, либо просто доступ), чтобы я мог перенаправить его соответственно. Я знаю, CHANGE, но как насчет доступа к реестру, чтобы получить значение?

Причины (если у кого-то есть лучшие предложения, которые я бы более приветствовал) - Служба работает под LocalSystem, у которой есть свой HKEY_CURRENT_USER, но эта служба используется для установки программного обеспечения на фоне зарегистрированного пользователя - поэтому, когда это программное обеспечение установлено, оно может попытаться повлиять на HKEY_CURRENT_USER самого пользователя (что хорошо), поэтому мне нужно убедиться, что эти изменения отражены в USER, а не в учетной записи LocalSystem.

Любые советы, помощь, предложения были бы весьма признательны. Спасибо,

+1

Не забудьте принять ответ, как только решение будет полезно для вас. Я вижу, что у вас есть 9 вопросов без принятого ответа. –

ответ

5

Используйте Sysinternals Process Monitor, если вы просто хотите посмотреть, что происходит.

Перенаправление сложное; вам нужно будет подключить API с библиотекой, например Detours, но лицензия на ее использование в производстве будет стоить $ 1. Тем не менее, Process Monitor по-прежнему полезен, чтобы гарантировать, что ваши API-интерфейсы работают правильно.

Должны ли процессы, запускаемые вашей службой, продолжать работать как LocalSystem? Если нет, попробуйте CreateProcessAsUser, чтобы получить процесс, созданный в соответствующей учетной записи.

Если ваши потребности более простые, например, получение беззаботного письменного приложения для работы без доступа на запись к HKLM, то может быть билет Application Compatibility Toolkit.

К сожалению, установка является самым неприятным случаем. Возможно, вам придется прибегнуть к неуклюжему взлому, когда ваша служба добавит пользователя в группу «Администраторы», запустите установщик с помощью CreateProcessAsUser, а затем удалите пользователя из группы «Администраторы» снова после запуска процесса, аналогично MakeMeAdmin script Aaron Margosis.

Если программа установки является то, что плохо, возможно, лучше удачи сбора необходимых параметров реестра HKCU (использование Process Monitor или reg export HKCU до и после инсталляции и Diff их) в .reg файл, и булыжник до какой-то старте скрипт, который импортирует записи реестра при входе в систему (и оставляет паз, чтобы он не перезапускался для одного и того же пользователя и не перезаписывал их настройки). Я использовал этот подход для специальных приложений, которые настаивают на сохранении всего в HKCU.

Если вы не возражаете копаться в недокументированных глубинах, ваша служба, работающая под управлением LocalSystem, может выполнить some complicated hocus-pocus involving essentially undocumented APIs like ZwCreateToken для запуска установщика в сеансе пользователя с добавленной группой локальных администраторов. Это также имеет некоторые ограничения - например, токен, созданный без пароля, не будет иметь учетных данных сети.

+0

SysInternals Process Monitor не имеет API (который я знаю), поэтому не уверен, как он может помочь моему сервису. Что касается других 2 - я прочитаю и посмотрю - никогда не слышал о них раньше (спасибо). – Shaitan00

+0

Проблема - я не могу олицетворять - у меня нет имени пользователя или пароля для любой из учетных записей после установки службы ... Это моя основная причина для установки в качестве службы LocalSystem. – Shaitan00

+0

Я думал, что вы можете выдавать себя за пропущенный токен (не создавая его самостоятельно с помощью LogonUser), если процесс в сеансе пользователя передает его вам. –

2

Вы можете использовать WMI запросов. Here - пример.

+1

Но разве это не работает только для CHANGES в реестр? Мне также нужно обращаться с ним. – Shaitan00

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