作为服务运行时,Process.MainModule枚举失败

时间:2017-12-26 18:50:08

标签: c# service process

我正在撰写一项服务,其中我需要获取一个过程文件名,然后才能激活。

我的代码类似于下面的代码(我已经删除了完整性检查)

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?

1 个答案:

答案 0 :(得分:0)

自Vista以来,服务被禁止与桌面交互。 Afaik采取措施确保他们不会规避UAC。

无法访问桌面(不是interactive session)可能会导致几乎任何问题,特别是旧的CoM Classes for Office File处理。

如果您没有告诉我们正在发生/未发生的事情(特别是错误消息),那么这是我能给您的最好的事情。但WinForms / Service差异使这成为可能的原因。