Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模拟UNIX用户和更新环境变量_C#_Linux_Mono_Environment Variables_Impersonation - Fatal编程技术网

C# 模拟UNIX用户和更新环境变量

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())

我正在使用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)
在模拟后/模拟时不会更改


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

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

以下可能是一些解决方法:

  • 模拟完成后,创建一个负责获取环境变量的新流程
  • 解析OS资源以自己获取值(registery、/etc/passwd等)
  • 如果您确切知道要模拟哪些用户,则可以使用配置文件

是的,我担心我必须这样做。然后我让用户创建一个列表。谢谢