2010-08-03 3 views
2

Использование перехватчиков окон. Я отправляю сообщения в свое приложение, которое уведомляется о событиях Windows каждым приложением в системе.DuplicateHandle: требуется OpenProcess, но доступ запрещен

Чтобы выполнить маршал параметров сообщения, я использую общие воспоминания. Внешний процесс вызывает DuplicateHandle, но для совместного использования дескриптора с моим экземпляром приложения он должен позвонить OpenProcess с требованиями привилегии PROCESS_DUP_HANDLE.

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

Документация AdjustTokenPrivileges состояний:

Функция AdjustTokenPrivileges не может добавлять новые привилегии в маркер доступа , Он может включать или отключать существующие привилегии токена. Чтобы определить привилегии токена, вызовите функцию GetTokenInformation.

Итак, вопрос ... как добавить маркер SeDebugPrivilege в «Проводник» процесс, или в качестве альтернативы, как позволить «исследователя» процесс назвать OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)?

ответ

3

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

Если вам нужно использовать DuplicateHandle и вам нужно иметь возможность использовать OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId) внутри любого процесса, я нахожу, что вы не должны использовать SeDebugPrivilege. Вместо этого вы должны предоставить разрешение от PROCESS_DUP_HANDLE всем для процесса с pId. Если вы создаете процесс, вы можете указать дескриптор безопасности. Если процесс уже создан, вы можете использовать OpenProcess, GetSecurityInfo (см. http://msdn.microsoft.com/en-us/library/aa446654.aspx) и SetSecurityInfo, чтобы изменить дескриптор процесса.

Чтобы проверить этот подход, вы можете просто запустить Process Explorer (см. http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) с правами администратора, откройте вкладку «Безопасность» выбранного процесса (процесс с pId) и измените его дескриптор безопасности.После этого все процессы смогут использовать OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId) без включения SeDebugPrivilege.

+0

Кажется, именно то, что мне нужно! Какой SID соответствует PROCESS_DUP_HANDLE? (Я не могу изменить SID процесса с помощью ProcEx ... :() – Luca

+0

PROCESS_DUP_HANDLE - это маска доступа, которая определяет права доступа, управляемые ACE (см. Http://msdn.microsoft.com/en-us/library/ aa374868.aspx). SID, который вы выберете, может быть хорошо известен группе SID всех (см. http://msdn.microsoft.com/en-us/library/aa379649.aspx). Если вы не знакомы с дескрипторами безопасности I рекомендуется использовать ConvertStringSidToSid или ConvertStringSecurityDescriptorToSecurityDescriptor, где это возможно, и использовать язык определения дескриптора безопасности (SDDL) (см. http://msdn.microsoft.com/en-us/library/aa379567.aspx). – Oleg

+0

Я нашел это: http://stackoverflow.com/questions/1909084/is-there-a-way-to-modify-a-process-dacl-in-c (назначение сообщений - это управляемый процесс). Он работает, но не может настроить маску доступа для WellKnownSidType. LogonIdsSid, к которому принадлежит «explorer» (не может создать SecurityIdentifier типа LogonIdsSid). Sigh. – Luca

1

Это то, что вы пытаетесь достичь?

  1. Создать блок разделяемой памяти во «внешнем» процессе.
  2. Используйте DuplicateHandle создать дескриптор этой памяти в приложении
  3. Используйте сообщение окна для отправки значения дескриптора для приложения
  4. Доступа к общей памяти в приложении

Если я правильно понятны, то вам вообще не нужно открывать дескриптор для вашего прикладного процесса. Вместо этого просто дайте блоку разделяемой памяти детерминированное имя, например SharedMem_XXX, где XXX является PID внешнего процесса. Затем отправьте PID в ваше приложение, используя оконное сообщение. Затем он может воссоздать имя и использовать его для открытия блока разделяемой памяти.

+0

Хорошее решение, но это будет работать только в том случае, если я использую SendMessage, а не если я использую PostMessage, так как приложение может отправлять более одного сообщения до сообщений процесса приложения. Я пытаюсь заменить PostMessage на SendMessage и вижу, влияет ли на производительность системы. Спасибо, что просветились! – Luca

+0

Добро пожаловать. Я не совсем понимаю, что вы подразумеваете под PostMessage или SendMessage, но это может иметь отношение к вашей архитектуре. Если бы вы могли предоставить более подробную информацию о том, что вы пытаетесь выполнить, я, вероятно, мог бы быть более полезным. –

+0

В зависимости от того, что вы делаете, существуют другие механизмы IPC, которые могут лучше подойти к вашим потребностям, таким как сообщения Window, именованные каналы или удаленные вызовы процедур. –