在Windows 2000上模拟到Windows XP使连接保持打开状态

时间:2010-03-06 17:22:39

标签: c# .net impersonation

我正在运行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盒子上的本地用户并启动/停止服务以及使用模拟凭据访问网络共享。我遇到了一个问题,调用撤消模拟并关闭令牌句柄似乎使远程盒的连接保持打开状态。在大约10次左右的模拟调用之后,进一步的模拟尝试将失败并显示一条错误,说明目前有太多连接正在打开。如果我看一下计算机管理 - >系统工具 - >共享文件夹 - >在我的远程Windows XP盒子上的会话,我可以看到大约10个会话打开到Windows 2000框。我可以手动关闭这些(我认为它们可能最终关闭自己,但不是很快),然后假冒再次开始工作几次。这个开放会话问题在我的任何其他测试场景中似乎都不是问题,只是在Windows 2000机器上本地运行时。

有什么想法吗?

编辑1: 经过一些更多的测试并尝试了许多不同的东西,这似乎是一个开放会话不被重用的问题。仅在Windows 2000上,每次调用LogonUser以获取令牌然后使用该令牌进行模拟似乎都会导致创建新会话。我猜测Windows XP& Windows Server 2003正在重用打开的会话,因为我似乎没有任何问题。如果我一次调用LogonUser,然后缓存令牌,我似乎能够使用缓存令牌进行尽可能多的模拟调用,而不会遇到“太多连接”问题。这似乎是一个丑陋的工作,因为我每次执行模拟时都无法在我的令牌上调用CloseHandle()。任何人有任何想法或想法,或者我是否坚持这个丑陋的黑客?感谢

2 个答案:

答案 0 :(得分:1)

如果有人对此感兴趣,我从来没有找到解决这个问题的好方法。我使用的解决方法是缓存从LogonUser返回的令牌,然后在每次模拟调用时重用该令牌。这使事情变得很好,但它不是我想要在生产代码中做的事情。

答案 1 :(得分:0)

“启动/停止服务以及访问网络共享”。根据您的代码,这可能会导致此类问题。

调用撤消仅释放模拟涉及的资源,但不释放应用程序使用的所有资源。