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
;
Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号
执行时间: 0.049402952194214 seconds