2010-05-14 8 views
44

Tengo un servicio de Windows y necesito crear un directorio para almacenar cierta información. La ruta del directorio debe ser relativa al archivo exe del servicio de Windows. ¿Cómo se puede obtener esta ruta de archivo exe?Cómo encontrar el servicio de Windows exe ruta

+0

No soy desarrollador de Windows, pero ¿estás seguro de que quieres esto? ¿No pertenece dicha información al directorio personal del usuario, o al de 'LocalService'? –

+6

@Pekka No soy un Desarrollador de Unix, pero los servicios del sistema (daemons) que almacenan archivos en los directorios personales del usuario suenan totalmente dementes. – BrainSlugs83

Respuesta

11

En lugar de utilizar un directorio en relación con el ejecutable, y por lo tanto necesidad de tener privilegios de administrador, por qué no utilizar el directorio de datos de aplicación común, que es accesible a través de

Environment.GetFolderPath(SpecialFolder.CommonApplicationData) 

esta manera su aplicación no necesita acceso de escritura a su propio directorio de instalación, lo que lo hace más seguro.

+0

También, en Windows Vista y Windows 7, no puede escribir en la carpeta de archivos del programa, ¡incluso como administrador! –

2

El directorio predeterminado para un servicio de Windows es la carpeta System32. En su servicio, sin embargo, puede cambiar el directorio actual al directorio que ha especificado en la instalación del servicio haciendo lo siguiente en su 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(@"\"))); 

Editar: un método aún más simple (pero no he probado aún):

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 
7
string exe = Process.GetCurrentProcess().MainModule.FileName; 
string path = Path.GetDirectoryName(exe); 

svchost.exe es el ejecutable que se ejecuta el servicio que se encuentra en system32. Por lo tanto, necesitamos llegar al módulo que está siendo ejecutado por el proceso.

8

probar este

System.Reflection.Assembly.GetEntryAssembly().Location 
30

Consejo: Si usted quiere encontrar ruta de inicio del servicio de Windows instalado, mira aquí de registro.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ + ServiceName 

Hay claves acerca de Windows

9

Para obtener la ruta de servicio que se puede utilizar el objeto de gestión. 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()); 
       } 
0

Si usted desea conseguir el acceso de la carpeta Archivos de programa o cualquier otro uso de la programación, se debe utilizar el código de abajo que es proporcionar derechos a la carpeta específica.

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; 
     } 
Cuestiones relacionadas