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#]?的主要内容,如果未能解决你的问题,请参考以下文章

从 LocalSystem 服务运行非可视 GUI 应用程序

以提升用户身份在 wix 中运行 CustomAction

如何以与 Windows 服务不同的用户身份运行进程

以不同用户身份运行应用程序

Install4j 以本地用户而不是域用户身份运行服务

如何在 IntelliJ 中以不同用户身份运行 JAR 应用程序?