他のいくつかのカスタム.Net Windowsサービスを正常にインストールしました。私が最近書いた新しいものは他のものと非常に似ていて、エラーなしでインストールしている間-サービスコントローラーで起動すると、エラーダイアログで起動できませんでした:システムエラー2 ...指定されたファイルが見つかりません。
時間と驚きの後、このサービスについて私が考えられた唯一のことは、パスと実行可能ファイル名が他のどのサービスよりも少なくとも10文字長かったということでした。パスと.exe名の両方を短くして再インストールすると、サービスは正常に実行されました。エラーはありません!以前のパスまたはサービス、または.exe名が長すぎたと推測できます。
また、exeに組み込まれた借用された「サービスドライバー」コードを使用して、win API呼び出しを介してサービスコントローラーへのサービスのインストール/アンインストールを処理したことに言及することは適切です。そのサービスドライバーモジュール内に文字数制限が隠されている可能性があります。
私が超えたパスまたはサービス名にシステムにバインドされた文字制限があるかどうかを確認するためのドキュメントに関連するウィンドウが見つかりませんでした。時間が許せばサービスドライバーを詳しく調べて、それが問題になるかどうかを確認します。一方、私は洞察を歓迎します。
いくつかのテストサービスを試したところ、問題の原因となったプロパティの長さ(「システムエラー2 ...システムが指定されたファイルを見つけることができません」)が原因であることがわかりました。組み込みのサービスインストーラーは、ServiceName、ServiceTitle、ServiceDescriptionの3つのプロパティを使用します。インストール時に、完全なサービスパスをレジストリに書き込むことがわかりましたが、実際のexe(アセンブリ)名だけでなく、ServiceNameプロパティを使用してパスを作成します。私の問題は、ServiceNameとAssembly名が一致しなかったため、ファイルが見つからないことでした。 PowerShellレジストリクエリを使用してパスを公開し、最終的に不一致に気付きました。問題に最初に気付いたとき、サービス名を何から短縮しても気づかなかった-.exeなしでアセンブリ名を使用しただけで、それが実際にそれを修正したので、単に短縮したのではない。
同じエラーが発生したサービスでも同様の問題が発生しました。
私が行った:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\YourServiceName\ImagePath
「ImagePath」は、「C:\」に存在する「W:\」という仮想ドライブに設定されていました。
このパスをC:\ドライブ上の実際のファイルの場所に置き換えた後、サービスが正常に開始されました
私の問題は、Powershellコマンドでサービスを作成すると、次のようなブレーキが追加されました:<C:\Path\To\Service\Service.exe>
レジストリへ。
Replacing < and > with " fixed it for me.
私は同じ問題を抱えていましたが、このエラーを解決するものは何もありませんでしたが、c:\Windows\System32
_パスを使用してサービス実行可能ファイルを保存することでnotで解決しました!
私の場合、コマンドプロンプトを開き、exeに移動してそこからインストールしました。だから私はフルパスを入力しませんでした。フルパスを使用すると、機能しました。
そのため、フルパスでサービスをインストールするか、システム環境変数でexeファイルのパスをPATHに追加する必要があります。
SC CREATE "Service-Name" binpath="D:\full-path-to-service\service.exe"
またはD:\full-path-to-service\
をPATH変数に追加して使用します
SC CREATE "Service-Name" binpath="service.exe"