【问题标题】:Running a process as the current user from a SYSTEM process从 SYSTEM 进程以当前用户身份运行进程
【发布时间】:2009-12-03 18:53:57
【问题描述】:

这是场景:

我有一个服务 (#1) 作为本地系统运行,它最终会运行一个更新应用程序 (#3) 的进程 (#2)。这个进程(#2),更新程序,也必须作为 LOCAL SYSTEM 运行,这里没问题,因为它需要重写一些文件(#3)。

当更新程序以本地系统启动时,它将杀死我的应用程序的任何正在运行的实例 (#3)。文件更新后,我需要以当前登录的帐户再次启动更新后的应用程序(#3)。

我该怎么办?我的想法在概念上有什么错误吗?

更新 更新程序杀死应用程序只是为了替换文件。

【问题讨论】:

  • 您能否解释一下为什么更新程序会杀死用户可见的应用程序(#3)?为什么不让应用程序监视更新程序将更改的目录?

标签: c# service


【解决方案1】:

我认为该服务没有办法获得它需要调用 CreateProcessAsUser() API 函数的 WindowsIdentity.Token 句柄。除非应用本身提供。

有一个更好的方法,您不必终止应用程序来替换它的可执行文件。您所要做的就是重命名它们。然后,您可以将更新到位并发出信号让应用程序自行重启。这种方法的另一个好处是应用程序会自动关闭(包括通知用户)而不是被粗暴地中止。当您看到进程终止时清理重命名的文件。

【讨论】:

  • 我怎样才能轻松地向应用发出信号让其自行重启?
  • 这个线程是一个相当不受欢迎的节日。你投反对票了吗?
  • 我会按照您的建议创建一个新线程!谢谢
【解决方案2】:

如果您有权访问用户的凭据,则可以使用 Process.Start 和 ProcessStartInfo 指定用户的用户名和密码。

如果您不知道凭据,那么我不确定是否可以完成。

解决方法可能是让服务与您的程序通信,要求它自行关闭,但在这样做之前,它应该启动一个单独的小程序。这应该在后台运行,但它将使用当前用户的凭据运行。完成后,让后台程序重新启动您的主程序,然后退出。

【讨论】:

    【解决方案3】:

    一个问题是知道“登录用户”。 XP 及以上支持快速用户切换,可同时登录多个用户(vista 及以上支持此功能,即使机器是域成员)。

    这里是 Raymond Chen 讨论该问题的博客文章的链接:http://blogs.msdn.com/oldnewthing/archive/2006/08/22/712677.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      相关资源
      最近更新 更多