delphi XE7实现获取程序是否已管理员模式运行以及运行的windows用户名  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi XE7实现获取程序是否已管理员模式运行以及运行的windows用户名


介绍

本文章介绍了Delphi XE7实现获取程序是否已管理员模式运行以及运行的windows用户名,今天在QDAC网站上看到一个检查程序是否以管理员模式运行的代码,是C++的,感觉有点意思,就进行了转换,经过网络上的搜索,然后自己进行了修改,目前可以获取到该信息,下面进行代码介绍

1:获取程序运行的用户名
function GetProcessIdentity(): String;
var
  hToken: THandle;
  UserName, UserDomain: String;
  cbName, cbDomainName: ULONG;
  ReturnLength: DWORD;
  Buff: array of Byte;
  tu: PTokenUser;
  peUse: SID_NAME_USE;
label
  Cleanup;
begin
  Result := '';
  // 打开进程令牌
  if not OpenProcessToken(GetCurrentProcess, MAXIMUM_ALLOWED, hToken) then Exit;

  // 查询用户账户令牌

  // 首先获取需要的缓冲区大小
  if not GetTokenInformation(hToken, TokenUser, nil, 0, ReturnLength) then
    if GetLastError = ERROR_INSUFFICIENT_BUFFER then
    begin
      // 设置缓冲区大小
      SetLength(Buff, ReturnLength);
      // 获取数据
      GetTokenInformation(hToken, TokenUser, @Buff[0], ReturnLength, ReturnLength);
      tu := PTokenUser(@Buff[0]);
    end
    else
      goto Cleanup
  else
    goto Cleanup;

  // 通过 SID 查询用户名及登陆域
  cbName := 0;
  cbDomainName := 0;
  // 获取需要的缓冲区大小
  if not LookupAccountSid(nil, tu.User.Sid, nil, cbName, nil, cbDomainName, peUse) then
    if GetLastError = ERROR_INSUFFICIENT_BUFFER then
    begin
      // 设置字符串长度(包含 NULL 字符)
      SetLength(UserName, cbName);
      SetLength(UserDomain, cbDomainName);
      // 获取数据
      if LookupAccountSid(nil, tu.User.Sid, @UserName[1], cbName, @UserDomain[1], cbDomainName, peUse) then
      begin
        // 截去最后的 NULL 字符
        SetLength(UserName, cbName);
        SetLength(UserDomain, cbDomainName);
      end
      else
        goto Cleanup;
    end
    else
      goto Cleanup
  else
    goto Cleanup;

  // 组合信息
  Result := UserDomain + '\' + UserName;

Cleanup:
  // 关闭令牌
  CloseHandle(hToken);
end;
复制代码

2:获取用户是否以管理员模式运行
function GetProcessIsAdmin(): Boolean;
var
  hToken: THandle;
  UserName, UserDomain: String;
  cbName, cbDomainName: ULONG;
  ReturnLength: DWORD;
  Buff: array of Byte;
  BuffA: array[0..3] of Byte;
  tu: PTokenElevation;
  peUse: SID_NAME_USE;

  te:PTokenElevation;

begin
  Result := False;



  if not OpenProcessToken(GetCurrentProcess, MAXIMUM_ALLOWED, hToken) then Exit;

  // 查询用户账户令牌

  // 首先获取需要的缓冲区大小
  if not GetTokenInformation(hToken, TokenElevation, @BuffA[0], 4, ReturnLength) then
  begin
    if GetLastError = ERROR_INSUFFICIENT_BUFFER then
    begin
      // 设置缓冲区大小
      SetLength(Buff, ReturnLength);
      // 获取数据
      GetTokenInformation(hToken, TokenElevation, @Buff[0], ReturnLength, ReturnLength);
      tu := PTokenElevation(@Buff[0]);

      Result:=tu.TokenIsElevated=1;
    end ;
  end else
  begin
    tu := PTokenElevation(@BuffA[0]);

    Result:=tu.TokenIsElevated=1;
  end;


  // 关闭令牌
  CloseHandle(hToken);
end;


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.04551887512207 seconds