我有一个Windows服务,我需要创建目录来存储一些信息。目录路径必须相对于Windows服务exe文件。 怎么能得到这个exe文件路径?
答案 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;
}