3

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)

最初の呼び出しは Buffer Length を取得することであり、次にもう一度呼び出してトークン情報を取得します。

いずれにせよ、アプリケーションを実行するアカウントがドメインに接続されると、アプリケーションは突然クラッシュします。どうやら、のサイズ、

Groups(500) As SID.AND.ATTRIBUTES

十分ではなく、バッファ オーバーランを引き起こしています。その理由はわかりません (MSDN では、ANYSIZE_ARRAYまたは 1 を指定する必要があると書かれています)。グループのサイズを 1000 に増やすと、問題が解決します。

簡単な修正として、Groups の適切なサイズを取得する方法がわからないため、呼び出しが成功するまで Groups を ReDim することを計画しています。

これが私の質問です:

  1. On Error節がありますが、バッファ オーバーランが発生するとOn Error、それをキャッチできず、アプリが突然クラッシュします。何故ですか?

  2. 以下のコードを考えると

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 に ReDim すると失敗するのはなぜですか?

4

2 に答える 2

2

GetTokenInformation 呼び出しを解決したと思われる別の質問がここにあります。受け入れられた回答からコピー:

GetTokenInformation(hToken, 1, ByVal 0, 0, lNeeded) を呼び出す
ReDim baBuffer(0 から lNeeded)
...
于 2009-12-04T21:26:33.340 に答える