Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проверка владельца процесса в программировании на Delphi: как убедиться, что PID принадлежит текущему пользователю?

Delphi , Программа и Интерфейс , Процессы и Сервисы

Проверка владельца процесса в программировании на Delphi

Вопрос о том, как проверить, принадлежит ли процесс текущему пользователю, является актуальным для разработчиков, работающих с многозадачностью и безопасностью в операционных системах Windows. В контексте программирования на Delphi и Object Pascal, знание того, как идентифицировать процессы, принадлежащие текущему пользователю, может быть критически важным.

Проблема

Разработчик сталкивается с задачей извлечения идентификаторов процессов (PID), принадлежащих текущему пользователю, но не знает, как проверить владельца процесса. В коде отсутствует условие проверки владельца процесса.

uses
  TlHelp32, ...;
type
  TCardinalArray = array of Cardinal;
function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray;
var
  ContinueLoop: boolean;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  // ... код для получения списка процессов ...
  if(SameText(FProcessEntry32.szExeFile, AProcessName)) then
  begin
    if(* is this my process? *) then
    begin
      // ... код добавления PID в результат ...
    end;
  end;
  // ... остальной код ...
end;

Решение

Для решения этой задачи можно использовать функцию GetUserAndDomainFromPID, которая позволяет определить владельца процесса по его PID. Эта функция использует OpenProcessToken и GetTokenInformation, а также LookupAccountSid для получения информации о владельце.

uses
  TlHelp32;
type
  PTOKEN_USER = ^TOKEN_USER;
  _TOKEN_USER = record
    User: TSidAndAttributes;
  end;
  TOKEN_USER = _TOKEN_USER;
function GetUserAndDomainFromPID(ProcessId: DWORD;
  var User, Domain: string): Boolean;
begin
  // ... код функции для получения имени пользователя и домена ...
end;

Далее, необходимо получить имя текущего пользователя с помощью функции GetWindowsUsername, которая использует GetUserName.

function GetWindowsUsername: string;
begin
  // ... код для получения имени текущего пользователя ...
end;

И, наконец, функция GetCurrentUserPIDs будет использовать эти две функции для фильтрации процессов по имени и владельцу:

function GetCurrentUserPIDs(const AProcessName : string) : TCardinalArray;
begin
  // ... код для инициализации результата ...
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while(ContinueLoop) do
  begin
    if(SameText(FProcessEntry32.szExeFile, AProcessName)) then
    begin
      if(GetUserAndDomainFromPID(FProcessEntry32.th32ProcessID, UserName, DomainName)) then
      begin
        if(UserName = GetWindowsUsername()) then
        begin
          // ... код добавления PID в результат, если процесс принадлежит текущему пользователю ...
        end;
      end;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  // ... код закрытия дескриптора ...
end;

Альтернативный ответ

В качестве альтернативы можно было бы использовать функцию OpenProcess для получения доступа к процессу, но это могло бы привести к проблемам с доступом, особенно если процесс защищен.

Заключение

Используя предложенные функции, разработчик может легко проверить, принадлежит ли процесс текущему пользователю, и получить список PID соответствующих процессов. Это важный инструмент для обеспечения безопасности и корректной работы многозадачных приложений в операционных системах на базе Windows.

Создано по материалам из источника по ссылке.

Задача заключается в проверке владельца процесса в контексте программирования на Delphi, чтобы определить, принадлежит ли процесс текущему пользователю, с использованием функций для получения информации о пользователе и сравнения с те


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 08:42:41/0.0058858394622803/0