以前、こんなコードを書きました(アクセス許可の指定でリモートアクセスを禁じる)。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関数で解放する必要があって、面倒だなあと思うのです。

スポンサード リンク

この記事のカテゴリ

  • ⇒ Windows 10 SDKで加わったSID型への補助