ホームC#でファイルアクセス権限の付与 > アクセス権限の継承
アクセス権限の継承
通常ファイルやフォルダーを作成するときに、誰にどのような権限を与えるかなど意識することはない。それでも支障なくシステムを運用できるのは、新しいファイルやフォルダーが上位フォルダーのアクセス権限を継承しているからである。現在のフォルダーで作業ができれば、そこで作成したファイルも自由に操作できるだろうと想定をつけられるわけである。



アクセス権限の継承を考える場合、権限を継承する先がファイルか、フォルダーか、また権限を適用する範囲が、自分自身を含めるか、子階層を含めるか、孫階層まで含めるか、それぞれ決める必要がある。また、親から継承するよう指定されていても、継承を行わないと子オブジェクト側で指定することもできる。

なお、ファイルは配下にフォルダーやファイルを持たないので、継承の考え方は適用されない。
アクセス権限を継承する先を、ファイルまたはフォルダーに指定する
フォルダーの配下にファイルとフォルダーがある場合、その種類を限定してアクセス権限を継承させることができる。継承する種類は、以下の通りである。
  • サブフォルダー
  • ファイル
この種類は積み上げて指定することができ、デフォルトでは上記すべてが指定されるよう設定されている。



C#の列挙体では以下のようになる。
  • InheritanceFlags.None (サブフォルダーもファイルも含めない→このフォルダーのみ)
  • InheritanceFlags.ContainerInherit (サブフォルダー)
  • InheritanceFlags.ObjectInherit (ファイル)
▼InheritanceFlags.None
ThisFolder\
├SubFolder\
|├SubSubFolder\
|└SubFolderFile
└File

▼InheritanceFlags.ContainerInherit
ThisFolder\SubFolder\
|├SubSubFolder\
|└SubFolderFile
└File

▼InheritanceFlags.ObjectInherit
ThisFolder\
├SubFolder\
|├SubSubFolder\
|└SubFolderFile
└File
ContainerInheritとObjectInheritを論理和で指定すると両指定になる。
▼InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit
ThisFolder\SubFolder\
|├SubSubFolder\
|└SubFolderFileFile
アクセス権限を適用する範囲
継承を定義する場合、自分自身のフォルダー、子階層、さらに孫階層以下と、継承範囲を指定することができる。継承範囲は以下の通りである。
  • このフォルダー
  • 子階層
  • 孫階層以下
継承範囲は下記の積み上げで指定する。ただし継承するオブジェクトの種類でInheritanceFlags.Noneが指定されている場合、そもそも継承が行われないのでここでの設定は無視される。

C#の列挙体では、以下のようになる。
  • PropagationFlags.None (このフォルダー以下すべてに適用)
  • PropagationFlags.InheritOnly (このフォルダーに適用せず、子階層以下に継承)
  • PropagationFlags.NoPropagateInherit (このフォルダーと子階層には適用するが、孫階層以下には継承しない)
▼PropagationFlags.None
ThisFolder\SubFolder\
|├SubSubFolder\
|└SubFolderFileFile

▼PropagationFlags.InheritOnly
ThisFolder\
├SubFolder\
|├SubSubFolder\
|└SubFolderFileFile

▼PropagationFlags.NoPropagateInherit
ThisFolder\SubFolder\
|├SubSubFolder\
|└SubFolderFile
└File
InheritOnlyとNoPropagateInheritを論理和で指定すると子階層のみへの適用になる。
▼PropagationFlags.InheritOnly | PropagationFlags.NoPropagateInherit
ThisFolder\
├SubFolder\
|├SubSubFolder\
|└SubFolderFile
└File
上記適用範囲がファイルに及ぶかフォルダーに及ぶかは、InheritanceFlagsで決定する。
アクセス権限の追加
親階層から継承したアクセス権限に加え、現在のフォルダーにアクセス権限を追加することができる。継承された権限を継承されたアクセス許可、このフォルダーから追加したアクセス許可を明示的なアクセス許可という。この場合アクセス権限は、両方のアクセス権限の積み上げになる。

セキュリティの詳細設定画面では、[追加]ボタンを押して権限を追加すると、継承元が「<継承なし>」としてアクセス権限が追加される。



C#では、FileSecurityクラスのSetAccessRuleまたはAddAccessRuleメソッドを使って明示的なアクセス許可を追加することができる。
アクセス権限の継承を削除
子階層にアクセス権限を継承する設定になっていても、子オブジェクト側で権限を継承しない(継承から保護する)設定が可能である。継承を行わない場合、このオブジェクトのアクセス権限として、継承するはずだった権限をオブジェクト独自のアクセス権限として設定するか、権限を空っぽにしてしまうか選択できる。いずれの場合も、そこから権限の追加・削除の設定が必要である。



上記画面で[削除]ボタンを押すと、アクセス権限は以下のようになる。



アクセス許可を空にしたまま確定してしまうと、所有者がアクセス許可を与え直さない限り、ファイルに対し誰も何もできなくなってしまう。

C#では、FileSecurityクラスのSetAccessRuleProtectionメソッドを使って継承を削除(継承から保護)することができる。
次のステップ
ファイルのアクセス権を列挙する
Copyright (c) 2010 BOSS. All rights reserved.