【问题标题】:Launch external process as user while running as root在以 root 身份运行时以用户身份启动外部进程
【发布时间】:2015-10-07 02:55:43
【问题描述】:

我正在编写一个单声道应用程序,该应用程序旨在在启动时以 root 身份运行(新贵 + 单声道服务)并监听用户登录/注销事件。当用户登录时,我启动另一个单声道服务来监听会话事件。但它不应以 root 身份运行,而应以会话所有者身份运行。我可以访问会话所有者的名称、uid、gid。

我的问题有点类似于 Start a process as user from an process running as admin ,但适用于 linux。

那么如何以指定用户身份运行外部进程,同时从 root 正常运行?

编辑:

这是我的解决方案:

根据http://pages.infinit.net/ctech/20040405-1133.html,我尝试在启动进程时模拟用户,并且我现在可以看到它运行良好。

public class SpawnerService : ServiceBase
{
    public SpawnerService ()
    {
        logger = new StreamWriter (new FileStream("/home/username/Log.txt", FileMode.Append));

        info = new ProcessStartInfo {
            FileName = "/usr/bin/mono-service",
            Arguments = "/home/username/SlaveService.exe",
            UseShellExecute = false,
            CreateNoWindow = true
        };
    }

    protected override void OnStart (string[] args)
    {
        logger.WriteLine ("Spawner service started");
        logger.Flush ();

        var user = new WindowsIdentity ("username");
        logger.WriteLine ("Trying to mimc to {0}, {1}", user.Name,user.Token.ToString());
        logger.Flush ();

        WindowsImpersonationContext wic = null;
        try {
            wic = user.Impersonate ();
            Process.Start (info);
            logger.WriteLine ("Seems allright");
            logger.Flush ();
        }
        catch (Exception) {
            logger.WriteLine ("Seems failed");
            logger.Flush ();
        }
        finally {
            if (wic != null) {
                wic.Undo ();
                wic = null;
            }
        }
    }

    protected override void OnStop ()
    {
        logger.WriteLine ("Spawner service stopped");
        logger.Flush ();
    }

    private ProcessStartInfo info;
    private StreamWriter logger;
}

这是一种可靠的方法吗?还是有更好的?

【问题讨论】:

    标签: c# linux mono


    【解决方案1】:

    这将以用户alice 的身份运行echo hello

    sudo su alice -c 'echo hello'
    

    【讨论】:

    • 这确实是一个选择,谢谢!但我不太确定System.Diagnostics.Process 将如何处理这样的链:sudo su username -c mono-service /home/username/App.exe。据我所知,它的语法是 ("application","parameters")
    • Proccess("sudo", "su username -c mono-service /home/username/App.exe") 也许?或者/usr/bin/sudo。顺便问一下,你确定你在运行 linux 吗? .exe文件扩展名通常只在windows中使用。
    【解决方案2】:

    这可以通过使用su-c 参数并指定您希望用户运行的命令来完成。

    "-c, --command COMMAND
           Specify a command that will be invoked by the shell using its -c."
    
    
    su someuser -c "touch someusersfile"
    
    ls -la someusersfile
    

    ls -la 的输出应如下所示: -rw-r--r-- 1 someuser someuser 0 Oct 6 22:22 mynewfile

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2017-04-07
      • 1970-01-01
      • 2011-10-03
      • 2013-06-09
      • 2017-07-08
      相关资源
      最近更新 更多