LocalSystem 服务如何以用户身份运行应用程序 [C#]?
Posted
技术标签:
【中文标题】LocalSystem 服务如何以用户身份运行应用程序 [C#]?【英文标题】:How a LocalSystem Service can run an application as a user [C#]? 【发布时间】:2009-09-14 16:19:17 【问题描述】:在我的本地计算机上,我正在运行一个名为 Serv.exe 的 LocalSystem 管理 C# 服务,它执行各种任务。它需要执行的任务之一是在 USER 帐户(当前登录)下启动应用程序,而不是以管理员身份启动应用程序 - 因为这违反了安全性。
显而易见的解决方案是在启动应用程序时进行简单的模拟 - 但是我遇到了一个小问题,而我没有获得用户帐户凭据(用户名和密码)的特权,因此无法以传统方式进行模拟。
那么,在登录到用户帐户时使用作为 LocalSystem 运行的 C# 服务 - 无论如何我可以以该用户身份启动应用程序吗?
来自 cmets: 发生的情况是应用程序本身要求服务完成一项工作,然后终止。当工作完成时,应用程序必须自行重新启动 - 我认为最好的方法是让服务在完成后重新启动它......
任何帮助将不胜感激。 谢谢,
【问题讨论】:
不管怎样,您都在寻求一种破坏安全性的方法。也许你可以想出一个替代的解决方案。 嗯 - 发生的事情是应用程序本身要求服务做一项工作,然后终止。当工作完成后,应用程序必须自行重新启动 - 我认为最好的方法是让服务在完成后重新启动它......还有其他建议吗? 【参考方案1】:您可以使用 Windows 调度程序以用户身份启动您的应用程序。
看看这个包装器 - http://www.firatatagun.com/c-windows-task-scheduler-wrapper-classes-c-sharp/2010/04/22/
然后您可以简单地创建一个计划任务来立即运行您的软件,然后您可以在 2 秒后删除这个多余的任务。
示例代码:
using (TaskService ts = new TaskService())
// Create a new task
const string taskName = "RunMyProcessNowAsUser";
Task t = ts.AddTask(taskName,
new TimeTrigger() StartBoundary = DateTime.Now, Enabled = false ,
new ExecAction("YourProcess.exe");
t.Run();
// delete the task after 2 seconds.
new Action(() =>
Thread.Sleep(2000);
using (TaskService ts2 = new TaskService())
ts2.RootFolder.DeleteTask(taskName);
).BeginInvoke(null, null);
【讨论】:
【参考方案2】:您可以让应用程序等待然后重新启动,而不是通过这种方式破坏安全性。请参阅this SO question 和this one。
【讨论】:
我明白了 - 但不确定这是否适合我 - 我有一项服务可以完成一项工作,而在执行工作时,应用程序必须关闭,当工作完成时应用程序必须启动。因此,使用第二个应用程序意味着我的 Service musr 以某种方式与它通信以重新启动主应用程序 - 似乎需要大量开销......但如果这是标准方法,我将进行调查。 您可以将原始应用程序设置为两阶段事务,如果服务器繁忙,则第一阶段等待。 遗憾的是,我无法对原始应用程序进行任何根本性更改,因为它是运行旧 C++ 的遗留软件,我无权访问... 那么您将需要一个监控应用程序。也可以使它更健壮。 如何: • 通过使用 CreateRestrictedToken、DuplicateToken 或 DuplicateTokenEx 复制现有令牌。 •通过从另一个进程或线程打开令牌,已经以用户身份登录,使用 OpenProcessToken 或 OpenThreadToken以上是关于LocalSystem 服务如何以用户身份运行应用程序 [C#]?的主要内容,如果未能解决你的问题,请参考以下文章