默认情况下,Windows服务在sytem32目录(通常是C:\WINDOWS\system32 )中启动。
有没有办法build立一个不同的工作目录? 我正在考虑HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService下的一些registry参数。
那么 – 可以这样做吗?
在进程已经启动后,您可以使用DLL注入来调用SetCurrentDirectory 。 这将需要您build立一个注入器应用程序,再加上要注入的DLL。 有些教程存在; 大概我find的两个最好的是:
您将需要大量的C ++编程背景(以及一个可行的构build环境)来解决这个问题。
但是,这假定该服务正在查看当前目录。 另一种可能是它使用%path% 。 你说它“从system32开始,尝试更多的位置,并最终它自己的目录”,所以这对我来说似乎更可能。
比较你在procmon看到的目录和%path% 。 如果它们相同,则考虑修改运行该服务的用户的SYSTEM %path%或%path% ,以使您希望它search的目录是第一个。
但我相信弗雷德是对的 – 除非经常发生,否则你不可能看到任何显着的性能收益。 简单的文件打开操作不是特别昂贵,特别是如果它是一个本地path和文件实际上不存在。
像MattB,我不知道有任何方式来改变服务的工作目录不访问源代码。 对于这种特定的情况,额外的目录检查可能不会对全文索引操作所需的I / O数量造成太多的不必要的磁盘活动。 即使你可以优化它们,全文索引也会被兽的性质所强化。
将“AppDirectory”string值添加到Parameters Key,并将该值设置为所需的工作目录。
在Service主要function中执行此操作:
GetModuleFilename 。 它将以C:\path\to\exe\your_service.exe的forms检索包含path的模块(exe)文件名。 std::string函数find_last_of() )来查找最后一个反斜杠。 从那里去除/修剪string以获取模块的path,从而获得exe文件的path。 SetCurrentDirectory ,瞧!