デフォルトでは、Windowsサービスはsytem32ディレクトリ(通常はC:\WINDOWS\system32
)で開始します。
別の作業ディレクトリを設定する方法はありますか? HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
の下にあるレジストリパラメータを考えています。
だから-これはできますか?
DLLインジェクションを使用して、プロセスがすでに起動した後でSetCurrentDirectory
を呼び出すことができます。これには、インジェクターアプリケーションをビルドする必要があり、さらにDLL =注入します。いくつかのチュートリアルが存在します。おそらく、私が見つけた2つの最高のチュートリアルは次のとおりです。
そのためには、ある程度のC++プログラミングの背景(および動作するビルド環境)が必要です。
ただし、これはサービスが現在のディレクトリを見ていることを前提としています。もう1つの可能性は、%path%
を使用していることです。 「system32
から始まり、さらにいくつかの場所を試し、最終的には独自のディレクトリを試す」と言っているので、これは私にとってより可能性が高いようです。
procmon
にあるディレクトリと%path%
を比較します。それらが同じである場合は、サービスを実行しているユーザーのSYSTEM %path%
または%path%
を変更して、検索するディレクトリが最初になるようにすることを検討してください。
私はフレッドが正しいと思います-頻繁に発生しない限り、これを実行してもパフォーマンスの大幅な向上は期待できませんvery頻繁に。単純なファイルオープン操作は、特にローカルパスであり、ファイルが実際に存在しない場合は、それほどコストがかかりません。
これは、サービスのメイン関数内で行います。
GetModuleFilename
を呼び出します。これは、_C:\path\to\exe\your_service.exe
_の形式で、パスを含むモジュール(exe)ファイル名を取得します。std::string
_ function find_last_of()
を使用)、最後のバックスラッシュを見つけます。そこから文字列を削除/トリミングして、モジュールへのパスを取得し、それによりexeのディレクトリを取得します。SetCurrentDirectory
を呼び出してください。MattBのように、ソースコードにアクセスせずにサービスの作業ディレクトリを変更する方法を知りません。この特定のシナリオでは、追加のディレクトリチェックによって、フルテキストインデックス作成操作に必要なI/Oの量に比べて、それほど多くの不要なディスクアクティビティが課されることはありません。それらを最適化できたとしても、獣の性質上、全文索引はディスクに負荷がかかります。
「AppDirectory」文字列値をパラメーターキーに追加し、値を目的の作業ディレクトリに設定します。