【发布时间】:2010-10-20 00:50:10
【问题描述】:
我有一个 c++ 应用程序,其中线程可以使用 LogonUser/ImpersonateLoggedOnUser 进行模拟,然后使用 RevertToSelf 恢复模拟。我遇到了导致线程以这种方式模拟两次的错误。我想通过测试当前线程是否已经在模拟并抛出异常来防止这种情况。有没有办法判断当前线程是否已经在模拟?
【问题讨论】:
我有一个 c++ 应用程序,其中线程可以使用 LogonUser/ImpersonateLoggedOnUser 进行模拟,然后使用 RevertToSelf 恢复模拟。我遇到了导致线程以这种方式模拟两次的错误。我想通过测试当前线程是否已经在模拟并抛出异常来防止这种情况。有没有办法判断当前线程是否已经在模拟?
【问题讨论】:
您可以使用 OpenThreadToken。如果一个线程有一个令牌,那么它就是在模拟;如果它没有令牌,则它不是模拟的。
【讨论】:
我希望您可以使用类似于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
【讨论】: