各位好:
     各位好,初学delphi,应用了openProcessToken,发现只能GetCurrentProcess参数下成功,既本进程可获得Token。当这个参数为其它进程的handle的时候。结果全部是 acess denay,错误代码5. 
     问题:如何才能获得其他进程的token。是否需要修改acl? 诚恳请教,只希望获得一个思路就好,如能有代码将感激涕零。 感谢每位路过的朋友////代码片段///
procedure Tjoke.SetPrivilege(ifdebug:bool);
var
num:Dword;
szError:array[0..200]of char ;
begin
   OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);   LookupPrivilegeValue(nil, 'SeDebugPrivilege', Luid);   OldTokenPrivileges.Privileges[0].luid := Luid;   OldTokenPrivileges.PrivilegeCount := 1;   OldTokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  
 AdjustTokenPrivileges(hToken, False, OldTokenPrivileges, ReturnLength, PTokenPrivileges(nil)^, ReturnLength);
   num:=  GetLastError();
   if GetLastError()<>0 then
   begin
    FormatMessage(
    FORMAT_MESSAGE_FROM_SYSTEM,
    Nil,
    num,
    0,
    szError,
    sizeof(szError),
    nil);
   showmessage('本身权限无法提升,错误代码及原因:'+inttostr(num)+szerror);
   end;
   CloseHandle(hToken);
///////////////////////////////////////////////////////还请路过的高手指教,再次感谢,诚恳期待。
//

解决方案 »

  1.   

    先提权到Debug权限,然后修改
      

  2.   

    gyk120 多谢。你说,先提权到Debug权限是指把本进程提权到debug还是把要访问的进程提权为debug? 如果是本进程的话,已经是debug权限了阿。
      OpenProcessToken(otherprocesshandle, TOKEN_ADJUST_PRIVILEGES, hToken); //
    [color=#0000FF]otherprocesshandle
    为其他进程的句柄。此时提示denay。如果是GetCurrentProcess没有问题。[/color] 进程本身已经是 sedebug权限了(既程序本身的进程已经是debug权限)。
      

  3.   

    function EnabledSecuryPrivilege(procHandle:Cardinal;Const bEnabled:Boolean):Boolean;
    var
      hToken: THandle;
      tp: TOKEN_PRIVILEGES;
      a: DWORD;
    const
      SE_Security_NAME = 'SeSecurityPrivilege';
    begin
      Result := False;
      if (OpenProcessToken(procHandle, TOKEN_QUERY, hToken)) then
      begin
        tp.PrivilegeCount := 1;
        LookupPrivilegeValue(nil, SE_Security_NAME, tp.Privileges[0].Luid);//获得本地机唯一的标识
        if bEnabled then
          tp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED
        else
          tp.Privileges[0].Attributes := 0;
        a := 0;
        AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);
        Result := GetLastError = ERROR_SUCCESS;
        CloseHandle(hToken);
      end;
    end;
    调用:
        EnabledSecuryPrivilege(ProcessHandle,true);
        if OpenProcessToken(ProcessHandle,   TOKEN_QUERY or TOKEN_READ, hToken) then
        begin
          //
        end
      

  4.   

    首先 感谢 znj_326 ,用了你的代码,依然没有成功。
    问题 :1 ,代码中有两处用的了OpenProcessToken
             if (OpenProcessToken(procHandle, TOKEN_QUERY, hToken)) then 
     和调用中 if OpenProcessToken(ProcessHandle,  TOKEN_QUERY or TOKEN_READ, hToken) then          其中 procHandle和 ProcessHandle分别代表了那个进程。我的问题中就两种进程,1是程序本身,2是将要访问的进程。 问题 2, 运行你的代码前需要,提权程序本身进程至debug吗?问题 3, 如果上面两个句柄都是其他进程句柄的话,那么根本不可能实现阿,第一个if处就失败了。
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    function EnabledSecuryPrivilege(procHandle:Cardinal;Const bEnabled:Boolean):Boolean;
    var
      hToken: THandle;
      tp: TOKEN_PRIVILEGES;
      a: DWORD;
    const
      SE_Security_NAME = 'SeSecurityPrivilege';
    begin
      Result := False;
      if (OpenProcessToken(procHandle, TOKEN_QUERY, hToken)) then
      begin
        tp.PrivilegeCount := 1;
        LookupPrivilegeValue(nil, SE_Security_NAME, tp.Privileges[0].Luid);//获得本地机唯一的标识
        if bEnabled then
          tp.Privileges[0].Attributes :=SE_PRIVILEGE_ENABLED
        else
          tp.Privileges[0].Attributes := 0;
        a := 0;
        AdjustTokenPrivileges(hToken, False, tp, SizeOf(tp), nil, a);
        Result := GetLastError = ERROR_SUCCESS;
        CloseHandle(hToken);
      end;
    end;function GetUserAndDomainFromPID(ProcessId: DWORD;
     var User, Domain: string): Boolean;
    var
      hToken: THandle;
      cbBuf: Cardinal;
      ptiUser: PSIDAndAttributes;
      snu: SID_NAME_USE;
      ProcessHandle: THandle;
      UserSize, DomainSize: DWORD;
      bSuccess: Boolean;
    begin
      Result := False;
      User:='';
      //SetPrivilege;
      //EnabledDebugPrivilege(true,'SeSecurityPrivilege');
      ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION , False, ProcessId);
      if ProcessHandle <> 0 then
      begin
        EnabledSecuryPrivilege(ProcessHandle,true);
        if OpenProcessToken(ProcessHandle,   TOKEN_QUERY or TOKEN_READ, hToken) then
        begin
          bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);
          ptiUser  := nil;
          while (not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do
          begin
            ReallocMem(ptiUser, cbBuf);
            bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf);
          end;
          CloseHandle(hToken);     if not bSuccess then Exit;
         UserSize := 0;
         DomainSize := 0;
         LookupAccountSid(nil, ptiUser.Sid, nil, UserSize, nil, DomainSize, snu);
         if (UserSize <> 0) and (DomainSize <> 0) then
         begin
           SetLength(User, UserSize);
           SetLength(Domain, DomainSize);
           if LookupAccountSid(nil, ptiUser.Sid, PChar(User), UserSize,
             PChar(Domain), DomainSize, snu) then
           begin
             Result := True;
             User := StrPas(PChar(User));
             Domain := StrPas(PChar(Domain));
           end;
         end;
         FreeMem(ptiUser);
       end;
       CloseHandle(ProcessHandle);
     end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      u,d:String;
    begin
      GetUserAndDomainFromPID(strtointdef(edit1.Text,0),u,d);
      showmessage(u);
    end;end.完整的例子
      

  6.   

    有点复杂,好像关键是 最后一段 GetUserAndDomainFromPID 这个地方,权限的变更, 还在研究,先感谢来了。 问题好像还在权限上面。  为什么,用OpenprocessToken获取其他进程的Token的时候,连debug权限都不行呢? 这里面是否很复杂,有朋友能简单介绍,或给个网址吗??? 将感激不尽