2009-09-14 203 views
1

在我的本地机器上,我运行一个名为Serv.exe的执行各种任务的LocalSystem管理c#服务。它需要执行的任务之一是在USER帐户(当前登录)下启动应用程序,而不是管理员 - 因为这违反了安全性。LocalSystem Service如何以用户身份运行应用程序[C#]?

启动应用程序时,显而易见的解决方案是简单的模拟 - 但是我遇到了一个小问题,但我没有获得用户帐户凭据的权限(用户名为&密码),因此无法以传统方式模拟。

因此,在登录到用户帐户时使用以LocalSystem身份运行的C#服务 - 是否可以以该用户身份启动应用程序?

来自评论:
发生什么事是应用程序本身要求服务做一项工作,然后终止。当工作有用时,应用程序必须重新启动 - 我认为最好的办法是在服务完成后让服务重新启动...

任何帮助将不胜感激。 谢谢,

+0

这种或那种方式,你所要求的一种方式来破坏安全性。也许你可以想出一个替代解决方案。 – 2009-09-14 16:30:46

+0

那么 - 发生的事情是,应用程序本身要求服务做一项工作,然后终止。当工作有用时,应用程序必须重新启动 - 我认为最好的方法是在服务完成后让服务重新启动它... 其他建议? – Shaitan00 2009-09-14 16:33:41

回答

0

而不是通过这种方式违反安全性,你可以让应用程序等待,然后重新启动自己。见this SO questionthis one

+0

我明白了 - 但不知道这是否适用于我 - 我有一个可以完成工作的服务,而在执行工作时,应用程序必须关闭,当工作完成时,应用程序必须启动。 因此,使用第二个应用程序意味着我的Service musr以某种方式与它通信以重新启动主应用程序 - 看起来像是大量的开销......但如果这是我将要调查的标准方法。 – Shaitan00 2009-09-14 16:45:58

+0

如果服务器繁忙,您可以将原始应用程序设置为第一阶段等待的两阶段事件。 – 2009-09-14 16:55:34

+0

可悲的是,我无法对原始应用程序进行任何根本性更改,因为它是运行旧C++的旧版软件,我无法访问它... – Shaitan00 2009-09-14 17:26:05

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); 

     } 
相关问题