代码之家  ›  专栏  ›  技术社区  ›  galets

如何判断当前线程是否正在模拟?

  •  1
  • galets  · 技术社区  · 15 年前

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

    2 回复  |  直到 15 年前
        1
  •  7
  •   Luke    15 年前

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

        2
  •  2
  •   Steve Townsend    15 年前

    我希望您可以使用类似于 these checks for thread running as Administrator .

    但是,要确保模拟线程总是还原,这要简单得多(并且设计得更好)。您可以使用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