Representação do Windows: Uma falha na pomada

Na minha jornada para dominar as nuances da representação de usuário no Windows, primeiro tive um problema sobre como ocorrer a representação de um banco de dados remoto (consulteesta pergunta SO), mas finalmente descobri isso. Meu próximo obstáculo é desfazer / cancelar / reverter a representação (escolha seu verbo favorito).

Eu tentei algumas bibliotecas de representação diferentes que parecem credíveis para mim:

Phil Harding'sImitadorMatt Johnson'sSimpleImpersonation

Os resultados são idênticos às duas bibliotecas. As práticas recomendadas determinam o uso do tipo de logon LOGON32_LOGON_NEW_CREDENTIALS (consulte a API do WindowsFunção LogonUser) para uma conexão de banco de dados remota. Quando faço isso, aqui está o que meu código de exemplo produz:

// SCENARIO A
BEGIN impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\ImpersonatedUser
END impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\ImpersonatedUser << NOT EXPECTED HERE!!

A única solução alternativa que encontrei é usar o tipo de logon LOGON32_LOGON_INTERACTIVE e, em seguida, obtenho o seguinte:

// SCENARIO B
BEGIN impersonation.
Local user = MyDomain\ImpersonatedUser << EXPECTED, BUT NOT WANTED!
DB reports: MyDomain\ImpersonatedUser
END impersonation.
Local user = MyDomain\MyUser
DB reports: MyDomain\MyUser

A partir da descrição concisa doWindowsImpersonationContext.Undo método, com certeza parece que deveria ter funcionado no cenário A.

É possível reverter usando o tipo de logon LOGON32_LOGON_NEW_CREDENTIALS?

questionAnswers(3)

yourAnswerToTheQuestion