Как определить, что текущий поток выдает себя за другого? - PullRequest
1 голос
/ 20 октября 2010

У меня есть приложение на c ++, в котором потоки могут выдавать себя за использование LogonUser / ImpersonateLoggedOnUser, а затем отменять олицетворение с помощью RevertToSelf.Я наткнулся на ошибку, из-за которой поток дважды выдавал себя за другого.Я хочу предотвратить это, проверив, является ли текущий поток уже олицетворяющим, и сгенерировать исключение, если оно есть.Есть ли способ узнать, олицетворяет ли уже текущий поток?

Ответы [ 2 ]

7 голосов
/ 20 октября 2010

Вы можете использовать OpenThreadToken.Если у потока есть токен, то он подражает;если у него нет токена, то он не подражает.

2 голосов
/ 20 октября 2010

Полагаю, вы могли бы сделать это, используя запутанную последовательность вызовов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...