我正在使用mono进行服务,该服务以特权用户身份启动,并出于安全原因冒充非特权用户。该服务通常模拟用户运行外部进程然后切换回来。但外部进程需要特定于用户的环境变量(如“$ 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)
在模仿之后/期间不会改变
有没有办法更新环境变量?
答案 0 :(得分:2)
问题是在调用过程中为进程创建了环境变量。由于模拟只是通过切换用户Access Token来伪造其他用户,因此环境变量不会受到此更改的影响。因此,方法System.GetEnvironmentVariable(String)
将继续返回原始环境变量。因此,您必须自己更新环境变量。
这可能有以下几种方法: