Win32 API 日本語リファレンス
ホームSecurity › TOKEN_GROUPS_AND_PRIVILEGES

TOKEN_GROUPS_AND_PRIVILEGES

構造体
サイズx64: 56 バイト / x86: 44 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
SidCountDWORD4+0+0アクセス トークン内の SID の数。
SidLengthDWORD4+4+4すべてのユーザー SID とグループのアカウント SID を保持するために必要な長さ (バイト単位)。
SidsSID_AND_ATTRIBUTES*8/4+8+8

SID のセットと対応する属性を格納する SID_AND_ATTRIBUTES 構造体の配列へのポインター。

SID_AND_ATTRIBUTES 構造体の Attributes メンバーには、次の値を指定できます。

意味
SE_GROUP_ENABLED
0x00000004L
この SID はアクセス チェックに対して有効です。システムがアクセス チェックを実行すると、その SID に適用されるアクセス許可およびアクセス拒否のアクセス制御エントリ (ACE) が検査されます。

この属性を持たない SID は、SE_GROUP_USE_FOR_DENY_ONLY 属性が設定されていない限り、アクセス チェック時に無視されます。

SE_GROUP_ENABLED_BY_DEFAULT
0x00000002L
この SID は既定で有効です。
SE_GROUP_INTEGRITY
0x00000020L
この SID は必須整合性 SID です。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: この値はサポートされていません。

SE_GROUP_INTEGRITY_ENABLED
0x00000040L
必須整合性 SID がアクセス チェック時に評価されます。

Windows Server 2008、Windows Vista、Windows Server 2003 および Windows XP: この値はサポートされていません。

SE_GROUP_LOGON_ID
0xC0000000L
この SID は、アクセス トークンに関連付けられたログオン セッションを識別するログオン SID です。
SE_GROUP_MANDATORY
0x00000001L
この SID は、 AdjustTokenGroups 関数の呼び出しでは SE_GROUP_ENABLED 属性をクリアできません。ただし、 CreateRestrictedToken 関数を使用すると、必須 SID を拒否専用 SID に変換できます。
SE_GROUP_OWNER
0x00000008L
この SID は、トークンのユーザーがグループの所有者となっているグループ アカウントを識別します。または、この SID をトークンやオブジェクトの所有者として割り当てることができます。
SE_GROUP_RESOURCE
0x20000000L
この SID はドメイン ローカル グループを識別します。
SE_GROUP_USE_FOR_DENY_ONLY
0x00000010L
この SID は、 制限付きトークン内の拒否専用 SID です。システムがアクセス チェックを実行すると、その SID に適用されるアクセス拒否 ACE が検査され、その SID に対するアクセス許可 ACE は無視されます。

この属性が設定されている場合、SE_GROUP_ENABLED は設定されず、この SID を再度有効にすることはできません。

RestrictedSidCountDWORD4+16+12制限された SID の数。
RestrictedSidLengthDWORD4+20+16すべての制限された SID を保持するために必要な長さ (バイト単位)。
RestrictedSidsSID_AND_ATTRIBUTES*8/4+24+20

制限された SID のセットと対応する属性を格納する SID_AND_ATTRIBUTES 構造体の配列へのポインター。

SID_AND_ATTRIBUTES 構造体の Attributes メンバーには、前述の Sids メンバーに記載されているものと同じ値を指定できます。

PrivilegeCountDWORD4+32+24特権の数。
PrivilegeLengthDWORD4+36+28特権の配列を保持するために必要な長さ (バイト単位)。
PrivilegesLUID_AND_ATTRIBUTES*8/4+40+32特権の配列。
AuthenticationIdLUID8+48+36トークンの認証元のローカル一意識別子 (LUID)。

公式ドキュメント

TOKEN_GROUPS_AND_PRIVILEGES 構造体は、グループのセキュリティ識別子 (SID) と、アクセス トークン内の特権に関する情報を格納します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// LUID  (x64 8 / x86 8 バイト)
typedef struct LUID {
    DWORD LowPart;
    INT HighPart;
} LUID;

