먼저 토큰을 확인하십시오. TOKEN_ELEVATION_TYPE
.
당신은 TokenElevationTypeDefault
또는 TokenElevationTypeFull
가지고 있다면 - 당신이 상승하고 이미 토큰에있는이 사용자 계정에서 가질 수있는 최대 수 있습니다. 쿼리에 대한 토큰은 admin이거나 일부 권한이 있습니까? 현재 토큰을 그대로 쿼리해야합니다.
당신이 TokenElevationTypeLimited
을 가지고있는 경우 - 때문에 고도 특권 신청 후이 토큰을 사용하는 것입니다 - 당신이 TokenLinkedToken
통해 연결 토큰에 대해 질의하고이 토큰 대신 현재 토큰을 연결 확인해야합니다. 예를 들어
:
ULONG IsTokenAdmin(HANDLE hToken, PBOOL pbIsAdmin)
{
ULONG cbSid = MAX_SID_SIZE;
PSID pSid = alloca(cbSid);
return CreateWellKnownSid(::WinBuiltinAdministratorsSid, 0, pSid, &cbSid) &&
CheckTokenMembership(hToken, pSid, pbIsAdmin) ? NOERROR : GetLastError();
}
ULONG IsUserAnAdminEx(PBOOL pbIsAdmin, PBOOL pbNeedElevate)
{
ULONG dwError = NOERROR;
HANDLE hToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &hToken))
{
ULONG cb;
union {
TOKEN_ELEVATION_TYPE tet;
TOKEN_LINKED_TOKEN tlt;
};
if (GetTokenInformation(hToken, ::TokenElevationType, &tet, sizeof(tet), &cb))
{
switch (tet)
{
case TokenElevationTypeLimited:
*pbNeedElevate = TRUE;
if (GetTokenInformation(hToken, ::TokenLinkedToken, &tlt, sizeof(tlt), &cb))
{
dwError = IsTokenAdmin(tlt.LinkedToken, pbIsAdmin);
CloseHandle(tlt.LinkedToken);
}
else
{
dwError = GetLastError();
}
break;
case TokenElevationTypeFull:
case TokenElevationTypeDefault:
*pbNeedElevate = FALSE;
// only because CheckTokenMembership want an impersonation token.
// really most query can be and must be done direct with this token
if (DuplicateToken(hToken, ::SecurityIdentification, &tlt.LinkedToken))
{
dwError = IsTokenAdmin(tlt.LinkedToken, pbIsAdmin);
CloseHandle(tlt.LinkedToken);
}
else
{
GetLastError();
}
break;
default:
dwError = ERROR_GEN_FAILURE;
}
}
else
{
dwError = GetLastError();
}
CloseHandle(hToken);
}
return dwError;
}
'이 NetUserGetLocalGroups()'아마. –