【问题标题】:How can I have a service run a process under the current user's session?如何让服务在当前用户的会话下运行进程?
【发布时间】:2011-04-11 20:49:40
【问题描述】:

我有一个用 C# 编写的服务,它监视一组文件。如果其中一个文件的修改时间超过 4 小时,它使用 Growl 通知最终用户。我见过 Growl.exe 没有在当前用户的会话下运行的情况,因此他们没有收到更新。我希望我的服务检查以确保 Growl 正在运行(Growl.exe 或者我可以在某处查找应用程序 ID?),如果没有,则启动它。如何确保 Growl 始终在运行此服务的任何机器上的当前用户会话中运行?

【问题讨论】:

  • 什么是“当前用户”?从服务的角度来看,它是运行服务的用户(即本地系统、LocalService 等)。如果您的意思是当前的 interactive 用户,是哪一个?可能有几个打开的交互式会话(例如,如果它是终端服务器)...
  • Session 0 是一个合理的假设。我愿意将此限制为物理控制台上的用户。我应该提一下,目前只有 Windows 客户端机器正在运行它。它不太可能在服务器上运行。
  • 请记住,Windows 的桌面版本也可以通过快速用户切换同时拥有多个用户。
  • 这是一个非常好的观点 Mystere。以后我一定会牢记这一点。

标签: c# service interop growl


【解决方案1】:

如果服务需要以当前用户身份运行,那为什么要让它成为服务呢?服务的目的是始终运行,即使用户未登录。因此,它旨在始终作为特定用户运行。

为什么不把它转换成用户登录时运行的程序呢?

【讨论】:

  • 不是需要以当前用户身份运行的服务。这是咆哮(www.growlforwindows.com)。将监控应用程序作为服务运行可以更轻松地从后端进行管理。我相信它也会让我更容易在未来运行它的不同机器之间实现心跳,这是我想做的事情。
  • 服务不应与桌面交互。这会导致各种安全漏洞,最新版本的 Windows 已采取措施缓解这些漏洞。这些步骤使与桌面交互的服务非常烦人。您当然可以检查某个应用程序是否正在运行,甚至可能发现它是否在当前交互式用户桌面上运行.. 但是在该桌面上启动应用程序只是一个巨大的安全漏洞。您必须运行一些可以通知用户的用户模式应用程序。
  • 我想你是对的。在用户会话下启动应用程序可能不是好的形式。您提到有一个正在运行的应用程序可以通知用户。我已经在使用 Growl 做到这一点。我要避免的是 Growl 崩溃或用户终止它的情况。我的想法是让服务在崩溃或被终止时重新启动 Growl。
  • 嗯,你可以有一个小的看门狗进程,当用户登录时启动,它会自动启动咆哮,并监控它。请注意,这种行为非常类似于恶意软件,有些用户可能不喜欢它。
  • 只要不触发杀毒软件,我都可以。此监控应用程序对于业务连续性至关重要。我会调查的。谢谢。
【解决方案2】:

这是一个有趣的问题,但看起来你不能像这篇帖子suggests那样做这个。似乎您可以指定该服务作为本地系统服务运行,或者作为特定用户运行:

【讨论】:

    【解决方案3】:

    如果您的服务是以“自动”方式启动的,那么您只能为该服务预先配置一组凭据。但是,如果您可以识别服务在启动时调用的 .exe 文件,那么您可以创建一个批处理文件,该文件将在登录时启动该服务,此时将默认使用活动用户凭据。

    干杯,

    CEC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多