【问题标题】:How to tell if current thread is impersonating?如何判断当前线程是否正在模拟?
【发布时间】:2010-10-20 00:50:10
【问题描述】:

我有一个 c++ 应用程序,其中线程可以使用 LogonUser/ImpersonateLoggedOnUser 进行模拟,然后使用 RevertToSelf 恢复模拟。我遇到了导致线程以这种方式模拟两次的错误。我想通过测试当前线程是否已经在模拟并抛出异常来防止这种情况。有没有办法判断当前线程是否已经在模拟?

【问题讨论】:

    标签: c++ security winapi


    【解决方案1】:

    您可以使用 OpenThreadToken。如果一个线程有一个令牌,那么它就是在模拟;如果它没有令牌,则它不是模拟的。

    【讨论】:

    • +1 表示对 q 的正确回答 - 就我个人而言,我还是不想猜测这个。
    • 谢谢,让我测试一下,如果成功,我会将其标记为正确。
    【解决方案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
    

    【讨论】:

    • 问题是/*在此处执行需要模拟的代码*/可能正在调用一些试图模拟的代码,我想阻止这种行为
    • @galets - 让您的构造函数在 TLS(线程本地存储)中保存一些内容,以防止递归模拟。当然,析构函数应该重置它。
    猜你喜欢
    • 2021-11-08
    • 2017-06-04
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2018-01-07
    相关资源
    最近更新 更多