以前、こんなコードを書きました(アクセス許可の指定でリモートアクセスを禁じる)。SID型は可変長のため、十分な大きさのchar配列との共用体を作っているというものです。
union { char buffer[SECURITY_MAX_SID_SIZE]; SID sid; } networkLogon = {}; DWORD sidNetworkSize = sizeof networkLogon; if (!CreateWellKnownSid( WinNetworkSid, nullptr, &networkLogon.sid, &sidNetworkSize)) { ATL::AtlThrowLastWin32(); } |
Windows 10のSDKから、うってつけのものが追加されました。winnt.hのSE_SIDです。
typedef union _SE_SID { SID Sid; BYTE Buffer[SECURITY_MAX_SID_SIZE]; } SE_SID, *PSE_SID; |
自分が書いたものと同じような共用体です。これは感激です。もう自分でこんな共用体を作る必要がなくなりました。
これを使ってコードを書き直すとこうなります。
SE_SID networkLogon = {}; DWORD sidNetworkSize = sizeof networkLogon; if (!CreateWellKnownSid( WinNetworkSid, nullptr, &networkLogon.Sid, &sidNetworkSize)) { ATL::AtlThrowLastWin32(); } |
ほかの例です。Administratorsグループ (S-1-5-32-544)のSIDを作るコードです。
SE_SID sid = { SID_REVISION, 2, SECURITY_NT_AUTHORITY }; sid.Sid.SubAuthority[0] = SECURITY_BUILTIN_DOMAIN_RID; sid.Sid.SubAuthority[1] = DOMAIN_ALIAS_RID_ADMINS; |
こんな風にローカル変数でSIDオブジェクトを作ること、私はよくやります。AllocateAndInitializeSid関数を使う例をよく見かけますが、それだとFreeSid関数で解放する必要があって、面倒だなあと思うのです。
スポンサード リンク |