c# - 模拟 UNIX 用户并更新环境变量

标签 c# linux mono environment-variables impersonation

我正在使用 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) 在模拟之后/期间不会改变

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

最佳答案

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

这里可能有一些方法可以解决这个问题:

  • 模拟后,创建一个新进程负责获取环境变量
  • 解析操作系统资源以自行获取值(注册表、/etc/passwd 等)
  • 如果您确切知道哪些用户将被模拟,则可以使用配置文件

关于c# - 模拟 UNIX 用户并更新环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17013554/

相关文章:

linux - 如何从本地主机连接到 docker 容器

Linux 中 C/Socket 编程中的聊天室

c# - VS2010 上的单声道?

c# - 从字节数组 C# 中读取特定字节

c# - 如何在查询 C# 中检查开始日期和结束日期之间的多个日期

c++ - xterm:无法 execvp:没有文件或目录

c# - Mono Apache2 HttpWebRequest 崩溃并显示 "The request timed out"

c# - Azure ICollector 重载不不同的实例

c# - 使用 opencf.net.ftp 在 c# 中使用 ftp 上传/下载 for windows mobile 6.5

asp.net - 基本的 Mono 安装不起作用