C# 从系统进程以当前用户身份运行进程

C# 从系统进程以当前用户身份运行进程,c#,service,C#,Service,这是一个场景: 我有一个服务(#1)作为本地系统运行,它最终将运行一个更新应用程序(#3)的进程(#2)。这个进程(#2)即更新程序,也必须作为本地系统运行,这里没有问题,因为它需要重写一些文件(#3) 当更新程序作为本地系统启动时,它将杀死我的应用程序(#3)的任何正在运行的实例。更新文件后,我需要再次启动更新后的应用程序(#3)作为当前登录帐户 我该怎么办?我的想法在概念上有什么错误吗 已更新 更新程序杀死应用程序只是为了替换文件。如果您有权访问用户的凭据,则可以使用Process。从Pro

这是一个场景:

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

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

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

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

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

如果你不知道这些证书,那么我不确定是否可以做到


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

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


以下是Raymond Chen的一篇讨论此问题的博客文章的链接:

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


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

您能否澄清为什么更新程序进程会杀死用户可见的应用程序(#3)?为什么不让应用程序监视更新程序将要更改的目录?我怎样才能轻松地向应用程序发出重新启动的信号?这个线程是一个相当失败的投票fest。是你投了反对票吗?我会按照你的建议创建一个新的线程!谢谢