// TOKEN_GROUPS_AND_PRIVILEGES  (x64 56 / x86 44 バイト)
typedef struct TOKEN_GROUPS_AND_PRIVILEGES {
    DWORD SidCount;
    DWORD SidLength;
    SID_AND_ATTRIBUTES* Sids;
    DWORD RestrictedSidCount;
    DWORD RestrictedSidLength;
    SID_AND_ATTRIBUTES* RestrictedSids;
    DWORD PrivilegeCount;
    DWORD PrivilegeLength;
    LUID_AND_ATTRIBUTES* Privileges;
    LUID AuthenticationId;
} TOKEN_GROUPS_AND_PRIVILEGES;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct LUID
{
    public uint LowPart;
    public int HighPart;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TOKEN_GROUPS_AND_PRIVILEGES
{
    public uint SidCount;
    public uint SidLength;
    public IntPtr Sids;
    public uint RestrictedSidCount;
    public uint RestrictedSidLength;
    public IntPtr RestrictedSids;
    public uint PrivilegeCount;
    public uint PrivilegeLength;
    public IntPtr Privileges;
    public LUID AuthenticationId;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure LUID
    Public LowPart As UInteger
    Public HighPart As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TOKEN_GROUPS_AND_PRIVILEGES
    Public SidCount As UInteger
    Public SidLength As UInteger
    Public Sids As IntPtr
    Public RestrictedSidCount As UInteger
    Public RestrictedSidLength As UInteger
    Public RestrictedSids As IntPtr
    Public PrivilegeCount As UInteger
    Public PrivilegeLength As UInteger
    Public Privileges As IntPtr
    Public AuthenticationId As LUID
End Structure
import ctypes
from ctypes import wintypes

class LUID(ctypes.Structure):
    _fields_ = [
        ("LowPart", wintypes.DWORD),
        ("HighPart", ctypes.c_int),
    ]

class TOKEN_GROUPS_AND_PRIVILEGES(ctypes.Structure):
    _fields_ = [
        ("SidCount", wintypes.DWORD),
        ("SidLength", wintypes.DWORD),
        ("Sids", ctypes.c_void_p),
        ("RestrictedSidCount", wintypes.DWORD),
        ("RestrictedSidLength", wintypes.DWORD),
        ("RestrictedSids", ctypes.c_void_p),
        ("PrivilegeCount", wintypes.DWORD),
        ("PrivilegeLength", wintypes.DWORD),
        ("Privileges", ctypes.c_void_p),
        ("AuthenticationId", LUID),
    ]
#[repr(C)]
pub struct LUID {
    pub LowPart: u32,
    pub HighPart: i32,
}

#[repr(C)]
pub struct TOKEN_GROUPS_AND_PRIVILEGES {
    pub SidCount: u32,
    pub SidLength: u32,
    pub Sids: *mut core::ffi::c_void,
    pub RestrictedSidCount: u32,
    pub RestrictedSidLength: u32,
    pub RestrictedSids: *mut core::ffi::c_void,
    pub PrivilegeCount: u32,
    pub PrivilegeLength: u32,
    pub Privileges: *mut core::ffi::c_void,
    pub AuthenticationId: LUID,
}
import "golang.org/x/sys/windows"

type LUID struct {
	LowPart uint32
	HighPart int32
}

type TOKEN_GROUPS_AND_PRIVILEGES struct {
	SidCount uint32
	SidLength uint32
	Sids uintptr
	RestrictedSidCount uint32
	RestrictedSidLength uint32
	RestrictedSids uintptr
	PrivilegeCount uint32
	PrivilegeLength uint32
	Privileges uintptr
	AuthenticationId LUID
}
type
  LUID = record
    LowPart: DWORD;
    HighPart: Integer;
  end;

  TOKEN_GROUPS_AND_PRIVILEGES = record
    SidCount: DWORD;
    SidLength: DWORD;
    Sids: Pointer;
    RestrictedSidCount: DWORD;
    RestrictedSidLength: DWORD;
    RestrictedSids: Pointer;
    PrivilegeCount: DWORD;
    PrivilegeLength: DWORD;
    Privileges: Pointer;
    AuthenticationId: LUID;
  end;
const LUID = extern struct {
    LowPart: u32,
    HighPart: i32,
};

const TOKEN_GROUPS_AND_PRIVILEGES = extern struct {
    SidCount: u32,
    SidLength: u32,
    Sids: ?*anyopaque,
    RestrictedSidCount: u32,
    RestrictedSidLength: u32,
    RestrictedSids: ?*anyopaque,
    PrivilegeCount: u32,
    PrivilegeLength: u32,
    Privileges: ?*anyopaque,
    AuthenticationId: LUID,
};
type
  LUID {.bycopy.} = object
    LowPart: uint32
    HighPart: int32

  TOKEN_GROUPS_AND_PRIVILEGES {.bycopy.} = object
    SidCount: uint32
    SidLength: uint32
    Sids: pointer
    RestrictedSidCount: uint32
    RestrictedSidLength: uint32
    RestrictedSids: pointer
    PrivilegeCount: uint32
    PrivilegeLength: uint32
    Privileges: pointer
    AuthenticationId: LUID
struct LUID
{
    uint LowPart;
    int HighPart;
}

struct TOKEN_GROUPS_AND_PRIVILEGES
{
    uint SidCount;
    uint SidLength;
    void* Sids;
    uint RestrictedSidCount;
    uint RestrictedSidLength;
    void* RestrictedSids;
    uint PrivilegeCount;
    uint PrivilegeLength;
    void* Privileges;
    LUID AuthenticationId;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; TOKEN_GROUPS_AND_PRIVILEGES サイズ: 44 バイト(x86)
dim st, 11    ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; SidCount : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; SidLength : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; Sids : SID_AND_ATTRIBUTES* (+8, 4byte)  varptr(st)+8 を基点に操作(4byte:入れ子/配列)
; RestrictedSidCount : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; RestrictedSidLength : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; RestrictedSids : SID_AND_ATTRIBUTES* (+20, 4byte)  varptr(st)+20 を基点に操作(4byte:入れ子/配列)
; PrivilegeCount : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; PrivilegeLength : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; Privileges : LUID_AND_ATTRIBUTES* (+32, 4byte)  varptr(st)+32 を基点に操作(4byte:入れ子/配列)
; AuthenticationId : LUID (+36, 8byte)  varptr(st)+36 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; TOKEN_GROUPS_AND_PRIVILEGES サイズ: 56 バイト(x64)
dim st, 14    ; 4byte整数×14(構造体サイズ 56 / 4 切り上げ)
; SidCount : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; SidLength : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; Sids : SID_AND_ATTRIBUTES* (+8, 8byte)  varptr(st)+8 を基点に操作(8byte:入れ子/配列)
; RestrictedSidCount : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; RestrictedSidLength : DWORD (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; RestrictedSids : SID_AND_ATTRIBUTES* (+24, 8byte)  varptr(st)+24 を基点に操作(8byte:入れ子/配列)
; PrivilegeCount : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; PrivilegeLength : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; Privileges : LUID_AND_ATTRIBUTES* (+40, 8byte)  varptr(st)+40 を基点に操作(8byte:入れ子/配列)
; AuthenticationId : LUID (+48, 8byte)  varptr(st)+48 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global LUID
    #field int LowPart
    #field int HighPart
#endstruct

#defstruct global TOKEN_GROUPS_AND_PRIVILEGES
    #field int SidCount
    #field int SidLength
    #field intptr Sids
    #field int RestrictedSidCount
    #field int RestrictedSidLength
    #field intptr RestrictedSids
    #field int PrivilegeCount
    #field int PrivilegeLength
    #field intptr Privileges
    #field LUID AuthenticationId
#endstruct

stdim st, TOKEN_GROUPS_AND_PRIVILEGES        ; NSTRUCT 変数を確保
st->SidCount = 100
mes "SidCount=" + st->SidCount