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 することを計画しています。
これが私の質問です:
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 に ReDim すると失敗するのはなぜですか?