Windowsサービスはどのディレクトリで実行されますか?


86

非常に単純な.NETWindowsサービスを作成し、InstallUtil.exeユーティリティを使用してインストールしました。

サービスには、次のようなコードがあります。

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

サービスと同じディレクトリにtest_file.txtというファイルを作成しましたが、コードのコメント部分が実行されません...?


サービスを実行するユーザーは、ファイルに対する正しいアクセス許可を持っていますか?
CSharpAtl 2009年

回答:


80

サービスは、サービスコントロールマネージャーと呼ばれるアプリケーションから開始されます。このアプリケーションは、システムディレクトリ%WinDir%\ System32にあります。

Windows 7 Ultimateの場合-64ビットこのパスは実際には:%WinDir%\ SysWOW64

詳細については、MSDNのサービスコントロールマネージャーを参照してください。

元の投稿の問題を指摘してくれたHarperShelbyに感謝します。


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 2014

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

現在のディレクトリを出力します。そのコードをサービスの起動メソッドに配置し、DebugViewなどのツールを使用して出力を確認します。そうすれば、サービスのスタートアップフォルダがわかります。

この単純な手法は、サービス開発における多くの問題、特にサービスの起動をデバッグする場合に役立ちます。

おそらく、サービスの作業フォルダーは、サービスの実行可能ファイルが含まれているフォルダーであると予想していました(私もそうしました)。次のコード行を使用して、そのフォルダーに変更できます。

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

16

あなたはそれをそのように機能させることができます:

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 2016

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.