delphi GetProcessIdentity 获取当前登录状态的管理员


本文整理自网络,侵删。

 
//获取程序运行的用户名
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;

相关阅读 >>

Delphi pos的用法

Delphi tapplication.onexception

Delphi unigui从数据表里下载流文件

Delphi enumwindows回调函数获取qq2009窗体句柄

Delphi模仿“千千静听”滚动标题栏,非常简单!

Delphi 32位程序 out of memory 内存不足时解决办法之一

Delphi ado通用操作数据单元

Delphi常用日期函数

Delphi memo1自动循环上下滚屏

Delphi datasnap 初步入门使用总结

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...