「ローカルシステム」とは別のユーザーとして開始する必要のあるサービスがあります
サービスが正しく機能するために、デフォルトのパスに追加する必要があるユーザー固有のPATHがあります。
デフォルトのPATHはA; B; C;です。ユーザーにPATHXを設定しました。そのため、ユーザーがインタラクティブにログオンした場合、有効なPATHはA; B; C; X;です。これは、HKEY_USERS\XXXXXXX\Environment\Pathを設定することによって行われました。
すべてのパスはローカルハードドライブ上にあります。
ユーザーとしてサービスが開始されると、ProcMonを使用して必要なDLLを検索するのを見ることができます。 A; B; C;を検索しているだけです。サービスとして開始したとき。
サービスタイプを0x10から0x110に変更しようとしました。これにより、デスクトップの操作でユーザー環境が読み込まれるかどうかを確認できますが、役に立たなかったようです。
Windowsは、サービスを開始するときにユーザーの環境設定をロードする必要がありますか?これがデフォルトの動作である場合の回避策はありますか?
ありがとう
これを閉じるためだけに。
一般的なWindowsサービスの問題を扱っているのではないかと思ったので、これを一般的な形式で作成しました。
ただし、これはサービス実行可能オブジェクト自体の問題であることが判明しました。システムパスとユーザーパスの読み取りは、サービスの実行可能ファイルではどういうわけか依存していないようです。
同じベンダーの2つのサービスがあり、一方はシステムパスとユーザーパスの両方を読み取り、もう一方はシステムパスのみを読み取ります。
MSには 任意のプログラムをサービスとして実行するプログラム があります。パラメータの1つはHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<name>\Parameters\AppDirectory
、ただしこれはこれらのラップされたサービスにのみ適用される場合があります。
これはWindowsServer 2003固有ですが、これであなたの質問に答えられると思います: http://support.Microsoft.com/kb/88769
SRVANYを使用して、バッチファイルなどのスクリプトをサービスに変換し、目的のアプリを呼び出す前に環境を設定してみましたか?注:スクリプト自体が「実行中」であるかどうかをサービスコントローラーがチェックするため、スクリプトが後続のプロセスをバックグラウンドで終了する場合は、サービスの停止/開始/再起動の制御を認めることができます。スクリプト内のユーザーレジストリからPATHを読み取り、その内容を使用して、envがスクリプト自体にハードコードされないようにすることも検討できます。