Если ваш процесс имеет только один поток или не много потоков, вы можете использовать SetThreadToken
.
- Сначала
LogonUserA
или некоторые другие функции используются для получения токена пользователя.
- Затем
DuplicateToken
преобразует его в жетон подражания.
- Получите дескриптор потока и, наконец, вызовите
SetThreadToken
.
Вот простой пример (уже убирается проверка ошибок для краткости)
Существующий процесс:
#include <windows.h>
#include <iostream>
using namespace std;
int main(void)
{
cout << GetCurrentThreadId() << endl;//For example: I get currentthreadid = 17608 this time.
getchar();
char user[100] = { 0 };
DWORD size = 100;
GetUserNameA(user, &size);
cout << user << endl;
getchar();
return 0;
}
SetThreadToken.cpp:
#include <windows.h>
#include <iostream>
using namespace std;
int main(void)
{
HANDLE hToken, DToken;
BOOL i = LogonUserA("user","domain","password", LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT,&hToken);
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS,false,17608);
DuplicateToken(hToken, SecurityImpersonation,&DToken);
SetThreadToken(&hThread, DToken);
getchar();
return 0;
}
Если вы хотите установить токен для процесса, существует недокументированный метод NtSetInformationProcess
в ntdll.dll
, попробуйте ответить в на этот вопрос , чтобы установить токен доступа к процессу.