gpt4 book ai didi

c# - Windows 模拟 : A Flaw in the Ointment

转载 作者:可可西里 更新时间:2023-11-01 12:43:04 27 4
gpt4 key购买 nike

在我掌握 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 NameWorkstation ID 字段。这将有利于为每个模拟用户设置一个单独的池。

关于c# - Windows 模拟 : A Flaw in the Ointment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18198291/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com