Windows服务在哪个目录中运行?


83

我创建了一个非常简单的.NET Windows服务,并使用InstallUtil.exe实用程序进行了安装。

在服务中,我有一段这样的代码:

if (File.Exists("test_file.txt"))
{
   // Do something clever
}

我已经在与服务相同的目录中创建了一个名为test_file.txt的文件,但是代码的注释部分从未执行过...?


运行该服务的用户是否对该文件具有正确的权限?
CSharpAtl

Answers:


78

服务从称为服务控制管理器的应用程序启动。此应用程序位于系统目录%WinDir%\ System32中

在Windows 7 Ultimate-64位上,该路径实际上是:%WinDir%\ SysWOW64

有关更多信息,请参见MSDN上的Service Control Manager

感谢Harper Shelby指出原始帖子的问题。


1
svchost.exe是大多数内部Windows服务的服务主机。在非Windows服务的情况下,服务可以并且很可能在其他exe主机中运行。
迈克尔

1
谢谢-将文件放到那里可以正常工作,所以我可以确认该位置:c:\ windows \ system32
Guy

1
@Guy-我正在尝试进行研究。我找不到“很好”的理由,尽管我怀疑是因为这是SCM(服务控制管理器)运行的目录,所以它从父流程的环境传递到子流程(服务)。
哈珀·谢尔比

服务由也位于%WINDIR%\ system32中的服务控制管理器(services.exe)启动。参见en.wikipedia.org/wiki/Service_Control_Manager
Dirk Vollmar,2009年

2
对我来说,(在64位的Windows 7),它是%WinDir%\SysWOW64代替
Strigoides

97
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory());

将输出当前目录。将代码放入服务的启动方法中,然后使用DebugView之类的工具检查输出。然后,您将知道服务的启动文件夹。

这种简单的技术将对服务开发中的许多问题很有用,尤其是调试服务启动时。

您可能希望服务的工作文件夹是服务可执行文件所在的文件夹(我也是)。您可以使用以下代码行转到该文件夹​​:

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);

14

您可以使它像这样工作:

string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
Directory.SetCurrentDirectory(cwd ?? ".");

1
+1,这使应用程序的其余部分可以正常运行,就像它是当前目录所在路径的.exe一样。谢谢,这正是我所需要的!避免必须重写使用相对路径的代码。
保罗

3

还想知道Windows服务在哪个文件夹中运行,但是源代码不是我的,因此无法对其进行修改。在命令提示符下键入sc qc <service name>将在BINARY_PATH_NAME中显示该文件夹。

C:\>sc qc
DESCRIPTION:
        Queries the configuration information for a service.
USAGE:
        sc <server> qc [service name] <bufferSize>

查询MyService时获得:

C:> sc qc MyService

[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: MyService
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 3   DEMAND_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "D:\Routines\MyService\MyService.exe"
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : MyService
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem

这是服务二进制文件所在的路径,不能保证等于该服务的“当前工作”目录,该目录在(服务)过程的正常运行期间可能会多次更改。相对文件名(如OP中的示例)是针对当前工作目录而不是可执行二进制文件所在的目录解析的。
Christian.K

sc qc apache2.4显示...BINARY_PATH_NAME : "E:\root\Public Cache\Apache Httpd\httpd-2.4.20-x86-vc11\Apache24\bin\httpd.exe" -k runservice,但工作目录改为%WinDir%\System32
Pacerier's
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.