在我掌握 Windows 中用户模拟的细微差别的过程中,我首先遇到了一个关于完全模拟远程数据库的问题(请参阅这个 SO question),但我终于想通了。我的下一个障碍是撤消/取消/恢复(选择您最喜欢的动词)模仿。
我尝试了几个对我来说似乎可信的不同模拟库:
- 菲尔·哈丁的模仿者
- 马特约翰逊的SimpleImpersonation
结果与两个库相同。最佳实践要求对远程数据库连接使用 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!!
我发现的唯一解决方法是使用 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
从WindowsImpersonationContext.Undo方法的简洁描述来看,它确实似乎应该在场景 A 中工作。
是否可以使用 LOGON32_LOGON_NEW_CREDENTIALS 登录类型进行还原?