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]);