【发布时间】: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;
}
这是一种可靠的方法吗?还是有更好的?
【问题讨论】: