我正在编写一个单声道应用程序,该应用程序旨在在启动时以 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/