从SYSTEM进程作为当前用户运行进程

时间:2009-12-03 18:53:58

标签: c# service

这是情景:

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

当更新程序以LOCAL SYSTEM启动时,它将终止我的应用程序的任何正在运行的实例(#3)。在更新文件之后,我需要再次启动更新的应用程序(#3)作为当前记录的帐户。

我怎么能管理这个?我的想法中有什么概念上的错误吗?

已更新 更新程序会杀死应用程序以替换文件。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

一个问题是知道“登录用户”。 XP及更高版本支持快速用户切换,其中可以同时登录多个用户(即使计算机是域成员,vista也支持此功能)。

以下链接指向讨论此问题的Raymond Chen博客文章:http://blogs.msdn.com/oldnewthing/archive/2006/08/22/712677.aspx