Windows APIのSIDとACL

前回のSIDがAPIのCインタフェースでどうなっているのか。

Everyoneを表すSIDであるS-1-1-0、これはworldとも呼ばれるが、最初のS-1は固定、次の1がEveryoneを表すauthorityが以下のようにdefineされている。

以下のように定義する。

最後の0がEveryoneを表すRIDで以下のように定義されている。

ここから内部表現であるSIDへのポインタPSIDを得るにはAllocateAndInitializeSidを使う。

第1引数がauthority
第2引数がsubauthorityの数で最大8個まで指定でき、全部引数で渡す。RIDはsubauthorityの一つのようだ。
最後の引数が結果のSIDが返る。SIDを使い終わったらFreeSidで解放する。

ここからACLを作成するにはSetEntriesInAclを使う。ACLはACEのリストでACEの中にSIDがある。
この関数は以下のように宣言されている。

この関数はEXPLICIT_ACCESSという構造体を渡す。以下のように宣言されている。

grfAccessPermissionsはDWORDのビットマスクの変数で読み込みや書き込みなどを指定する。たとえば以下のような値を指定できる。

grfAccessModeは許可、拒否をなどを指定する。以下のenumを使う。

この2つがエクスプローラなどのファイルのセキュリティで表示されるものなのだろう。

grfInheritanceは継承関係を指定するがここではスルー、NO_INHERITANCE(=0)などを指定する。

TrusteeはTRUSTEE構造体、以下のように宣言されている。

pMultipleTrusteeはNULL固定
MultipleTrusteeOperationはNO_MULTIPLE_TRUSTEE固定
TrusteeFormは最後の引数の型を指定する。TRUSTEE_IS_SID(=0)を指定してSIDを渡す。
TrusteeTypeは渡すSIDがユーザかグループかを指定するらしいが、これはSIDで指定されるはずなので重複な気がする。everyoneの場合はTRUSTEE_IS_WELL_KNOWN_GROUPを指定する。
ptstrNameでSIDを指定する。

OldAclは既存のACLに追加する場合に指定する。新しく作る場合はNULL。
NewAclに結果が返る。使い終わったらLocalFreeで解放する。

これでACLができたので、これをたとえばファイルに適用するにはSetNamedSecurityInfoを使う。詳細はスルー

C:\T\Test.txtをeveryoneでの読み書き許可を与えるには以下のコードになる。

ファイルのセキュリティをエクスプローラで見るとeveryoneが追加されているはず、vista以降は管理者権限が必要かもしれない。このコードは新規のACLを指定したにもかかわらず、ファイルのセキュリティには他のACLも表示されるが、これは継承しているためだと思われる。

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)