- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我掌握 Windows 中用户模拟的细微差别的过程中,我首先遇到了一个关于让远程数据库发生模拟的问题(请参阅 this SO question),但我终于弄明白了。我的下一个障碍是撤消/取消/恢复(选择你最喜欢的动词)模拟。
我尝试了几个对我来说似乎可信的不同模拟库:
两个库的结果相同。最佳实践规定使用 LOGON32_LOGON_NEW_CREDENTIALS 登录类型(请参阅 Windows API LogonUser function)进行远程数据库连接。当我这样做时,我的示例代码会生成以下内容:
// 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 登录类型恢复?
最佳答案
我深入研究了连接池的内部结构,结果发现 Windows 凭据根本不被视为连接池 key 的一部分。只会考虑 SQL 登录。
因此,如果在用户 A 下打开了一个可用连接,而您现在正在模拟用户 B,它仍会使用它并且 SQL 会将您视为用户 A。反之亦然。
为两个不同的用户稍微改变连接字符串的方法很好。如果您有一个“普通”用户,您可能会这样做,然后您需要模拟一些“高级”用户。当然,您不希望应用程序的每个 用户都使用不同的字符串 - 否则您还不如完全禁用连接池。
调整连接字符串时,您可以考虑将模拟的用户名附加到 Application Name
或 Workstation ID
字段。这将有利于为每个模拟用户设置一个单独的池。
关于c# - Windows 模拟 : A Flaw in the Ointment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18198291/
我是一名优秀的程序员,十分优秀!