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


11

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

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

だから-これを行うことができますか?


3
@Tomalak:あなたが書いたサービスですか?コードを使用してそれを行うことができますが、サービスの設定を使用する方法はないと思います。
MattB 2010

いいえ、私が書いたサービスではありません。ここでは、あまり知られていないレジストリ設定を期待していました。
Tomalak

それを行う目的は何ですか?
user35115 2010

@ user35115:まあ、正直なところ…procmonで無関係な問題を追跡しているときに、特定のI / O負荷の高いサービス(フルテキストインデクサー)が一貫して間違った場所(かなりダム)にある自分のファイルをチェックしていることに気付きました。それはsystem32から始まり、さらにいくつかの場所を試し、最終的には独自のディレクトリを試します。すぐに独自のディレクトリで実行すると、不要なファイルチェックが少なくなると考えました。ではない、それはないだろうと働き、現在、まだそれは改善の余地があった場合、私は疑問に思うしました。
Tomalak

1
@ user35115、特定のアプリ(Apacheなど)の構成設定を一括で変更する必要がないようにします。これらはすべて作業ディレクトリに関連しています。
Pacerier

回答:


5

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

それをやり遂げるには、C ++プログラミングの適切なバックグラウンド(および動作するビルド環境)が必要です。

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

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

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


システムのPATH環境変数は、最初に思い浮かんだものです。ただし、PATH変数の先頭にサービスのパスを挿入すると、他のほぼすべてのアプリケーションのパフォーマンスに悪影響が及ぶため、お勧めしません。
Marnix van Valen 2010

どちらの方法でもこれをバックアップするための明確な数値はありませんが、私の直感では、パスを変更しても実際のパフォーマンスの向上や損失は発生しないことがわかります。これはかなり一般的なシナリオです。インストール中にパスを変更したときにシステムのパフォーマンスに悪影響を与えたとして、WindowsサポートツールやSQL Serverを非難する人はいません。これは、誰かがprocmonを見て「それらすべてのファイルアクセスを確認する!」と表示するのを目にしたのはこれが初めてではありません。
分裂

創造性のための+1。:-)これらのファイル操作がパフォーマンスに測定可能な影響を与えないことを完全に理解しているので、実際にDLLインジェクションソリューションを作成するつもりはありません。%PATH%ただし、サービスを実行するユーザーアカウントを変更することは、まともなアイデアです。
Tomalak

1
このサービスのみを実行する特別なユーザーを作成し、このユーザーの%PATH%を変更することは、非常に良い方法のように思えます。+1
2010

@分裂:はい、それは私があなたの答えを受け入れることを意味します。;)それは私が望んでいたものではありませんが、それは可能な限り近いと思います。
トマラック

1

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


1

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


うーん。テストしただけでは機能しないようです(Windows 7では、REG_EXPAND_SZデータ型を使用しました)。これが実際に機能していることを再確認できますか?
Tomalak、2010年

これはを使用するときに機能しsrvanyます。通常のサービスについてはわかりません。
Konstantin Spirin 2011年

1

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

  • を呼び出しますGetModuleFilename。これは、パスを含むモジュール(exe)ファイル名をの形式で取得しますC:\path\to\exe\your_service.exe
  • 文字列操作(多分std::stringfunction を使用find_last_of())を使用して、最後のバックスラッシュを見つけます。そこから文字列を削除/トリミングして、モジュールへのパスを取得します。つまり、exeのディレクトリを取得します。
  • 関数SetCurrentDirectoryを呼び出して、出来上がり!

1
GetModuleFilename関数呼び出しのHMODULEパラメータにnullを渡すことを忘れないでください:)
uprightech
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.