web-dev-qa-db-ja.com

Windowsサービス:現在の作業ディレクトリを構成できますか?

デフォルトでは、Windowsサービスはsytem32ディレクトリ(通常はC:\WINDOWS\system32)で開始します。

別の作業ディレクトリを設定する方法はありますか? HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeServiceの下にあるレジストリパラメータを考えています。

だから-これはできますか?

11
Tomalak

DLLインジェクションを使用して、プロセスがすでに起動した後でSetCurrentDirectoryを呼び出すことができます。これには、インジェクターアプリケーションをビルドする必要があり、さらにDLL =注入します。いくつかのチュートリアルが存在します。おそらく、私が見つけた2つの最高のチュートリアルは次のとおりです。

そのためには、ある程度のC++プログラミングの背景(および動作するビルド環境)が必要です。

ただし、これはサービスが現在のディレクトリを見ていることを前提としています。もう1つの可能性は、%path%を使用していることです。 「system32から始まり、さらにいくつかの場所を試し、最終的には独自のディレクトリを試す」と言っているので、これは私にとってより可能性が高いようです。

procmonにあるディレクトリと%path%を比較します。それらが同じである場合は、サービスを実行しているユーザーのSYSTEM %path%または%path%を変更して、検索するディレクトリが最初になるようにすることを検討してください。

私はフレッドが正しいと思います-頻繁に発生しない限り、これを実行してもパフォーマンスの大幅な向上は期待できませんvery頻繁に。単純なファイルオープン操作は、特にローカルパスであり、ファイルが実際に存在しない場合は、それほどコストがかかりません。

5
fission

これは、サービスのメイン関数内で行います。

  • GetModuleFilenameを呼び出します。これは、_C:\path\to\exe\your_service.exe_の形式で、パスを含むモジュール(exe)ファイル名を取得します。
  • 文字列操作を使用して(おそらく_std::string_ function find_last_of()を使用)、最後のバックスラッシュを見つけます。そこから文字列を削除/トリミングして、モジュールへのパスを取得し、それによりexeのディレクトリを取得します。
  • 関数SetCurrentDirectoryを呼び出してください。
1
uprightech

MattBのように、ソースコードにアクセスせずにサービスの作業ディレクトリを変更する方法を知りません。この特定のシナリオでは、追加のディレクトリチェックによって、フルテキストインデックス作成操作に必要なI/Oの量に比べて、それほど多くの不要なディスクアクティビティが課されることはありません。それらを最適化できたとしても、獣の性質上、全文索引はディスクに負荷がかかります。

1
Fred

「AppDirectory」文字列値をパラメーターキーに追加し、値を目的の作業ディレクトリに設定します。

1
Mark