首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模拟用户

模拟用户
EN

Stack Overflow用户
提问于 2013-01-08 21:45:51
回答 2查看 2.8K关注 0票数 7

我们正在开发C# .NET windows服务。

我们的服务在system帐户下运行,并且我们试图模拟登录的用户用户。模拟工作正常,即在模拟后调用System.Security.Principal.WindowsIdentity.GetCurrent()时,我们得到正确的用户' user‘。

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

有没有一种完全模拟不同用户的方法?我知道我们可以使用LoadUserProfile来获取特定的用户配置文件,但这对我们来说并不好,因为我们正在运行一个使用当前用户配置文件的第三方dll。

我们的模拟代码是基于this

EN

回答 2

Stack Overflow用户

发布于 2013-01-08 22:45:56

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

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

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

你还可以计算出他们通常的环境是什么,因为这是在HKCU的关键字" environment“下。您只需要将其与系统环境相结合。

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

然而,您还没有说明为什么要这样做。听起来您已经决定将此作为更大问题的解决方案的一部分。如果可能,我建议您看看是否有一种方法可以在根本不了解用户环境或HKCU的情况下完成所需的操作。

为什么DLL不能直接在用户自己的会话中运行?为什么需要一项服务呢?您是否可以重新设计您的解决方案,以便有一个在登录会话中运行并托管第三方DLL的用户模式部分,并且它与服务进行通信,以便服务只执行绝对需要的操作?

票数 3
EN

Stack Overflow用户

发布于 2013-01-08 22:37:38

我注意到代码没有调用LoadUserProfile,所以没有加载用户配置文件。

请注意,在该函数的备注中,HKEY_CURRENT_USER仍然没有被替换。

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

请注意,可能会涉及到很多巫毒,才能让这一切正常工作-我会尝试确保覆盖在第三方调用之前尽可能晚发生,并在第三方调用之后尽快恢复(希望这都是对库的一次调用)。

作为另一种选择,我会认真地尝试寻找不同的第三方产品,它不需要所有这些跳跃的圈套。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14216311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档