【问题标题】:Impersonating UNIX User and update environment variables模拟 UNIX 用户并更新环境变量
【发布时间】:2013-06-05 11:58:53
【问题描述】:

我正在开发一个带有单声道的服务,该服务以特权用户身份启动,并出于安全原因模拟非特权用户。该服务经常模拟用户运行外部进程,然后切换回来。但是外部进程需要用户特定的环境变量(如“$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) 在模拟之后/期间不会改变

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

【问题讨论】:

    标签: c# linux mono environment-variables impersonation


    【解决方案1】:

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

    这里可能有一些方法:

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

    【讨论】:

    • 是的,我担心我必须这样做。我会让用户创建一个列表。谢谢!
    猜你喜欢
    • 2011-01-28
    • 2020-04-19
    • 2020-12-14
    • 2023-02-15
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多