2

我有以下代码可以帮助检查进程是否在提升的情况下运行。

图像1

如何修改代码以允许它检查某个进程是否被提升?

function IsElevated: Boolean;
const
  TokenElevation = TTokenInformationClass(20);
type
  TOKEN_ELEVATION = record
    TokenIsElevated: DWORD;
  end;
var
  TokenHandle: THandle;
  ResultLength: Cardinal;
  ATokenElevation: TOKEN_ELEVATION;
  HaveToken: Boolean;
begin
  if CheckWin32Version(6, 0) then
  begin
    TokenHandle := 0;
    HaveToken := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, TokenHandle);
    if (not HaveToken) and (GetLastError = ERROR_NO_TOKEN) then
      HaveToken := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle);
    if HaveToken then
    begin
      try
        ResultLength := 0;
        if GetTokenInformation(TokenHandle, TokenElevation, @ATokenElevation, SizeOf(ATokenElevation), ResultLength) then
          Result := ATokenElevation.TokenIsElevated <> 0
        else
          Result := False;
      finally
        CloseHandle(TokenHandle);
      end;
    end
    else
      Result := False;
  end
  else
    Result := True;
end;
4

1 回答 1

1

你的答案几乎在你的问题中......

该函数IsElevatedGetTokenInformation获取结果,该结果采用TokenHandle. 这TokenHandle是由接收当前进程句柄的OpenProcessToken给出的。

现在您感兴趣的不是当前流程,而是您拥有的另一个流程ProcessID。因此,您可以通过调用OpenProcess来获得所需的进程句柄processID。您可能需要提升权限才能执行此操作。

于 2020-12-04T07:21:00.730 回答