冒充用户

时间:2013-01-08 13:45:51

标签: c# .net windows-services impersonation user-profile

我们正在开发一个C#.NET Windows服务。

我们的服务在系统帐户下运行,我们正在尝试模拟已登录的用户USER。 模拟工作正常,即在模仿后调用System.Security.Principal.WindowsIdentity.GetCurrent()我们得到正确的用户'USER'。

问题在于,当我们尝试访问用户配置文件时,我们无法获得预期的结果。 一个例子是访问注册表CURRENT_USER。我们收到拒绝访问错误。 当使用第三方函数时,我们假设它部分使用了注册表,我们得到了“真实”(模仿之前)用户的详细信息。 另外,在调用Environment.ExpandEnvironmentVariables("%TEMP%")时,我们会获取系统配置文件而不是登录的用户配置文件。

有没有办法完全冒充不同的用户? 我知道我们可以使用LoadUserProfile获取特定的用户配置文件,但这对我们不利,因为我们正在运行使用当前用户配置文件的第三方dll。

我们的模拟代码基于this

2 个答案:

答案 0 :(得分:3)

正如您所发现的,模拟不会设置HKEY_CURRENT_USER或环境。

这是因为模拟令牌是每个线程,而HKCU和环境是按进程进行的。

如果您需要访问用户的常规环境,则需要使用HKEY_USERS\SID和模拟用户的SID,例如例如HKEY_USERS\S-1-5-21-12345678-12345678-12345678-1234。调用LoadUserProfile以确保加载密钥。 (如果它应该是当前登录的用户,它应该已经加载,所以你可能不应该这样做,但检查它是否存在并返回错误,如果没有)。

您还可以了解他们的日常环境,因为这是在HKCU的关键“环境”下。您只需将其与系统环境相结合即可。

如果第三方DLL实际上需要HKCU并且环境设置正确,则需要在用户的登录会话中创建一个进程以托管DLL,并以某种方式发回任何操作的结果。如果只需要环境,则可以创建子进程并手动设置环境。

但是你没有说明为什么要这样做。听起来你已经将此作为解决更大问题的一部分。如果可能的话,我建议您在没有获得用户环境或HKCU的情况下,看看是否有办法满足您的需求。

为什么DLL不能直接在用户自己的会话中运行?为什么需要服务?您是否可以重新构建解决方案,以便在登录会话中运行用户模式部件并托管第三方DLL,并与服务进行通信,以便服务仅执行绝对必要的操作?

答案 1 :(得分:2)

我注意到代码没有调用LoadUserProfile,因此未加载用户个人资料。

请注意,在该功能的备注中,HKEY_CURRENT_USER仍未被替换。

认为你可以通过调用RegOverridePredefKey来解决这个问题(在调用第三方DLL之前)。

请注意,很多伏都教可能会让这一切正常工作 - 我会尽量确保在第三方通话之前尽可能晚地进行覆盖,并在之后尽快恢复(希望这只是对图书馆的一次调用。)

作为替代方案,我会认真地尝试寻找不同的第三方产品,不要求所有这些都通过篮球。