Из процесса, запущенного пользователем А требуется запустить thread от имени пользователя Б. Как это сделать?
Нашел только примеры запуска _процесса_ от имени другого пользователя, а про _thread_ нигде нету
Спасибо.
Re: Как создать thread от имени другого пользователя?
Здравствуйте, apostarn, Вы писали:
A>Здравствуйте,
A>Из процесса, запущенного пользователем А требуется запустить thread от имени пользователя Б. Как это сделать? A>Нашел только примеры запуска _процесса_ от имени другого пользователя, а про _thread_ нигде нету
A>Спасибо.
ИМХО никак. Иначе нарушается секьюрити.
ICQ 156156278
Re[2]: Как создать thread от имени другого пользователя?
Здравствуйте, BlackHeretic, Вы писали:
BH>Здравствуйте, apostarn, Вы писали:
A>>Здравствуйте,
A>>Из процесса, запущенного пользователем А требуется запустить thread от имени пользователя Б. Как это сделать? A>>Нашел только примеры запуска _процесса_ от имени другого пользователя, а про _thread_ нигде нету
A>>Спасибо.
BH>ИМХО никак. Иначе нарушается секьюрити.
Есть подозрение что как-то можно. Вот выкладка из MSDN
GetUserName
The GetUserName function retrieves the name of the user associated with the current thread.
К тому же в CreateThread передаются SECURITY_ATTRIBUTES.
Re: Как создать thread от имени другого пользователя?
Здравствуйте, apostarn, Вы писали:
A>Из процесса, запущенного пользователем А требуется запустить thread от имени пользователя Б. Как это сделать? A>Нашел только примеры запуска _процесса_ от имени другого пользователя, а про _thread_ нигде нету
Сразу запустить thread от имени другого пользователя нельзя, но после того, как thread запущен обычным образом, он может имперсонировать пользователя Б с помощью ImpersonateLoggedOnUser (подразумевая, что у вас есть токен пользователя Б). Кстати, для этого вовсе не обязательно создавать новый поток. Любой поток может вызвать ImpersonateLoggedOnUser, сделать что нужно от лица пользователя Б, а потом вызвать RevertToSelf чтобы вернуться в нормальный режим.
P.S. Если токена нет, но есть аутентифицированное соединение с процессом пользователя Б через COM или named pipe, то можно воспользоваться CoImpersonateClient или ImpersonateNamedPipeClient.
-- Alex Fedotov
Re[3]: Как создать thread от имени другого пользователя?
Здравствуйте, Alex Fedotov, Вы писали:
AF>Здравствуйте, apostarn, Вы писали:
A>>Из процесса, запущенного пользователем А требуется запустить thread от имени пользователя Б. Как это сделать? A>>Нашел только примеры запуска _процесса_ от имени другого пользователя, а про _thread_ нигде нету
AF>Сразу запустить thread от имени другого пользователя нельзя, но после того, как thread запущен обычным образом, он может имперсонировать пользователя Б с помощью ImpersonateLoggedOnUser (подразумевая, что у вас есть токен пользователя Б). Кстати, для этого вовсе не обязательно создавать новый поток. Любой поток может вызвать ImpersonateLoggedOnUser, сделать что нужно от лица пользователя Б, а потом вызвать RevertToSelf чтобы вернуться в нормальный режим.
AF>P.S. Если токена нет, но есть аутентифицированное соединение с процессом пользователя Б через COM или named pipe, то можно воспользоваться CoImpersonateClient или ImpersonateNamedPipeClient.
Спасибо!
Получилось, работает
Re: Как создать thread от имени другого пользователя?
Здравствуйте, apostarn, Вы писали:
A>Из процесса, запущенного пользователем А требуется запустить thread от имени пользователя Б. Как это сделать? A>Нашел только примеры запуска _процесса_ от имени другого пользователя, а про _thread_ нигде нету
махну рукой в направлении:
Platform SDK: Security
Client Impersonation
Impersonation is the ability of a thread to execute using different security information than the process that owns the thread. Typically, a thread in a server application impersonates a client. This allows the server thread to act on behalf of that client to access objects on the server or validate access to the client's own objects.
The Microsoft® Windows® API provides the following functions to begin an impersonation:
A DDE server application can call the DdeImpersonateClient function to impersonate a client.
A named-pipe server can call the ImpersonateNamedPipeClient function.
You can call the ImpersonateLoggedOnUser function to impersonate the security context of a logged-on user's access token.
The ImpersonateSelf function enables a thread to generate a copy of its own access token. This is useful when an application needs to change the security context of a single thread. For example, sometimes only one thread of a process needs to enable a privilege.
You can call the SetThreadToken function to cause the target thread to run in the security context of a specified impersonation token.
A Microsoft Remote Procedure Call (RPC) server application can call the RpcImpersonateClient function to impersonate a client.
A security package or application server can call the ImpersonateSecurityContext function to impersonate a client.
For most of these impersonations, the impersonating thread can revert to its own security context by calling the RevertToSelf function. The exception is the RPC impersonation, in which the RPC server application calls RpcRevertToSelf or RpcRevertToSelfEx to revert to its own security context.
Written with help of RSDN@Home 1.1.4 beta 4 rev. 302
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[4]: Как создать thread от имени другого пользователя?
От:
Аноним
Дата:
11.04.05 18:44
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:
AF>Здравствуйте, apostarn, Вы писали:
A>>К тому же в CreateThread передаются SECURITY_ATTRIBUTES.
AF>Это в некоторой степени распространенное заблуждение в отношении CreateThread и CreateProcess.
AF>SECURITY_ATTRIBUTES задают доступ к объекту потока (процесса), но не влияют на то, от лица какого пользователя будет выполняться поток (процесс).
Спасибо. Понял что заходил не с того конца. Надо создать поток, а в нем перевоплотиться в нужного пользователя.
Re[2]: Как создать thread от имени другого пользователя?
Здравствуйте, Valery A. Boronin, Вы писали:
VAB>Здравствуйте, apostarn, Вы писали:
A>>Из процесса, запущенного пользователем А требуется запустить thread от имени пользователя Б. Как это сделать? A>>Нашел только примеры запуска _процесса_ от имени другого пользователя, а про _thread_ нигде нету
VAB>махну рукой в направлении:
VAB>
Platform SDK: Security
VAB>Client Impersonation
VAB>Impersonation is the ability of a thread to execute using different security information than the process that owns the thread. Typically, a thread in a server application impersonates a client. This allows the server thread to act on behalf of that client to access objects on the server or validate access to the client's own objects.
VAB>The Microsoft® Windows® API provides the following functions to begin an impersonation:
VAB>A DDE server application can call the DdeImpersonateClient function to impersonate a client.
VAB>A named-pipe server can call the ImpersonateNamedPipeClient function.
VAB>You can call the ImpersonateLoggedOnUser function to impersonate the security context of a logged-on user's access tokVAB>