2009-05-19 16 views
56

非常にシンプルな.NET Windowsサービスを作成し、InstallUtil.exeユーティリティを使用してインストールしました。Windowsサービスを実行するディレクトリは何ですか?

私のようなコードの一部を持っているサービスで

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

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

実行された...?

+0

サービスを実行するユーザーがファイルに適切な権限を持っていますクエリMySe​​rviceでの取得が

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

? – CSharpAtl

答えて

51

サービスはService Control Managerというアプリケーションから開始されます。このアプリケーションのWindows 7の究極上のシステムディレクトリを%windir%\ System32に

での生活 - 64ビットこのパスは、実際には次のとおりです。詳細についてはを%windir%\ SYSWOW64

Service Control Manager at MSDNを参照してください。

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

+1

svchost.exeは、ほとんどの内部Windowsサービスのサービスホストです。サービスは、Windows以外のサービスの場合は可能性がありますが、別のexeホストで実行できます。 – Michael

+2

正しいディレクトリ、間違った理由。 –

+1

ありがとうございます - そこにファイルをドロップすると、私はその場所を確認することができます:c:\ windows \ system32 – Guy

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

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

この簡単な手法は、サービス開発の多くの問題、特にサービスの起動をデバッグする場合に便利です。

あなたのサービスの作業フォルダは、サービス実行ファイルが入っているフォルダになると予想していたかもしれません。あなたは、次のコード行を使用して、そのフォルダに変更することができます。

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

これは非常にクールなチップ - ありがとう! – Guy

+1

+!この問題に対する良い解決策です –

11

あなたはそれがそうのように動作させることができます。

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

+1これは、アプリケーションの残りの部分が、通常呼び出された.exeのように機能し、カレントディレクトリがそのパスである場合に機能します。ありがとう、これは私が必要としていたものです!相対パスを使用したコードを書き直す必要はありませんでした。 – Paul

2

は、Windowsサービスが実行されたフォルダいる知りたいと思ったが、ソースコード私のものではなかったので、それを変更できませんでした。コマンドプロンプトで入力するsc qc <service name>は、BINARY_PATH_NAMEにフォルダを表示します。

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 
+0

これは、サービスバイナリが存在するパスです。サービスの現在の作業ディレクトリと同じであることが保証されていないため、(サービス)プロセスの稼働時間中に複数回変更される可能性があります。相対ファイル名(OPの例のように)は、実行可能バイナリが置かれているディレクトリではなく、現在の作業ディレクトリに対して解決されます。 –

+0

'sc qc apache2.4'は' ... BINARY_PATH_NAME: "を示しています:E:¥root¥Public Cache¥Apache Httpd¥http-2.4.20-x86-vc11¥Apache24¥bin¥httpd.exe" -k runservice'、代わりに作業ディレクトリは '%WinDir%\ System32'です – Pacerier

関連する問題