|
ユーザーにファイルのアクセス権を追加する |
|
今回使用する名前空間は、前回と同じく以下の通りである。
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
ファイルのアクセス権を追加するとは、明示的なアクセス許可を与えることであり、権限の継承のあるなしにかかわらず行うことができる。
アクセス権の追加を行うには、AddAccessRuleメソッドを使う。
string filePath = @"D:\Shared\test\acltest.txt";
//付与する権限を定義
FileSystemAccessRule rule =
new FileSystemAccessRule(
new NTAccount("User"), //ユーザー
FileSystemRights.Modify, //変更権限
AccessControlType.Allow);//アクセス許可
//ファイルセキュリティオブジェクトを取得
FileSecurity security = File.GetAccessControl(filePath);
//権限付与
security.AddAccessRule(rule);
//変更したファイルセキュリティをファイルに設定
File.SetAccessControl(filePath, security);
FileSystemAccessRuleクラスのコンストラクタは3つの引数をとる。
第一引数はIdentityReferenceクラスで、これを継承したNTAccountクラスを渡すこともできる。
第二引数はFileSystemRights列挙体で、「Windowsのファイルアクセス権限(1)」「Windowsのファイルアクセス権限(2)」で説明した値のいずれか、もしくは複数組み合わせ("|"による論理和)を指定する。
第三引数はAccessControlTypeで、通常はAllowを指定する。
AddAccessRuleメソッドはアクセス権を追加するメソッドである。引数に付与する権限を渡す。
SetAccessControlメソッドはファイルにファイルセキュリティを設定し直すメソッドで、これを忘れると権限の更新が行われない。
|
|
プログラムのテスト |
|
プログラムを実行する前のアクセス権はこんな感じ。
プログラムを実行した結果は以下。「<継承なし>」のアクセス権が追加されている。
|
|
ユーザーにフォルダーのアクセス権を追加する |
|
フォルダーのアクセス権を追加するには、やはりAddAccessRuleメソッドを使う。フォルダーは子オブジェクトに権限を継承するかどうかという点が、ファイルの権限と異なる。
string folderPath = @"D:\Shared\test\acltest";
//付与する権限を定義
FileSystemAccessRule rule =
new FileSystemAccessRule(
new NTAccount("User"), //Userユーザー
FileSystemRights.Modify, //変更権限
InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,
PropagationFlags.None, //継承範囲の制限なし
AccessControlType.Allow);//アクセス許可
//ディレクトリセキュリティオブジェクトを取得
DirectorySecurity security = Directory.GetAccessControl(folderPath);
//権限付与
security.AddAccessRule(rule);
//変更したアクセス権をファイルに設定
Directory.SetAccessControl(folderPath, security);
FileSystemAccessRuleクラスのコンストラクタは、今回は5つの引数をとるものを使う。
第三引数はInheritanceFlags列挙体で、権限の継承を、ファイルに対して行うか、フォルダーに対して行うか設定する。
第四引数はPropagationFlags列挙体で、アクセス権限を適用する範囲を設定する。
InheritanceFlagsとPropagationFlagsの詳細は、アクセス権限の継承を参照のこと。
|
|
プログラムのテスト |
|
プログラムを実行する前のアクセス権。
プログラムを実行した結果は以下。「<継承なし>」のアクセス権が追加されている。
適用先確認のため、ダブルクリックしてアクセス許可エントリを開く。適用先が「このフォルダー、サブフォルダーおよびファイル」になっている上、「これらのアクセス許可を、このコンテナーの中にあるオブジェクトやコンテナーにのみ適用する」のチェックが外れていることを確認。
|
|
既知の問題 |
|
アクセス権を追加するためには、実行ユーザーに、そのファイルまたはフォルダーの「アクセス許可の変更」権限がないといけない。
既定の組み合わせでは、フルコントロールがないとアクセス権の変更ができない。(変更、書き込みには「アクセス許可の変更」権限がないことに注意。)
権限が不足する場合、SetAccessControlメソッド実行時に例外UnauthorizedAccessException(現在のプロセスには、ファイルを開くために必要なアクセス権がありません。)が発生する。
|