c# - 以 root 身份运行时以用户身份启动外部进程

标签 c# linux mono

我正在编写一个单声道应用程序,该应用程序旨在在启动时以 root 身份运行( Upstart + 单声道服务)并监听用户登录/注销事件。当用户登录时,我启动另一个单声道服务来监听 session 事件。但它不应以 root 身份运行,而应以 session 所有者身份运行。我可以访问 session 所有者的名称、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;
}

这种方法靠谱吗?或者有更好的吗?

最佳答案

这将以用户 alice 运行 echo hello:

sudo su alice -c 'echo hello'

关于c# - 以 root 身份运行时以用户身份启动外部进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32983050/

相关文章:

javascript - 无法使用外部 Url 加载 div

linux - 使用 Expect 填写多行提示

c++ - omp_init_lock(omp_lock_t*) - 这个函数究竟做了什么?

c# - Monomac System.Net.WebRequest 的类型初始值设定项所显示的异常

c# - 为什么向结构体添加一个额外的字段会大大提高其性能?

c# - 如何在 Windows 应用程序中将 Dataset 绑定(bind)到 DataGridView

c# - 关闭应用程序后,VS 继续调试 session 意味着内存泄漏?

c# - Timers Event 的委托(delegate)是否作为线程安全进程调用?

linux - 使用 bash 将文件夹名称重命名为文件名

http - 建立 SSE 连接后,SignalR 服务器立即关闭与 Unity 客户端的连接