На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: jack128, Rouse_, Krid
  
    > PID and SID процесса
      Цитата
      Как узнать SID(PSid) процесса имея PID процесса?

      Примерно так:

      ExpandedWrap disabled
        unit Unit1;
         
        interface
         
        uses
          Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
          Dialogs, StdCtrls;
         
        type
          TForm1 = class(TForm)
            Button1: TButton;
            procedure Button1Click(Sender: TObject);
          end;
         
          PTokenUser = ^TTokenUser;
          TTokenUser = record
            User: array[0..0] of TSIDAndAttributes;
          end;
         
          procedure ConvertSidToStringSid(SID: PSID; var StringSid: LPSTR); stdcall;
            external advapi32 name 'ConvertSidToStringSidA';
         
        var
          Form1: TForm1;
         
        implementation
         
        {$R *.dfm}
         
        function GetCurrentUserSID: String;
        var
          TokenHandle: THandle;
          TokenInformationClass: TTokenInformationClass;
          TokenInformation: PTokenUser;
          ReturnLength: DWORD;
          StringSid: LPSTR;
        begin
          Result := '';
          if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) then
          try
            TokenInformationClass := TokenUser;
            GetTokenInformation(TokenHandle, TokenInformationClass, nil, 0, ReturnLength);
            if GetLastError = ERROR_INSUFFICIENT_BUFFER then
            begin
              TokenInformation := GetMemory(ReturnLength);
              if TokenInformation <> nil then
              try
                if GetTokenInformation(TokenHandle, TokenInformationClass,
                  TokenInformation, ReturnLength, ReturnLength) then
                begin
                  ConvertSidToStringSid(TokenInformation^.User[0].Sid, StringSid);
                  Result := StringSid;
                end;
              finally
                FreeMemory(TokenInformation);
              end;
            end;
          finally
            CloseHandle(TokenHandle);
          end;
        end;
         
         
        procedure TForm1.Button1Click(Sender: TObject);
        begin
          ShowMessage(GetCurrentUserSID);
        end;
         
        end.


      Добавлено
      В данном примере GetCurrentProcess можно заменить (если имеешь PID) на

      ExpandedWrap disabled
                      hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, True, PID);
                      if hProcess <> 0 then
                      try
                        // теперь заменяй GetCurrentProcess значением из hProcess
                      finally
                        CloseHandle(hProcess);
                      end;
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0328 ]   [ 16 queries used ]   [ Generated: 2.05.24, 17:12 GMT ]