C# 模拟UNIX用户和更新环境变量
我正在使用mono开发一个服务,它以特权用户的身份启动,出于安全原因模拟非特权用户。该服务通常模拟用户运行外部进程,然后切换回。但是外部进程需要特定于用户的环境变量(如“$HOME”),用户模拟不会改变这些变量 这是我用来模拟用户的代码:C# 模拟UNIX用户和更新环境变量,c#,linux,mono,environment-variables,impersonation,C#,Linux,Mono,Environment Variables,Impersonation,我正在使用mono开发一个服务,它以特权用户的身份启动,出于安全原因模拟非特权用户。该服务通常模拟用户运行外部进程,然后切换回。但是外部进程需要特定于用户的环境变量(如“$HOME”),用户模拟不会改变这些变量 这是我用来模拟用户的代码: WindowsIdentity tmpIdentity = new WindowsIdentity(user); using(WindowsImpersonationContext tmpContext = tmpIdentity.Impersonate())
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)
在模拟后/模拟时不会更改
有没有办法更新环境变量?问题是在调用过程中为流程创建了环境变量。由于模拟只是通过切换用户来伪造另一个用户,因此环境变量不会受到此更改的影响。因此,方法
System.GetEnvironmentVariable(String)
将继续返回原始环境变量。因此,更新环境变量是您必须自己做的事情
以下可能是一些解决方法:
- 模拟完成后,创建一个负责获取环境变量的新流程
- 解析OS资源以自己获取值(registery、/etc/passwd等)
- 如果您确切知道要模拟哪些用户,则可以使用配置文件