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'sSimpleImpersonationOs 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?