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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了作为服务运行时,Process.MainModule枚举失败相关的知识,希望对你有一定的参考价值。

我正在写一个服务,我需要获得一个进程的文件名。

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

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?

答案

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

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

如果你没有告诉我们发生了什么/没有发生什么(特别是错误信息),那么这是我能给你的最好的东西。但WinForms / Service差异使这成为可能的原因。

以上是关于作为服务运行时,Process.MainModule枚举失败的主要内容,如果未能解决你的问题,请参考以下文章

VBScript 的问题 - 作为服务运行时的 RegRead

当应用程序作为服务运行时,AcceptSecurityContext 失败

当 XAMPP 作为服务运行时,页面无法连接 ODBC 服务器(在 Windows Server 2008 上)

当我在 android 应用程序上将位置作为服务运行时出错

作为 Windows 服务运行时,如何增加 Tomcat 7 的内存?

.bat 文件在应用程序作为 Windows 服务执行时未运行