C# 使用LocalSystem服务CreateProcessAsUser启动程序相当于登录时双击图标?[丙]

C# 使用LocalSystem服务CreateProcessAsUser启动程序相当于登录时双击图标?[丙],c#,winapi,C#,Winapi,在我的公司,我们有一种产品,它几乎可以与你所能想象到的一切互动。。。注册表、数据库、设备等。。。它由许多部分组成,但整个应用程序是由一个可执行的start.exe启动的,它负责启动其他所有内容-这都是遗留代码,并在用户帐户下运行 目前,这是作为启动项目启动的,或者通过双击Windows中的桌面图标启动的,这意味着当用户登录到用户帐户时,应用程序start.exe将自动启动,在此帐户下,它拥有运行所需的所有权限,并且多年来一切正常 现在发生了变化-我编写了一个服务Serv.exe,它作为Local

在我的公司,我们有一种产品,它几乎可以与你所能想象到的一切互动。。。注册表、数据库、设备等。。。它由许多部分组成,但整个应用程序是由一个可执行的start.exe启动的,它负责启动其他所有内容-这都是遗留代码,并在用户帐户下运行

目前,这是作为启动项目启动的,或者通过双击Windows中的桌面图标启动的,这意味着当用户登录到用户帐户时,应用程序start.exe将自动启动,在此帐户下,它拥有运行所需的所有权限,并且多年来一切正常

现在发生了变化-我编写了一个服务Serv.exe,它作为LocalSystem运行-该服务负责更新我们产品的各种软件组件,工作如下: -当产品检测到更新时,它会向LocalSystem服务Serv.exe发出信号,然后自行终止 -然后,Serv.exe将执行所有更新

现在,完成所有操作后,需要通过start.exe再次自动启动产品。。。这就是我需要一些建议的地方。。。重启产品start.exe的最佳方式是什么

现在,我使用LocalSystem服务Serv.exe并模拟用户帐户,如下所示: -为用户创建环境块 -CreateProcessAsUserstart.exe作为具有相应EnvBlock的用户 -破坏环境块

但这真的100%等同于在用户帐户上下文中双击图标吗?我需要确保在用户启动时或通过模拟Serv.exe LocalSystem启动时,所有内容都是相同的-是否存在风险?我对所有数据库仍具有相同的权限/能力吗?登记处?设备交互?等等

通过加载EnvBlock,我似乎得到了我需要的一切,但是。。。这不是一个好方法吗

有点希望从专业人士那里得到一些指导和建议。。。 任何帮助或暗示都将不胜感激。 谢谢,

更新:这里是一篇名为:。这正是你要找的。首先是:

你应该做的第一件事是;不要这样做。有许多限制和不良影响和限制

因此,首先测试您当前的解决方案是否有效。这取决于流程正在做什么。如果不涉及用户交互。或者操纵当前用户会话。那么你就不需要这个复杂的解决方案了。如果你需要,祝你好运

更新前:它不是100%等效的。除了授权之外,在windows中还有会话,在每个会话中都有台式机。从服务午餐的进程将在服务会话和桌面上运行(如果服务有)。根据start.exe的功能,它可能很重要,也可能不重要


查看SetTokenInformation函数。

您可以启动launcher.exe,然后启动应用程序,而不是直接作为启动项启动应用程序。然后,该服务可以向launcher.exe发送信号,通知应用程序的另一个实例应在更新后启动。使用此方法,您不能使用服务更新launcher.exe,但此可执行文件应该非常简单,希望不需要任何更新。使用此方法可以避免尝试从服务启动交互式应用程序时遇到的所有陷阱。

但是,当我使用CreateEnvironmentBlock时,会话和桌面是否会被加载…?否。它与环境变量无关。那么-您有何建议?试图找到关于如何重新启动应用程序的适当解决方案。