我将GetTokenInformation
用作确定当前线程是否以管理员身份运行的代码的一部分。
无论如何,我有一个令牌信息结构,看起来像这样:
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可解决此问题。
作为一种快速解决方法,[[并且由于我不知道如何获取适当的组大小],我打算重新调整组的大小,直到调用成功。这是我的问题:
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时,它失败了?
我正在使用GetTokenInformation作为确定当前线程是否以管理员身份运行的代码的一部分。无论如何,我有一个令牌信息结构,如下所示:...
Groups
使用动态大小的数组,则需要“自定义API调用封送处理”代码。基本上是几个CopyMemory和一个数组调整大小