gpt4 book ai didi

c# - 从作为 SYSTEM 运行的可以与用户交互的服务启动应用程序

转载 作者:可可西里 更新时间:2023-11-01 09:56:22 25 4
gpt4 key购买 nike

我目前有一个应用程序需要从我在 .net 3.5 中编写的 Windows 服务启动。该应用程序当前以运行该服务的用户身份运行,在我的例子中是 SYSTEM 用户。如果以 SYSTEM 用户身份运行,它不会将应用程序显示到用户桌面。想法?建议?

//constructor
private Process ETCHNotify = new Process();

//StartService()
ETCHNotify.StartInfo.FileName = baseDir + "\\EtchNotify.exe";
ETCHNotify.StartInfo.UseShellExecute = false;

//BackgroundWorkerThread_DoWork()
if (!systemData.GetUserName().Equals(""))
{
// start ETCHNotify
try {
ETCHNotify.Start();
}
catch (Exception ex)
{
systemData.Run("ERR: Notify can't start: " + ex.Message);
}
}

如果我编写的函数 GetUserName()(确定运行 explorer.exe 的用户的用户名)不为空,我只会执行 try/catch

再次重申:所需的功能是在允许它与由 GetUserName() 确定的当前登录用户交互的状态下启动 ETCHNotify

最佳答案

在( thisthis )附近找到的一些帖子的拼贴

请注意,从 Windows Vista 开始,严禁服务直接与用户交互:

Important: Services cannot directly interact with a user as of Windows Vista. Therefore, the techniques mentioned in the section titled Using an Interactive Service should not be used in new code.

此“功能”已损坏,传统观点认为您无论如何都不应该依赖它。服务并不旨在提供 UI 或允许任何类型的直接用户交互。由于可能存在安全风险,Microsoft 自 Windows NT 早期以来一直警告应避免使用此功能。

但是,如果您绝对必须拥有此功能,则有一些可能的解决方法。但我强烈建议您仔细考虑它的必要性,并为您的服务探索替代设计。

使用WTSEnumerateSessions找到合适的桌面,然后 CreateProcessAsUser在该桌面上启动应用程序(您将桌面句柄作为 STARTUPINFO 结构的一部分传递给它)是正确的。

但是,我强烈建议不要这样做。在某些环境中,例如具有许多事件用户的终端服务器主机,确定哪个桌面是“事件”桌面并不容易,甚至可能是不可能的。

更传统的方法是在全局启动组中为您的服务放置一个小型客户端应用程序的快捷方式。然后,此应用将与每个用户 session 一起启动,并且可用于启动其他应用(如果需要),而无需处理用户凭据、 session 和/或桌面。

关于c# - 从作为 SYSTEM 运行的可以与用户交互的服务启动应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com