在我掌握Windows中用户模仿的细微差别的过程中,我首先遇到了一个关于冒充远程数据库的问题(请参阅此SO问题),但我终于弄明白了.我的下一个障碍是撤消/取消/恢复(选择你最喜欢的动词)模仿.
我尝试了几个不同的模拟库,这对我来说是可信的:
结果与两个库相同.最佳实践要求使用LOGON32_LOGON_NEW_CREDENTIALS登录类型(请参阅Windows API LogonUser函数)进行远程数据库连接.当我这样做时,这是我的示例代码产生的:
// 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!!
Run Code Online (Sandbox Code Playgroud)
我找到的唯一解决方法是使用LOGON32_LOGON_INTERACTIVE登录类型,然后我得到:
// 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
Run Code Online (Sandbox Code Playgroud)
从WindowsImpersonationContext.Undo方法的简洁描述来看,它似乎应该在方案A中起作用.
是否可以使用LOGON32_LOGON_NEW_CREDENTIALS登录类型进行恢复?