判断当前进程是否以管理员权限启动的

复制代码
uses
 shlobj;
 type
 WELL_KNOWN_SID_TYPE = (
 WinNullSid,
 WinWorldSid,
 WinLocalSid,
 WinCreatorOwnerSid,
 WinCreatorGroupSid,
 WinCreatorOwnerServerSid,
 WinCreatorGroupServerSid,
 WinNtAuthoritySid,
 WinDialupSid,
 WinNetworkSid,
 WinBatchSid,
 WinInteractiveSid,
 WinServiceSid,
 WinAnonymousSid,
 WinProxySid,
 WinEnterpriseControllersSid,
 WinSelfSid,
 WinAuthenticatedUserSid,
 WinRestrictedCodeSid,
 WinTerminalServerSid,
 WinRemoteLogonIdSid,
 WinLogonIdsSid,
 WinLocalSystemSid,
 WinLocalServiceSid,
 WinNetworkServiceSid,
 WinBuiltinDomainSid,
 WinBuiltinAdministratorsSid,
 WinBuiltinUsersSid,
 WinBuiltinGuestsSid,
 WinBuiltinPowerUsersSid,
 WinBuiltinAccountOperatorsSid,
 WinBuiltinSystemOperatorsSid,
 WinBuiltinPrintOperatorsSid,
 WinBuiltinBackupOperatorsSid,
 WinBuiltinReplicatorSid,
 WinBuiltinPreWindows2000CompatibleAccessSid,
 WinBuiltinRemoteDesktopUsersSid,
 WinBuiltinNetworkConfigurationOperatorsSid,
 WinAccountAdministratorSid,
 WinAccountGuestSid,
 WinAccountKrbtgtSid,
 WinAccountDomainAdminsSid,
 WinAccountDomainUsersSid,
 WinAccountDomainGuestsSid,
 WinAccountComputersSid,
 WinAccountControllersSid,
 WinAccountCertAdminsSid,
 WinAccountSchemaAdminsSid,
 WinAccountEnterpriseAdminsSid,
 WinAccountPolicyAdminsSid,
 WinAccountRasAndIasServersSid,
 WinNTLMAuthenticationSid,
 WinDigestAuthenticationSid,
 WinSChannelAuthenticationSid,
 WinThisOrganizationSid,
 WinOtherOrganizationSid,
 WinBuiltinIncomingForestTrustBuildersSid,
 WinBuiltinPerfMonitoringUsersSid,
 WinBuiltinPerfLoggingUsersSid,
 WinBuiltinAuthorizationAccessSid,
 WinBuiltinTerminalServerLicenseServersSid);
 {$EXTERNALSYM WELL_KNOWN_SID_TYPE}
 TWellKnownSidType = WELL_KNOWN_SID_TYPE;
 
function CreateWellKnownSid(WellKnownSidType: WELL_KNOWN_SID_TYPE; DomainSid: PSID;
 pSid: PSID; var cbSid: DWORD): BOOL; stdcall;external advapi32 name 'CreateWellKnownSid';
 function CheckTokenMembership(TokenHandle: THANDLE; SidToCheck: PSID; var IsMember: BOOL): BOOL; stdcall; external advapi32 name 'CheckTokenMembership';
 Function GetProcessElevation(var pElevationType: TTokenElevationType;
 var pIsAdmin: LongBool): Boolean;
 const
 SECURITY_MAX_SID_SIZE = 68;
 VAR
 hToken: THandle;
 r: Cardinal;
 adminSID: array [0 .. SECURITY_MAX_SID_SIZE - 1] of byte;
 sidSize: Cardinal;
 e: Integer;
 hUnfilteredToken: THandle;
 Begin
 Result := False;
 sidSize := SizeOf(adminSID);
 if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hToken) and
 Windows.GetTokenInformation(hToken, Windows.TokenElevationType,
 @pElevationType, SizeOf(pElevationType), r) and
 CreateWellKnownSid(WinBuiltinAdministratorsSid, nil, PSid(@adminSID),
 sidSize) then
 begin
 case pElevationType of
 TokenElevationTypeLimited:
 begin
 if GetTokenInformation(hToken, TokenLinkedToken, @hUnfilteredToken,
 SizeOf(hUnfilteredToken), r) and
 (CheckTokenMembership(hUnfilteredToken, PSid(@adminSID),
 pIsAdmin)) then
 begin
 Result := true;
 CloseHandle(hUnfilteredToken);
 end;
 end;
 
else
 begin
 pIsAdmin := IsUserAnAdmin();
 Result := true;
 end;
 end;
 end
 else
 begin
 e := GetLastError();
 if e = 0 then
 begin
 GetTickCount;
 end;
 end;
 CloseHandle(hToken);
 
End;
 
调用示例:
 
procedure TForm4.Button1Click(Sender: TObject);
 var
 pIsAdmin: LongBool;
 pElevationType: TTokenElevationType;
 begin
 if GetProcessElevation(pElevationType, pIsAdmin) then
 begin
 case pElevationType of
 TokenElevationTypeLimited:
 ShowMessage('这是一个受限用户');
 TokenElevationTypeFull:
 ShowMessage('这是一个拥有管理员权限的用户');
 TokenElevationTypeDefault:
 ShowMessage('这是一个默认的用户');
 end;
 end;
 end;
复制代码

http://www.cnblogs.com/jxgxy/p/3335044.html

posted @   findumars  Views(1271)  Comments(0Edit  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2014-11-14 Golang哲学思想
点击右上角即可分享
微信分享提示