默认情况下,Windows 服务在 sytem32 目录中启动(通常是C:\WINDOWS\system32
)。
有没有办法设置不同的工作目录?我正在考虑下面的一些注册表参数HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
。
那么 - 这可以做到吗?
默认情况下,Windows 服务在 sytem32 目录中启动(通常是C:\WINDOWS\system32
)。
有没有办法设置不同的工作目录?我正在考虑下面的一些注册表参数HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
。
那么 - 这可以做到吗?
SetCurrentDirectory
您可以在进程启动后使用 DLL 注入进行调用。这将需要您构建一个注入器应用程序,以及要注入的 DLL。存在一些教程;可能我发现的最好的两个是:你需要相当多的 C++ 编程背景(和一个工作的构建环境)才能通过它。
但是,这假定服务正在查看当前目录。另一种可能性是它正在使用
%path%
. 你说它“从 开始system32
,尝试更多的位置,最终是它自己的目录”,所以这对我来说似乎更有可能。将您看到的目录
procmon
与您的%path%
. 如果它们相同,请考虑修改运行服务的用户的SYSTEM %path%
或%path%
,以便首先搜索您希望它搜索的目录。不过,我相信 Fred 是对的——除非这种情况非常频繁地发生,否则您不太可能通过执行这些操作看到任何显着的性能优势。简单的文件打开操作并不是特别昂贵,特别是如果它是本地路径并且文件实际上并不存在。
在 Service 主函数中执行此操作:
GetModuleFilename
。它将检索模块(exe)文件名,包括路径,格式为C:\path\to\exe\your_service.exe
.std::string
functionfind_last_of()
)来查找最后一个反斜杠。从那里剥离/修剪字符串以获得模块的路径,从而获得 exe 的目录。SetCurrentDirectory
,瞧!像 MattB 一样,我不知道有任何方法可以在不访问源代码的情况下更改服务的工作目录。对于这种特定情况,额外的目录检查可能不会强加与全文索引操作所需的 i/o 量相关的不必要的磁盘活动。即使您可以将它们优化掉,由于野兽的性质,全文索引也将是磁盘密集型的。
将“AppDirectory”字符串值添加到参数键并将值设置为所需的工作目录。