Является ли это фатальным, если RevertToSelf () после ImpersonateSelf () завершается ошибкой? - PullRequest
7 голосов
/ 29 июля 2011

MSDN говорит, что если RevertToSelf () завершается неудачно, программа должна немедленно завершиться, потому что в противном случае она продолжает выполняться от имени клиента, выдавшего себя за него, и это неуместно.Теперь предположим, что я делаю

ImpersonateSelf( SecurityImpersonation );

, и вызов успешен, затем я звоню RevertToSelf(), и последний отказывает.Поток продолжает работать с привилегиями текущего процесса.Это тоже смертельно плохо?

1 Ответ

4 голосов
/ 03 августа 2011

Мне нравится ваш вопрос, и MSDN не совсем ясно.

Я посмотрел на Программирование безопасности Windows (Кит Браун) на страницах 112–117. ImpersonateSelf выполняет всю работу, которую вы могли бы выполнить самостоятельно, позвонив по номеру

  • OpenProcessToken
  • DuplicateTokenEx (... TokenImpersonation ...)
  • SetThreadToken
  • CloseHandle

Хотя RevertToSelf - это просто вызов

SetThreadToken(0,0)

Передача двух нулевых параметров указывает методу вернуться к предыдущему токену. Вам не нужно иметь дело с олицетворением против основных токенов и прав доступа к токену. Вызов всегда будет успешным.

И если вы посмотрите на коды ошибок функции RpcRevertToSelf, то увидите, что кроме кодов, связанных с RPC, единственный режим отказа - это если вы не подражаете.

Я говорю, что можно с уверенностью предположить, что RevertToSelf (вызывается из того же потока, что и ImpersonateSelf) всегда будет успешным.

...