ホームC#でファイルアクセス権限の付与 > ユーザーのアクセス権を削除する
ユーザーのファイルアクセス権を削除する
今回使用する名前空間は、前回と同じく以下の通りである。
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
ファイルアクセス権を削除するには、まず継承の保護を解除しなければならない。解除後、アクセス権限を削除するのだが、削除する方法は5つある。
メソッド説明
PurgeAccessRules特定のユーザーの権限をすべて削除
RemoveAccessRule特定の権限を削除。
RemoveAccessRuleSpecificとの違いが不明。
RemoveAccessRuleSpecific指定の権限に正確に一致する権限を削除
RemoveAccessRuleAll指定した権限に設定されているユーザー、種類を取得し、
それと一致する権限をすべて削除
ResetAccessRule既存の権限をすべて削除した後、指定した権限を追加

一番実用に即していると思われるPurgeAccessRulesのサンプルを以下に示す。
string filePath = @"D:\Shared\test\removeacl.txt";

//セキュリティオブジェクト取得
FileSecurity security = File.GetAccessControl(filePath);
//継承状態は解除するが、権限は継承
security.SetAccessRuleProtection(true, true);
//ユーザーに関する権限を削除
security.PurgeAccessRules(new NTAccount(Environment.MachineName + "\\User"));
//アクセス権更新
File.SetAccessControl(filePath, security);
SetAccessRuleProtectionメソッドは、権限の継承を解除するかどうかの設定を行う。
第一引数は、権限の継承から保護するかどうかを指定する。
第二引数は、第一引数でtrueを指定している場合のみ有効で、権限を「<継承なし>」の状態で引き継ぐかどうか指定する。ここでtrueを指定すると「<継承なし>」の状態で、継承されるべき権限が設定される。falseを指定すると、権限がすべてクリアされる。
PurgeAccessRulesメソッドは、特定のユーザーに関する権限をクリアする。クリアできるのは「<継承なし>」に設定されている権限だけであることに、注意が必要である。引数にはIndentityReferenceクラスを指定するが、それを継承したNTAccountクラスを指定することもできる。
権限の追加の時と同じく、最後にSetAccessControlメソッドを発行するのを忘れてはならない。
プログラムのテスト
プログラムを実行する前のアクセス権は以下。



プログラムを実行した結果は以下。「User」に関するアクセス許可が削除されている。また、権限がすべて「<継承なし>」になっている。

ユーザーのフォルダーアクセス権を削除する
フォルダーのアクセス権の削除方法は、ファイルの時と変わるところはない。同じではつまらないので、RemoveAccessRuleAllメソッドを使ったサンプルをのせる。
string folderPath = @"D:\Shared\test\acltest\removeacl";

//セキュリティオブジェクト取得
DirectorySecurity security = Directory.GetAccessControl(folderPath);
//継承状態は解除するが、権限は継承
security.SetAccessRuleProtection(true, true);
//ユーザーに関する権限を削除
FileSystemAccessRule rule = new FileSystemAccessRule(
       new NTAccount(Environment.MachineName + "\\User"),
       FileSystemRights.FullControl,//権限は何でも。
       AccessControlType.Allow);    //アクセス許可
security.RemoveAccessRuleAll(rule);
//アクセス権更新
Directory.SetAccessControl(folderPath, security);
RemoveAccessRuleAllメソッドは特定のユーザーおよび種類(許可、拒否)の権限をすべて削除する。引数としては、削除する対象のユーザーと種類が指定されたFileSystemAccessRuleクラスを指定する。FileSystemAccessRuleクラスの権限(FileSystemRights)は、ここでは何が指定されていても関係ない。
プログラムのテスト
プログラムを実行する前のアクセス権は以下。



プログラムを実行した結果は以下。「User」に関するアクセス許可が削除されている。また、権限がすべて「<継承なし>」になっている。

SetAccessRuleProtectionの引数を変えてみる
SetAccessRuleProtectionの第一引数をfalseにすると、継承された権限が優先されてしまうので、権限に関するプログラムの操作が適用されない。
string folderPath = @"D:\Shared\test\acltest\removeacl";
//セキュリティオブジェクト取得
DirectorySecurity security = Directory.GetAccessControl(folderPath);
//継承状態を保持
security.SetAccessRuleProtection(false, false);
//ユーザーに関する権限を削除
security.PurgeAccessRules(new NTAccount(Environment.MachineName + "\\User"));
//アクセス権更新
Directory.SetAccessControl(folderPath, security);
実行結果は以下の通り。



SetAccessRuleProtectionの第一引数をtrue、第二引数をfalseにしたとき、権限はすべてクリアされる。
string folderPath = @"D:\Shared\test\acltest\removeacl";
//セキュリティオブジェクト取得
DirectorySecurity security = Directory.GetAccessControl(folderPath);
//継承状態を解除して、権限をクリア
security.SetAccessRuleProtection(true, false);
Directory.SetAccessControl(folderPath, security);
実行結果は以下の通り。

既知の問題
アクセス権を削除するためには、実行ユーザーに、そのファイルまたはフォルダーの「アクセス許可の変更」権限がないといけない。

既定の組み合わせでは、フルコントロールがないとアクセス権の変更ができない。(変更、書き込みには「アクセス許可の変更」権限がないことに注意。)

権限が不足する場合、SetAccessControlメソッド実行時に例外UnauthorizedAccessException(現在のプロセスには、ファイルを開くために必要なアクセス権がありません。)が発生する。
戻る
インデックスページに戻る
Copyright (c) 2010 BOSS. All rights reserved.