模拟用户的典型方法是调用 LogOnUser() 以获取用户的访问 token 并将此 token 传递给 ImpersonateLoggedOnUser() 以进行模拟。
但是,这只会模拟调用线程 的用户。有没有办法模拟或更改进程的访问 token (主 token )?支持 我正在访问网络共享,并且生成了多个线程来访问该网络共享的不同部分。我是否必须在所有这些线程中模拟远程用户(有权访问该共享)?还是有一种方法可以先“模拟”进程,以便在生成新线程时,它们已经通过自动继承进程主 token 获得了访问权限?
最佳答案
不,这是不可能的。 NtSetInformationProcess
的正式存在 ProcessAccessToken
信息类。它以 PROCESS_ACCESS_TOKEN
结构作为输入。它没有记录,但在 ntddk.h
// // Process Security Context Information // NtSetInformationProcess using ProcessAccessToken // PROCESS_SET_ACCESS_TOKEN access to the process is needed // to use this info level. // typedef struct _PROCESS_ACCESS_TOKEN { // // Handle to Primary token to assign to the process. // TOKEN_ASSIGN_PRIMARY access to this token is needed. // HANDLE Token; // // Handle to the initial thread of the process. // A process's access token can only be changed if the process has // no threads or a single thread that has not yet begun execution. // // N.B. This field is unused. // HANDLE Thread; } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
所以请注意
A process's access token can only be changed if the process has no threads or a single thread that has not yet begun execution.
真正在 xp/2003 上条件不那么严格:来自 wrk 中的 PspAssignPrimaryToken
A primary token can only be replaced if the process has no threads, or has one thread.
但是从vista开始这个添加还没有开始执行
如果您为自己的进程调用它(您可能需要 SeAssignPrimaryTokenPrivilege 权限并且可以在没有它的情况下获得 STATUS_PRIVILEGE_NOT_HELD
,具体取决于 token 类型)- 您获得了 STATUS_NOT_SUPPORTED
错误。对于example
所以在实践中,我们只能在以挂起状态启动进程后更改进程 token (例如,查看 answer )。但最好使用 CreateProcessAsUserW
无论如何在这种情况下都能发挥作用。
关于c++ - 是否可以模拟进程的访问 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57753029/