如何找到Windows服务exe路径

时间:2010-05-14 12:09:30

标签: c# .net windows-services

我有一个Windows服务,我需要创建目录来存储一些信息。目录路径必须相对于Windows服务exe文件。 怎么能得到这个exe文件路径?

10 个答案:

答案 0 :(得分:99)

答案 1 :(得分:34)

提示:如果要查找已安装的Windows服务的启动路径,请从注册表中查看。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ + ServiceName

有关于Windows服务的密钥

答案 2 :(得分:16)

To get path for service you can use Management object. ref: https://msdn.microsoft.com/en-us/library/system.management.managementobject(v=vs.110).aspx http://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());
                }

答案 3 :(得分:13)

为什么不使用可通过

访问的公共应用程序数据目录,而不是使用相对于可执行文件的目录,因此需要管理员权限。
Environment.GetFolderPath(SpecialFolder.CommonApplicationData)

这样您的应用就不需要对自己的安装目录进行写访问,这会让您更安全。

答案 4 :(得分:10)

试试这个

System.Reflection.Assembly.GetEntryAssembly().Location

答案 5 :(得分:8)

string exe = Process.GetCurrentProcess().MainModule.FileName;
string path = Path.GetDirectoryName(exe); 

svchost.exe是运行system32中服务的可执行文件。因此,我们需要进入由该过程运行的模块。

答案 6 :(得分:5)

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);

答案 7 :(得分:1)

这对我来说很有把戏

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

答案 8 :(得分:0)

即使在默认为 system32 的 LocalSystem 帐户下运行,这也会返回正确的路径:

System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

答案 9 :(得分:-3)

如果您想要访问Program Files文件夹或任何其他使用编程的文件,您应该使用以下代码,该代码提供特定文件夹的权限。

 private bool GrantAccess(string fullPath)
        {
            DirectoryInfo dInfo = new DirectoryInfo(fullPath);
            DirectorySecurity dSecurity = dInfo.GetAccessControl();
            dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
            dInfo.SetAccessControl(dSecurity);
            return true;
        }