作为服务运行时,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 上)