c# - 模拟用户

标签 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

最佳答案

如您所见,模拟不会设置 HKEY_CURRENT_USER 或环境。

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

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

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

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

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

为什么DLL不能直接在用户自己的session中运行呢?为什么需要服务?您能否重新构建您的解决方案,以便有一个用户模式部分在登录 session 中运行并托管第三方 DLL,并与服务通信,以便该服务仅执行绝对需要的操作?

关于c# - 模拟用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14216311/

相关文章:

c# - 如何使用类验证属性在属性上动态设置验证消息

c# - 静态类可以具有静态类类型的属性吗?

c# - 如何防止 WCF 客户端应用程序中的 BufferManager/PooledBufferManager 浪费内存?

.net - 无法安装使用 VS2010 构建的针对框架 3.5 的 MSI

c# - Windows 服务(TCP 客户端/监听器)防火墙异常阻止流量

c# - 如何允许用户编辑 Program Files 下的 App.config 是记事本或其他编辑器?

c# - 具有相似签名的多个网络方法

c# - "Root element not found"- 读取内存流时

.net - Math.Round(double,decimal) 是否总是返回一致的结果

c# - 这是对 ThreadPool 的适当使用吗?我能确定它会为每个任务启动一个线程吗?