我有一个 Windows 服务,它可以在工作站上获取所有已安装的服务。现在我想获取特定服务的可执行文件的位置。路径必须是绝对的。我怎样才能以编程方式实现这一目标?
问问题
2405 次
2 回答
3
我不太了解 .net 接口,但如果您找不到可以读取每个服务的注册表值的方法:LocalMachine/System/CurrentControlSet/Services/ SERVICENAME ,然后您需要访问显示完整路径(如果不是绝对路径,则基本路径是 Windows 主文件夹)
我也找到了一个例子:http: //bytes.com/topic/c-sharp/answers/268807-get-path-install-service
于 2012-06-06T10:25:39.647 回答
0
我最近需要这个,这就是我创建的。鉴于,在此代码中我检查匹配imagePath
但它可以很容易地修改为返回imagePath
,它已经返回匹配的服务名称。您可以在此循环中{foreach (string keyName...}
检查keyName
并返回imagePath
。像魅力一样工作,但请记住,会有安全和用户访问方面的考虑。如果用户没有访问权限,它可能会失败。我的用户“以管理员身份”运行它,从这个意义上说我没有问题
// currPath - full file name/path of the exe that you trying to find if it is registered as service
// displayName - service name that you return if you find it
private bool TryWinRegistry(string currPath, out string displayName)
{
displayName = string.Empty;
try
{
using (RegistryKey regKey = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\services", false))
{
if (regKey == null)
return false;
// we don't know which key because key name is configured by config file and equals to service name
foreach (string keyName in regKey.GetSubKeyNames())
{
try
{
using (RegistryKey serviceRegKey = regKey.OpenSubKey(keyName))
{
if (serviceRegKey == null)
continue;
string val = serviceRegKey.GetValue("imagePath") as string;
if (val != null && String.Equals(val, currPath, StringComparison.OrdinalIgnoreCase))
{
displayName = serviceRegKey.GetValue("displayName") as string;
return true;
}
}
}
catch
{
}
}
}
}
catch
{
return false;
}
return false;
}
于 2016-11-02T14:56:01.453 回答