本文整理自网络,侵删。
//获取程序运行的用户名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 xe8 androdi利用httpclient实现的一个app自动更新组件
Delphi 通过memorystream 传递image1数据
更多相关阅读请进入《Delphi》频道 >>