|
ユーザーのファイルアクセス権を削除する |
|
今回使用する名前空間は、前回と同じく以下の通りである。
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(現在のプロセスには、ファイルを開くために必要なアクセス権がありません。)が発生する。
|