Как найти Windows exe путь к файлу - PullRequest
51 голосов
/ 14 мая 2010

У меня есть служба Windows, и мне нужно создать каталог для хранения некоторой информации. Путь к каталогу должен быть относительно исполняемого файла службы Windows. Как можно получить этот путь к файлу EXE?

Ответы [ 9 ]

100 голосов
/ 14 мая 2010

Вы можете использовать AppDomain.CurrentDomain.BaseDirectory

34 голосов
/ 03 сентября 2013

Совет: если вы хотите найти путь запуска установленной службы Windows, посмотрите здесь из реестра.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ + ServiceName

Есть ключи от службы Windows

16 голосов
/ 12 июля 2016

Для получения пути к услуге вы можете использовать объект управления. 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());
                }
13 голосов
/ 14 мая 2010

Вместо использования каталога относительно исполняемого файла и, следовательно, требующих прав администратора, почему бы не использовать общий каталог данных приложения, который доступен через

Environment.GetFolderPath(SpecialFolder.CommonApplicationData)

Таким образом, вашему приложению не требуется доступ на запись в собственный каталог установки, что делает вас более безопасным.

10 голосов
/ 27 мая 2013

Попробуйте это

System.Reflection.Assembly.GetEntryAssembly().Location
8 голосов
/ 14 мая 2010
string exe = Process.GetCurrentProcess().MainModule.FileName;
string path = Path.GetDirectoryName(exe); 

svchost.exe - это исполняемый файл, который запускает ваш сервис в system32. Следовательно, нам нужно добраться до модуля, который запускается процессом.

5 голосов
/ 14 мая 2010

Каталог по умолчанию для службы 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);
1 голос
/ 25 апреля 2018

Это помогло мне

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);    
0 голосов
/ 21 февраля 2018

Если вы хотите получить доступ к папке 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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...