我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)
第一次调用是获取缓冲区长度,然后我再次调用它以获取令牌信息。
无论如何,当运行应用程序的帐户连接到域时,应用程序会突然崩溃。显然,
Groups(500) As SID.AND.ATTRIBUTES
还不够,并导致缓冲区溢出。我不知道为什么会这样(MSDN 说我应该提供一个ANYSIZE_ARRAY
或 1)。将组的大小增加到 1000 可以解决此问题。
作为一种快速解决方法,由于我不知道如何获得适当大小的 Groups,我打算只重新调整 Groups 直到调用成功。
这是我的问题:
我有一个
On Error
子句,但是当缓冲区溢出时,On Error
无法捕获它并且我的应用程序突然崩溃。这是为什么?鉴于下面的代码
Private Type TOKEN_GROUPS
GroupCount As Long
Groups() As SID_AND_ATTRIBUTES 'FAILING
'Groups(1000) As SID_AND_ATTRIBUTES DOES NOT FAIL
End Type
Dim X as TOKEN_GROUPS
ReDim Preserve X.Groups(1000) As SID_AND_ATTRIBUTES 'FAILING
res = GetTokenInformation(<Process Handle>, 2, <TOKEN_GROUPS>, <Token Info Length>, <Buffer Length)
res = GetTokenInformation(<Process Handle>, 2, <TOKEN_GROUPS>, <Token Info Length>, <Buffer Length)
为什么当我将 Groups 声明为 1000 时,GetTokenInformation
调用并没有失败,但是当我声明“空”Groups()
并将其重新设置为 1000 时,它失败了?