我正在使用 Windows 服务内部运行一个进程
ProcessStartInfo processStartInfo = new ....
Process.Start(processStartInfo);
问题是,如果我在本地系统帐户下运行服务,它运行正常,但它不显示程序的窗口。我尝试将用户凭据放入服务属性中,但随后“允许服务与桌面交互”复选框变为禁用状态。
我真的需要运行从服务调用它的应用程序,我真的需要查看应用程序的窗口。
请帮帮我。
UPD。好吧,您使用重载版本的 Process.Start 需要用户名、密码和域 - 它会将程序拉到桌面。但现在它在一个凭据下启动应用程序,但在不同用户的桌面上显示。怎么会?
UPD2:我有个主意!我可以使用 Sysinternals Suite 中的 psexec.exe。但问题是我需要“以管理员身份”默默地启动那个东西。而且我不知道怎么做。我的意思是即使您已经拥有管理员权限,有时您也必须手动说“以管理员身份运行”,确认 UAC,然后才可以开始使用。我不知道不带 UAC 的东西如何默默地运行一些东西....
UPD3:亲爱的主。我有那个东西!最后。
行。一开始,问题确实出在会话 0 隔离中。所以我需要构建一个可以从服务启动的中间应用程序,然后该应用程序又假设通过 RPC 启动我的应用程序并将其带到桌面。我决定使用 psexec 工具而不是构建中间层应用程序(无论如何它完全按照我需要的方式工作 - 通过 RPC)。当我尝试在本地系统帐户下使用该工具时,由于某种原因它不起作用。然后我意识到-原因是MS在每个pstool中都放了该死的EULA弹出对话框,并且无法单击按钮以在本地系统帐户下确认对话框。所以解决方案是在注册表中创建一个密钥 HKU.DEFAULT\Software\Sysinternals\PsExec 与 DWORD 值 EulaAccepted = 1
万岁,现在可以了!但!现在我需要把程序带到当前登录用户的屏幕上。为此,我需要会话 ID!
所以问题是:如何获取当前登录用户的会话 ID?如果还没有人登录会发生什么?那会是什么会话ID?
UPD4:就是这样!我得到了那个!
[DllImport("Kernel32.dll", EntryPoint = "WTSGetActiveConsoleSessionId")] public static extern int WTSGetActiveConsoleSessionId();
谢谢你们!