web-dev-qa-db-ja.com

Windowsサービスのexeパスを見つける方法

Windowsサービスがあり、情報を保存するディレクトリを作成する必要があります。ディレクトリパスは、Windowsサービスのexeファイルからの相対パスである必要があります。このexeファイルのパスを取得するにはどうすればよいですか?

53
NDeveloper
102
Incognito

ヒント:インストール済みのWindowsサービスのスタートアップパスを検索する場合は、レジストリからこちらをご覧ください。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ + ServiceName

Windowsサービスに関するキーがあります

サービスのパスを取得するには、管理オブジェクトを使用できます。参照: https://msdn.Microsoft.com/en-us/library/system.management.managementobject(v = vs.110).aspxhttp://dotnetstep.blogspot .com/2009/06/get-windowservice-executable-path-in.html

using System.Management;
string ServiceName = "YourServiceName";
using (ManagementObject wmiService = new ManagementObject("Win32_Service.Name='"+ ServiceName +"'"))
                {
                    wmiService.Get();
                    string currentserviceExePath = wmiService["PathName"].ToString();
                    Console.WriteLine(wmiService["PathName"].ToString());
                }
16
Abhay

実行可能ファイルに関連するディレクトリを使用するため、管理者特権が必要な場合は、共通アプリケーションデータディレクトリを使用してください。

Environment.GetFolderPath(SpecialFolder.CommonApplicationData)

このように、アプリは独自のインストールディレクトリへの書き込みアクセスを必要としないため、より安全になります。

13
Stewart

これを試して

System.Reflection.Assembly.GetEntryAssembly().Location
10
ramin eftekhari
string exe = Process.GetCurrentProcess().MainModule.FileName;
string path = Path.GetDirectoryName(exe); 

svchost.exeは、system32にあるサービスを実行する実行可能ファイルです。したがって、プロセスによって実行されているモジュールに到達する必要があります。

8
Sachin

WindowsサービスのデフォルトのディレクトリはSystem32フォルダーです。ただし、サービスでは、OnStartで次の操作を行うことにより、現在のディレクトリをサービスのインストールで指定したディレクトリに変更できます。

        // Define working directory (For a service, this is set to System)
        // This will allow us to reference the app.config if it is in the same directory as the exe
        Process pc = Process.GetCurrentProcess();
        Directory.SetCurrentDirectory(pc.MainModule.FileName.Substring(0, pc.MainModule.FileName.LastIndexOf(@"\")));

編集:さらに簡単な方法(ただし、まだテストしていません):

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
5
derek

これは私のためにトリックをしました

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);    
1
Danw25