【发布时间】:2011-01-24 12:02:54
【问题描述】:
我在 Windows 2000 Pro SP4 机器(域外)上运行,并试图在 Windows XP 机器上(域内)模拟本地用户。我使用的代码与此处发布的问题中的 WindowsImpersonationContextFacade 非常相似:How can I temporarily impersonate a user to open a file?。我正在使用模拟来远程启动和停止 Windows 服务以及访问网络共享(用于一些自动化集成测试)。
为了让它工作,我在调用 LogonUser 时必须使用 LOGON32_PROVIDER_DEFAULT 和 LOGON32_LOGON_NEW_CREDENTIALS。一切运行良好(域上的 Windows XP 到域上的 Windows XP,域上的 Windows XP 到域外的 Windows Server 2003,甚至域上的 Windows XP 到域外的 Windows 2000)。一个问题是在域外的 Windows 2000 Pro SP4 上运行,并试图在域上运行的 Windows XP 机器上模拟本地用户。
为了让 Windows 2000 工作,我在调用 LogonUser 时必须使用 LOGON32_PROVIDER_WINNT50 和 LOGON32_LOGON_NEW_CREDENTIALS。这似乎让我完成了 95% 的工作,我现在可以在 XP 机器上模拟本地用户并启动/停止服务以及使用模拟凭据访问网络共享。不过,我遇到了一个问题,调用 Undo impersonation 并关闭令牌句柄似乎会使与远程框的连接保持打开状态。在大约 10 次左右的模拟调用之后,进一步的模拟尝试将失败,并出现错误提示当前打开的连接过多。如果我查看远程 Windows XP 框上的计算机管理 -> 系统工具 -> 共享文件夹 -> 会话,我可以看到大约 10 个会话打开到 Windows 2000 框。我可以手动关闭这些(我认为它们最终可能会自行关闭,但不会很快),然后模拟再次开始工作几次。在我的任何其他测试场景中,这个开放会话问题似乎都不是问题,只是在 Windows 2000 机器上本地运行时。
有什么想法吗?
编辑 1: 在进行了更多测试并尝试了许多不同的事情之后,这似乎是未重用开放会话的问题。仅在 Windows 2000 上,每次调用 LogonUser 以获取令牌然后使用该令牌进行模拟似乎都会导致创建一个新会话。我猜 Windows XP 和 Windows Server 2003 正在重用打开的会话,因为我似乎对它们没有任何问题。如果我调用 LogonUser 一次,然后缓存令牌,我似乎能够使用缓存的令牌进行尽可能多的模拟调用,而不会遇到“连接过多”的问题。这似乎是一个丑陋的解决方法,因为我每次执行模拟时都无法在我的令牌上调用 CloseHandle()。任何人有任何想法或想法,还是我被这个丑陋的黑客所困扰?谢谢
【问题讨论】:
-
Win 2000 的支持期限已过!
-
我不使用 Windows 2000,因为我想这样做,这是客户的要求,他们支付账单
标签: c# .net impersonation