在Visual Basic 6中使用GetTokenInformation来确定用户是否是管理员

问题描述 投票:3回答:2

我将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可解决此问题。

作为一种快速解决方法,[[并且由于我不知道如何获取适当的组大小],我打算重新调整组的大小,直到调用成功。这是我的问题:

  1. 我有一个On Error子句,但是当缓冲区溢出发生时,On Error无法捕获它,我的应用突然崩溃。为什么会这样?

  2. 给出下面的代码
  3. 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作为确定当前线程是否以管理员身份运行的代码的一部分。无论如何,我有一个令牌信息结构,如下所示:...

winapi vb6 windows-security
2个回答
3
投票
如果要对Groups使用动态大小的数组,则需要“自定义API调用封送处理”代码。基本上是几个CopyMemory和一个数组调整大小

2
投票
还有另一个问题here,似乎已经解决了GetTokenInformation调用。从接受的答案中复制:
© www.soinside.com 2019 - 2024. All rights reserved.