【发布时间】:2015-12-29 13:03:03
【问题描述】:
我正在尝试打开在另一个用户帐户上运行的进程,当我以管理员身份运行我的应用程序时(右键单击 > 以管理员身份运行),我成功获得它,但我需要应用程序自行提升权限,这是我目前所拥有的:
procedure ChangePrivilege;
var
NewState: TTokenPrivileges;
luid: TLargeInteger;
hToken: THandle;
ReturnLength: DWord;
begin
if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken) then
begin
if LookupPrivilegeValue(nil, PChar('SeDebugPrivilege'), luid) then
begin
NewState.PrivilegeCount:= 1;
NewState.Privileges[0].Luid := luid;
NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(hToken, False, NewState, 0, nil, ReturnLength) then
WriteLn('Privileged');
end;
CloseHandle(hToken);
end;
end;
这个函数执行得很好,我得到了“Privileged”输出,但是在我的 OpenProcess 上,我没有看到另一个帐户上运行的进程名称:
procedure ProcEnum;
var
Snapshot, ProcessPID: THandle;
pe: TProcessEntry32;
begin
Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
try
pe.dwSize := SizeOf(pe);
if Process32First(Snapshot, pe) then
while Process32Next(Snapshot, pe) do
begin
try
ProcessPID:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or
PROCESS_VM_READ, false, pe.th32ProcessID);
if (ProcessPID <> 0) then
WriteLn(pe.szExeFile);
finally
ProcessPID:= 0;
CloseHandle(ProcessPID);
end;
end;
finally
CloseHandle(Snapshot);
end;
end;
我有什么遗漏的吗? 我刚刚在 Windows 2008 Server 上尝试了相同的代码,并且成功了。但是在 Windows 10 上工作时,问题仍然存在。
【问题讨论】:
-
在 Process32First 之后,您已经有了要处理的第一条记录,但您跳过它并调用 Process32Next。并尝试为每条记录输出 szExeFile,只有在 OpenProcess 成功时才这样做。
-
是的...我的想法是仅当 OpenProcess 成功时才编写 szExeFile...而且我看不到其他用户帐户上运行的进程。仅当右键单击 > 以管理员身份运行
-
这似乎行得通。看起来您的实际代码与您在此处发布的代码之间存在差异。
-
不,代码是一样的。我只是在计时器内运行 ProcEnum,但我不知道这是否有任何区别......我在 Windows 10 机器上。
-
您是否尝试调用 GetLastError 来查看错误是否实际上是 ERROR_SUCCESS ?因为它可能是 ERROR_NOT_ALL_ASSIGNED