Я использую GetTokenInformation как часть кода, который определяет, работает ли текущий поток как администратор.
В любом случае, у меня есть структура TOKEN INFORMATION, которая выглядит следующим образом:
Private Type TOKEN_GROUPS
GroupCount As Long
Groups(500) As SID_AND_ATTRIBUTES
End Type
Затем я вызываю GetTokenInformation следующим образом:
res = GetTokenInformation(<Process Handle>, 2, <TOKEN_GROUPS>, _
<Token Info Length>, <Buffer Length)
Первый вызов - получить длину буфера, затем я вызываю его снова, чтобы получить информацию о токене.
В любом случае приложение внезапно завершит работу, когда учетная запись, в которой запущено приложение, подключена к домену. По-видимому, размер групп (500) как SID.AND.ATTRIBUTES недостаточен и вызывает переполнение буфера. Я не знаю, почему это так (MSDN говорит, что я должен предоставить ANYSIZE_ARRAY или 1). Увеличение размера групп до 1000 устраняет проблему.
В качестве быстрого исправления , и поскольку у меня нет идеи о том, как получить соответствующий размер групп , я планирую просто переопределить группы, пока вызов не будет успешным.
Вот мой вопрос:
У меня есть предложение On Error, но когда происходит переполнение буфера, On Error не может его перехватить, и мое приложение неожиданно падает. Почему это так?
С учетом приведенного ниже кода
Закрытый тип TOKEN_GROUPS
GroupCount As Long
Groups () как SID_AND_ATTRIBUTES 'FAILING
'Groups (1000), поскольку SID_AND_ATTRIBUTES НЕ ОТКАЗЫВАЕТСЯ
Тип конца
Dim X as TOKEN_GROUPS
Восстановить Сохранение X.Groups (1000) как ОШИБКА SID_AND_ATTRIBUTES
res = GetTokenInformation (, 2,,,
res = GetTokenInformation (, 2,,,
Почему, когда я объявлял Группы как 1000, вызов GetTokenInformation не прерывался, но когда я объявлял "пустые" Группы () и переопределял его до 1000, это сбой?
Спасибо!