如何在运行时找到作为 Windows 服务运行的 exe 的位置?
8 回答
使用注册表查找:
例如
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\' + ServiceDisplayName;
然后读取ImagePath
值。
以编程方式还是使用工具?
在后一种情况下,我建议使用 Sysinternals 的Process Explorer:它显示所有正在运行的进程,包括服务,其中一个字段是用于运行进程的命令行,包括完整路径。
他们的命令行实用程序PsService也很有用。
.NET - Assembly.GetExecutingAssembly().Location
(其他人建议Application.ExecutablePath
,但这需要引用System.Windows.Forms
,服务通常不需要)
本国的 -GetModuleFileName(NULL, ...)
如果这是 .NET,您需要Application.ExecutablePath(如果您尝试获取正在运行的 Windows 服务自己的应用程序路径)。如果您试图获取其他一些正在运行的 Windows 服务的路径,那就另当别论了。
如果您的可执行文件将自身附加到特定端口,您可以解析输出
netstat -ab
可能不是最有吸引力的解决方案。
如果您不使用 .NET,最直接的方法是使用 Win32 的::QueryServiceConfig()函数。这将为您提供路径名称、显示名称以及有关服务的各种其他信息。
对于本机 Windows 代码:EXE 中的 GetModuleFileName(NULL...)(例如,不在服务加载的 DLL 中)。
通常它们在 windows\system32 下运行,即使您可能已将其安装在另一个驱动器上