Я пытаюсь определить, принадлежит ли учетная запись пользователя, в котором запущено приложение, к группе администраторов или нет в Visual Studio 2017 с использованием VC ++.Но когда я запускаю Программу в IDE, она останавливается в конце данной функции с диалоговым окном исключения, в котором говорится «Необработанное исключение в 0x7697B022 в Target.exe: исключение Microsoft C ++: произошла ошибка без знака в ячейке памяти 0x00CFF638.Но я нажимаю «Продолжить» в IDE, выполнение продолжается и завершается выполнение Программы.
BOOL TargetAppClass::IsUserInAdminGroup()
{
BOOL fInAdminGroup = FALSE;
DWORD dwError = ERROR_SUCCESS;
HANDLE hToken = NULL;
HANDLE hTokenToCheck = NULL;
DWORD cbSize = 0;
OSVERSIONINFO osver = { sizeof(osver) };
// Open the primary access token of the process for query and duplicate.
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE,
&hToken))
{
dwError = GetLastError();
}
OSVERSIONINFOEX ptrVerInfo;
ZeroMemory(&ptrVerInfo, sizeof(OSVERSIONINFOEX));
ptrVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
ptrVerInfo.dwMajorVersion = 10;
ptrVerInfo.dwMinorVersion = 1;
DWORDLONG dwlConditionMask = 0;
int op = VER_GREATER_EQUAL;
VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, op);
VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, op);
VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMAJOR, op);
VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMINOR, op);
if (!VerifyVersionInfoA(&ptrVerInfo, VER_MAJORVERSION, dwlConditionMask))
{
dwError = GetLastError();
}
if (ptrVerInfo.dwMajorVersion >= 6)
{
TOKEN_ELEVATION_TYPE elevType;
if (!GetTokenInformation(hToken, TokenElevationType, &elevType,
sizeof(elevType), &cbSize))
{
dwError = GetLastError();
}
// If limited, get the linked elevated token for further check.
if (TokenElevationTypeLimited == elevType)
{
if (!GetTokenInformation(hToken, TokenLinkedToken, &hTokenToCheck,
sizeof(hTokenToCheck), &cbSize))
{
dwError = GetLastError();
}
}
}
if (!hTokenToCheck)
{
if (!DuplicateToken(hToken, SecurityIdentification, &hTokenToCheck))
{
dwError = GetLastError();
}
}
// Create the SID corresponding to the Administrators group.
BYTE adminSID[SECURITY_MAX_SID_SIZE];
cbSize = sizeof(adminSID);
if (!CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, &adminSID,
&cbSize))
{
dwError = GetLastError();
}
// To determine whether a SID is enabled in a token, that is, whether it
// has the SE_GROUP_ENABLED attribute, call CheckTokenMembership.
if (!CheckTokenMembership(hTokenToCheck, &adminSID, &fInAdminGroup))
{
dwError = GetLastError();
}
// Centralized cleanup for all allocated resources.
if (hToken)
{
CloseHandle(hToken);
hToken = NULL;
}
if (hTokenToCheck)
{
CloseHandle(hTokenToCheck);
hTokenToCheck = NULL;
}
// Throw the error if something failed in the function.
if (ERROR_SUCCESS != dwError)
{
throw dwError;
}
return fInAdminGroup;
}
Я хотел знать, какую ошибку я делаю, что нужно сделать, чтобы устранить это исключение.