Вопрос, поставленный пользователем Mark Billig, заключается в необходимости отслеживания запущенных программ, в том числе с повышенными привилегиями, аналогично функционалу "Диспетчер задач" в Windows. Проблема заключалась в получении "File Description" для процессов, работающих с повышенными привилеями.
Решение Проблемы
Использование PROCESS_QUERY_LIMITED_INFORMATION
Рему Лебёфу (Remy Lebeau) предложил использовать константу PROCESS_QUERY_LIMITED_INFORMATION вместо комбинации PROCESS_QUERY_INFORMATION и PROCESS_VM_READ. Это позволило успешно получить информацию о модуле процесса. Пример кода, который Mark Billig успешно изменил:
Также Рему рекомендовал использовать функции GetProcessImageFileName() или QueryFullProcessImageName(), которые, по его словам, должны быть более совместимы с процессами, работающими с повышенными привилегиями.
Получение "File Description"
После получения пути к исполняемому файлу можно использовать функцию VerQueryValue() для извлечения "File Description" из ресурсов исполняемого файла.
Пример Кода
var
Process: TProcessInfo;
FileName: string;
VersionInfo: PVersion;
Buffer: THandle;
FileDescription: string;
begin
// Получение пути к исполняемому файлу процесса
GetProcessImageFileName(hProcess, FileName, SizeOf(FileName));
// Получение указателя на буфер с информацией о версии
Buffer := VerQueryValue(PChar(FileName + ''), '', Pointer(VersionInfo), SizeOf(VersionInfo));
// Получение строки с описанием файла
FileDescription := VersionInfo^.Data[0].szFileDescription;
// ... дальнейшая обработка информации
end;
Альтернативное Решение
В качестве альтернативного решения можно использовать WinAPI функцию EnumProcesses(), которая перечисляет идентификаторы процессов, работающих на компьютере. После получения списка идентификаторов можно использовать функцию GetProcessImageFileNameEx() для получения пути к исполняемому файлу каждого процесса.
var
ProcessIDs: TArray<Cardinal>;
BytesReturned: Cardinal;
begin
EnumProcesses(@ProcessIDs[0], SizeOf(ProcessIDs), BytesReturned);
// Перебор всех идентификаторов процессов и получение информации о них
for var i := Low(ProcessIDs) to High(ProcessIDs) do
begin
if ProcessIDs[i] <> 0 then
begin
// Получение пути к исполняемому файлу процесса
GetProcessImageFileNameEx(GetCurrentProcess(), ProcessIDs[i], FileName, SizeOf(FileName));
// ... дальнейшая обработка информации
end;
end;
end;
Заключение
Использование PROCESS_QUERY_LIMITED_INFORMATION в сочетании с GetProcessImageFileName() или QueryFullProcessImageName() является эффективным решением для получения информации о запущенных приложениях, включая те, что работают с повышенными привилегиями. Приведенные примеры кода демонстрируют, как можно реализовать этот функционал в приложениях на Delphi.
Mark Billig столкнулся с необходимостью отслеживания запущенных программ и получения 'File ' для процессов с повышенными привилегиями, что обычно затруднительно из-за ограничений безопасности.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.