本文整理自网络,侵删。
介绍
本文章介绍了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;
相关阅读 >>
Delphi 如何编写使stringgrid中的一列具有check功能,和checkbox效果一样
Delphi 拖动文件到exe 打开 获取getcommandline命令行
更多相关阅读请进入《Delphi》频道 >>