Windows服务:是否可以配置当前工作目录?


11

默认情况下,Windows服务在sytem32目录中启动(通常是C:\WINDOWS\system32)。

有没有办法设置其他工作目录?我在想下面的一些注册表参数HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService

所以-能做到吗?


3
@Tomalak:这是您编写的服务吗?您可以通过代码来完成此操作,但是我认为无法通过服务设置来实现。
MattB 2010年

不,这不是我写的服务。我希望这里有一些鲜为人知的注册表设置。
Tomalak'2

这样做的目的是什么?
user35115 2010年

@ user35115:好吧,说实话...在追踪procmon的一个无关问题时,我注意到某个I / O繁重的服务(全文索引器)始终在错误的位置(很笨)检查其自己的文件。它从system32开始,尝试其他几个位置,最后是它自己的目录。我认为它什么时候可以立即在其自己的目录中运行,因此可以减少不必要的文件检查。并不是说它目前无法正常工作,但是让我怀疑是否还有改进的余地。
Tomalak

1
@ user35115,为避免必须大量更改某个应用程序(例如Apache等)的配置设置,这些设置都相对于工作目录。
Pacerier '16

Answers:


5

您可以SetCurrentDirectory在进程启动后使用DLL注入进行调用。这将需要您构建一个注入器应用程序以及要注入的DLL。存在一些教程。我发现的最好的两个大概是:

您将需要相当数量的C ++编程背景(和有效的构建环境)来完成此工作。

但是,这假定该服务正在查看当前目录。另一种可能是正在使用%path%。您说它“开始于system32,尝试了更多的位置,并最终找到了自己的目录”,所以对我来说这似乎更有可能。

比较你看到的目录procmon与你的%path%。如果它们相同,请考虑修改运行该服务的用户的SYSTEM %path%%path%,以便首先搜索您要搜索的目录。

我相信弗雷德是正确的,但-你不可能通过做任何的这个看到任何显著的性能优势,除非它的发生非常频繁。简单的文件打开操作并不是特别昂贵,尤其是当它是本地路径并且文件实际上不存在时。


系统PATH环境变量是我想到的第一件事。但是,将服务的路径插入PATH变量的开头将对几乎所有其他应用程序的性能产生负面影响,因此,我不建议这样做。
Marnix van Valen 2010年

我没有任何硬性数字可以支持这一点,但是我的直觉告诉我,修改路径不会对性能造成实际的影响。这是一个相当普遍的情况;没有人会指责Windows支持工具或SQL Server在安装过程中修改路径时会对系统性能产生负面影响。这不是我第一次看到有人看着procmon并去“ omg,看看所有这些文件访问!”,却没有意识到这对于大多数应用程序来说都是典型的。
裂变

为创造力+1。:-)我完全理解,这些文件操作不会显着影响性能,因此,我实际上不必费心编写DLL注入解决方案。不过,%PATH%为运行该服务的用户帐户进行修改是一个不错的主意。
Tomalak

1
创建一个特殊用户以仅运行此服务,并为此用户修改%PATH%听起来是一个很好的方法。+1
阳光明媚,时间

@fission:是的,这确实意味着我接受您的回答。;)这不是我所希望的,但是我想它已经接近了。
Tomalak'3

1

像MattB一样,我不知道没有访问源代码即可更改服务的工作目录的任何方法。对于这种特定情况,相对于全文本索引操作所需的I / O数量,额外的目录检查可能没有施加太多不必要的磁盘活动。即使您可以对其进行优化,全文索引也会因野兽的性质而占用大量磁盘空间。


1

将“ AppDirectory”字符串值添加到“参数项”,并将其设置为所需的工作目录。


嗯 刚测试过,似乎不起作用(在Windows 7上,使用REG_EXPAND_SZ数据类型)。您能否再次确认这确实对您有用?
Tomalak 2010年

使用时此方法有效srvany。不确定正常服务。
康斯坦丁·斯皮林

1

在“服务”主要功能中执行此操作:

  • 致电GetModuleFilename。它将以形式检索包含路径的模块(exe)文件名C:\path\to\exe\your_service.exe
  • 使用字符串操作(也许使用std::stringfunction find_last_of())来查找最后一个反斜杠。从那里剥离/修剪字符串,以获得模块的路径以及exe目录。
  • 调用该函数SetCurrentDirectory,瞧!

1
不要忘记将null传递给GetModuleFilename函数调用中的HMODULE参数:)
uprightech
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.