2

我正在使用单声道服务,出于安全原因,它以特权用户身份启动并模拟非特权用户。该服务经常模拟用户运行外部进程,然后切换回来。但是外部进程需要用户特定的环境变量(如“$HOME”),这些变量不会被用户模拟更改。

这是我用来模拟用户的代码:

WindowsIdentity tmpIdentity = new WindowsIdentity(user);
using(WindowsImpersonationContext tmpContext = tmpIdentity.Impersonate()) {
    //run process here
}

我还尝试在生成进程之前运行以下代码,但没有影响:

Environment.SetEnvironmentVariable("HOME",Environment.GetFolderPath(Environment.SpecialFolder.Personal),EnvironmentVariableTarget.Machine);

Environment.GetFolderPath(Environment.SpecialFolder.Personal) 在模仿之后/期间不会改变

有没有办法更新环境变量?

4

1 回答 1

2

问题是在调用过程中会为其创建环境变量。由于模拟只是通过切换用户Access Token来伪造另一个用户,因此环境变量不会受到此更改的影响。因此,该方法System.GetEnvironmentVariable(String)将继续返回原始环境变量。因此更新环境变量是您必须自己做的事情。

这里可能有一些方法:

  • 模拟后,创建一个负责获取环境变量的新进程
  • 解析操作系统资源以自己获取值(注册、/etc/passwd 等)
  • 如果您确切知道要模拟哪些用户,则可以使用配置文件
于 2013-06-10T07:51:21.980 回答