c++ windows服务中通过进程名从注册表获取管理员权限的进程安装路径
时间: 2024-02-18 16:59:16 浏览: 203
Windows开发-服务进程获取当前登录用户的桌面,文档和应用数据等文件夹目录
在 Windows 服务中,您可以使用以下代码片段来获取管理员权限的进程安装路径:
```c++
#include <Windows.h>
#include <iostream>
#include <string>
// 获取指定进程的完整路径
std::wstring GetProcessPath(DWORD pid)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (!hProcess) {
return L"";
}
wchar_t path[MAX_PATH] = { 0 };
DWORD size = GetModuleFileNameEx(hProcess, NULL, path, MAX_PATH);
CloseHandle(hProcess);
if (size == 0) {
return L"";
}
return std::wstring(path);
}
// 从注册表中获取指定进程的安装路径
std::wstring GetProcessInstallPath(const std::wstring& processName)
{
HKEY hKey;
LONG result = ERROR_SUCCESS;
// 打开注册表项
result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths", 0, KEY_READ | KEY_WOW64_32KEY, &hKey);
if (result != ERROR_SUCCESS) {
return L"";
}
// 枚举所有子键
wchar_t valueName[MAX_PATH] = { 0 };
DWORD index = 0, size = MAX_PATH;
while (RegEnumKeyExW(hKey, index++, valueName, &size, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
size = MAX_PATH;
// 判断子键名称是否为指定进程名
if (_wcsicmp(valueName, processName.c_str()) == 0) {
// 获取子键的默认键值(即应用程序的完整路径)
wchar_t path[MAX_PATH] = { 0 };
DWORD dataSize = MAX_PATH * sizeof(wchar_t);
result = RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)path, &dataSize);
RegCloseKey(hKey);
if (result == ERROR_SUCCESS) {
return std::wstring(path);
}
else {
return L"";
}
}
}
RegCloseKey(hKey);
return L"";
}
int main()
{
// 获取当前进程的ID
DWORD pid = GetCurrentProcessId();
// 获取当前进程的完整路径
std::wstring processPath = GetProcessPath(pid);
// 获取当前进程的文件名
std::wstring processName = processPath.substr(processPath.rfind(L"\\") + 1);
// 获取当前进程的安装路径
std::wstring installPath = GetProcessInstallPath(processName);
std::wcout << L"Install path: " << installPath << std::endl;
return 0;
}
```
在上面的代码中,我们首先使用 `GetProcessPath()` 函数获取指定进程的完整路径,然后从中提取出进程名。接着,我们使用 `GetProcessInstallPath()` 函数从注册表中查找指定进程的安装路径。在该函数中,我们首先打开 `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths` 注册表项,并枚举其中的所有子键。对于每个子键,我们判断其名称是否为指定进程名,如果是,则从其默认键值中获取应用程序的完整路径,并返回该路径。最后,我们在 `main()` 函数中调用上述两个函数,并输出获取到的安装路径。
阅读全文