我正在撰写一项服务,其中我需要获取一个过程文件名,然后才能激活。
我的代码类似于下面的代码(我已经删除了完整性检查)
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?
答案 0 :(得分:0)
自Vista以来,服务被禁止与桌面交互。 Afaik采取措施确保他们不会规避UAC。
无法访问桌面(不是interactive session)可能会导致几乎任何问题,特别是旧的CoM Classes for Office File处理。
如果您没有告诉我们正在发生/未发生的事情(特别是错误消息),那么这是我能给您的最好的事情。但WinForms / Service差异使这成为可能的原因。