c# - startuppath - Cómo encontrar la ruta exe del servicio de Windows
vb net obtener directorio actual (9)
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 puede obtener esta ruta de archivo exe?
Consejo: Si desea encontrar la ruta de inicio del servicio de Windows instalado, mire aquí desde el registro.
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/ + ServiceName
Hay claves sobre el servicio de Windows
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 especificó 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 aún no lo he probado):
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
En lugar de usar un directorio relativo al ejecutable y, por lo tanto, necesita privilegios de administrador, ¿por qué no usar el directorio común de datos de la aplicación, al que se puede acceder a través de
Environment.GetFolderPath(SpecialFolder.CommonApplicationData)
De esta forma, su aplicación no necesita acceso de escritura a su propio directorio de instalación, lo que lo hace más seguro.
Esto hizo el truco para mí
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
Para obtener la ruta del servicio, puede usar 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());
}
Prueba esto
System.Reflection.Assembly.GetEntryAssembly().Location
Puede usar AppDomain.CurrentDomain.BaseDirectory
Si desea obtener acceso a la carpeta Archivos de programa o a cualquier otra mediante la programación, debe utilizar el siguiente código que proporciona 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;
}
string exe = Process.GetCurrentProcess().MainModule.FileName;
string path = Path.GetDirectoryName(exe);
svchost.exe es el ejecutable que ejecuta su servicio que está en system32. Por lo tanto, necesitamos llegar al módulo que está siendo ejecutado por el proceso.