我希望使用每个登录用户的凭据在不同的进程中运行应用程序,而不用Win32 API CreateProcessAsUserA()
创建全新的进程,因为启动该应用程序大约需要一分钟的时间,因此这是不可接受的性能。
计划A::在用户请求进入之前,先启动一些站立流程。使用给定的用户凭据模拟现有流程。
该怎么做?
计划B:我愿意听到其他想法。
答案 0 :(得分:0)
没有记录/未记录的方法来实现您的要求。有一种破解方法,但是会严重危害安全性。
如果您有权模拟其他用户,则意味着您的进程在Windows中以最高特权运行。您可以做的是
在任何情况下,都不应在零售产品中使用此方法,因为这是一种hack,可以根据流程B的执行情况轻易加以利用。如果您打算使用这种黑客工具来运送产品,请告诉我们名称,以便我们不要使用它。
答案 1 :(得分:0)
如果您的进程只有一个线程或没有很多线程,则可以使用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
,请尝试this question中的答案来设置进程访问令牌。