【问题标题】:Process.MainModule enumeration fails when ran as service作为服务运行时,Process.MainModule 枚举失败
【发布时间】:2017-12-26 18:50:07
【问题描述】:

我正在编写一个服务,我需要在其中获取当前处于活动状态的进程的文件名。

我有类似于下面的代码(我已经去掉了完整性检查)

Process currentProcess = GetActiveProcess();
ProcessModule currentModule = currentProcess.MainModule;
string FileName = currentModule.FileName.ToLower();

当我编译它并作为一个 winforms 应用程序运行时,它就像一个魅力。

但是,当我将完全相同的代码作为服务运行时(无论我作为 LocalSystem 用户运行服务还是作为应用程序运行代码的管理员用户),它都会在第二行引发异常:

无法枚举进程模块

我已经尝试过:

  • 添加:

    [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
    [HostProtectionAttribute(SecurityAction.LinkDemand, SharedState = true, Synchronization = true, ExternalProcessMgmt = true, SelfAffectingProcessMgmt = true)]
    [PermissionSetAttribute(SecurityAction.InheritanceDemand, Name = "FullTrust")]
    class WindowsService : ServiceBase
    
  • 设置服务以管理员用户身份启动

  • 添加到 app.manifest:

    <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
    

这些都不起作用。 我需要做什么才能获得 MainModule?

【问题讨论】:

  • 你得到什么特定的异常类型?你看过this吗?
  • 是的,我愿意。异常是 Win32Exception 但对我来说没有意义,因为我已经在 Windows XP 32bit 和 Windows 7 32bit 上检查过它。
  • 我检查了其他从 Process 获取文件名的方法,结果相同,错误略有不同 - 访问被拒绝。即使服务使用管理员凭据运行。因此,可以肯定的是,作为服务是无法访问 Process.MainModule 的一个原因。

标签: c# service process


【解决方案1】:

从 Vista 开始,服务就被禁止与桌面交互。 Afaik 是一项确保他们不会绕过 UAC 的措施。

并且无法访问桌面(不是interactive session)可能会导致任何问题,尤其是用于 Office 文件处理的旧 CoM 类。

所以这是我能给你的最好的东西,如果你不告诉我们正在发生/没有发生的事情(特别是错误消息)。但是 WinForms/Service 的差异使得这成为可能的原因。

【讨论】:

  • 我在 Windows 7 和 Windows XP 上都试过了,结果是一样的,所以不是因为 UAC。但是当我检查它可能与桌面交互的服务属性时,我的服务在启动时崩溃
  • 这似乎是解决类似情况的方法。也许它可以帮助你进一步? stackoverflow.com/a/9502058/3346583
  • 很遗憾没有。我的应用在 32 位操作系统中是 32 位的,当我将它作为应用程序运行时它工作正常,当我将它作为服务运行时问题就开始了。
  • 此解决方案的首要任务之一是解释这是来自 Windows 本身(.NET 代码之外)的错误消息以及您如何需要精确信息(本机代码错误),否则它是几天的猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多