各位好:
各位好,初学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);
///////////////////////////////////////////////////////还请路过的高手指教,再次感谢,诚恳期待。
//
各位好,初学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);
///////////////////////////////////////////////////////还请路过的高手指教,再次感谢,诚恳期待。
//
解决方案 »
- 2000 分解决,一个intraweb的刷新到一个放置了控件较多的页面时有时候快,有时慢到整死,而且就来几次就这样,分不够真能解决分可翻倍
- TClientDataset更新数据,占用CPU的问题.
- 如何将 字符串中 的 定义项 转成 定义的数值 ????????????
- 为什么用CALLBACK来定义将回调函数会加快回调函数的执行效率???
- 关于IdUdp的问题。
- 很爽的打印dbgrid,stringgrid,datasource.的控件。
- InstallShield的问题?
- (问)运行server端报错“有另一版本的DBLogDlg已经编译”。
- Delphi中有没有静态变量
- 求助:QuickReport报表如何转换为格式?
- delphi中有没有保存窗口控件属性的控件啊?
- 自定义函数得不到控件的值呢?
OpenProcessToken(otherprocesshandle, TOKEN_ADJUST_PRIVILEGES, hToken); //
[color=#0000FF]otherprocesshandle为其他进程的句柄。此时提示denay。如果是GetCurrentProcess没有问题。[/color] 进程本身已经是 sedebug权限了(既程序本身的进程已经是debug权限)。
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
问题 :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处就失败了。
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.完整的例子