我有一个c ++应用程序,其中线程可以使用LogonUser / ImpersonateLoggedOnUser进行模拟,然后使用RevertToSelf恢复模拟。我遇到了错误导致线程两次冒充这种方式。我想通过测试当前线程是否已经模拟来防止这种情况,如果是,则抛出异常。有没有办法判断当前线程是否已经模拟了?
答案 0 :(得分:7)
您可以使用OpenThreadToken。如果一个线程有一个令牌,那么它就是冒充;如果它没有令牌那么它就不会冒充。
答案 1 :(得分:2)
我希望您可以使用类似于these checks for thread running as Administrator的复杂Win32 API调用序列来执行此操作。
但是,确保模拟线程始终恢复更为简单(并且设计更好)。您可以使用Win32 API来强制执行此操作,但我相信您也可以通过创建一个模拟构造的包装类并在超出范围时还原它来执行此操作,类似于异常安全的互斥锁/关键的常见锁定保护模型部分处理。即使你的代码有多个地方可以做到这一点,在可靠的构造上对齐它们似乎也是可取的。
流程将是:
{
MyImpersonationClass newContext(desiredUser);
// constructor calls Impersonate, saving required info
// do the code that requires impersonation here
}
// newContext goes out of scope, destructor calls RevertToSelf