【问题标题】:How a LocalSystem Service can run an application as a user [C#]?LocalSystem 服务如何以用户身份运行应用程序 [C#]?
【发布时间】:2009-09-14 16:19:17
【问题描述】:

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

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

那么,在登录到用户帐户时使用作为 LocalSystem 运行的 C# 服务 - 无论如何我可以以该用户身份启动应用程序吗?

来自 cmets:
发生的情况是应用程序本身要求服务完成一项工作,然后终止。当工作完成时,应用程序必须自行重新启动 - 我认为最好的方法是让服务在完成后重新启动它......

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

【问题讨论】:

  • 不管怎样,您都在寻求一种破坏安全性的方法。也许你可以想出一个替代的解决方案。
  • 嗯 - 发生的事情是应用程序本身要求服务做一项工作,然后终止。当工作完成后,应用程序必须自行重新启动 - 我认为最好的方法是让服务在完成后重新启动它......还有其他建议吗?

标签: c# .net


【解决方案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 questionthis one

    【讨论】:

    • 我明白了 - 但不确定这是否适合我 - 我有一项服务可以完成一项工作,而在执行工作时,应用程序必须关闭,当工作完成时应用程序必须启动。因此,使用第二个应用程序意味着我的 Service musr 以某种方式与它通信以重新启动主应用程序 - 似乎需要大量开销......但如果这是标准方法,我将进行调查。
    • 您可以将原始应用程序设置为两阶段事务,如果服务器繁忙,则第一阶段等待。
    • 遗憾的是,我无法对原始应用程序进行任何根本性更改,因为它是运行旧 C++ 的遗留软件,我无权访问...
    • 那么您将需要一个监控应用程序。也可以使它更健壮。
    • 如何: • 通过使用 CreateRestrictedToken、DuplicateToken 或 DuplicateTokenEx 复制现有令牌。 •通过从另一个进程或线程打开令牌,已经以用户身份登录,使用 OpenProcessToken 或 OpenThreadToken
    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    相关资源
    最近更新 更多