.NET アプリから Windows のフォルダーにアクセス権を設定する方法を紹介します。

ACL の管理

フォルダーのアクセス権管理は Windows でも ACL (Access Control List, アクセス制御リスト) を利用します。

手法自体は従来からある方式なので、特筆すべき点はありませんが、 System.IO 名前空間と System.Security.AccessControl 名前空間を使用します。

機能 メソッド
アクセス制御の取得 Directory.GetAccessControl
アクセス制御の設定 Directory.SetAccessControl

アクセス制御の取得

var sec = Directory.GetAccessControl(path);

path はフォルダーのパス、戻り値は DirectorySecurity 型になります。

ちなみにパスは \\hogehoge\shared のようにネットワークパスを指定すれば共有フォルダー内のフォルダーの権限設定も可能です。 (接続しているユーザーに管理権限がある場合のみ)

アクセス制御の追加

GetAccessControl で取得した DirectorySecurity に新しい FileSystemAccessRule のインスタンスを追加して、 SetAccessControl に渡してやります。

下記のコードで MSEN\yamada ユーザーに対して「変更」権限 を与えることができます。

sec.AddAccessRule(new FileSystemAccessRule(
    "MSEN\yamada",
    FileSystemRights.Modify,
    InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
    PropagationFlags.None,
    AccessControlType.Allow));
Directory.SetAccessControl(path, sec);

account はアクセス権を与えるユーザー名です。手元の環境では認識できるドメインであれば、ドメインユーザーなら "MSEN\yamada" のような文字列、ローカルユーザーなら単に "yamada" のような文字列を渡せば、変換してくれるようです。

FileSystemRights.Modify は「変更」権限を表します。他にも引数に設定する列挙体がありますが、このへんは各列挙体のヘルプを参照してください。

FileSystemRights Enum (System.Security.AccessControl) | Microsoft Docs
InheritanceFlags Enum (System.Security.AccessControl) | Microsoft Docs
PropagationFlags Enum (System.Security.AccessControl) | Microsoft Docs
AccessControlType Enum (System.Security.AccessControl) | Microsoft Docs

設定用ユーティリティメソッド

簡単な内容ではありますが、引数が意外と多いので、メソッドにまとめてしまうと見やすくなります。

/// <summary>
/// 指定したディレクトリの ACL に新規ルールを追加します。
/// </summary>
/// <param name="path">ディレクトリパス</param>
/// <param name="account">ユーザーアカウント名</param>
/// <param name="rights">アクセス権</param>
/// <param name="controlType">許可または拒否</param>
public static void AddAccessRule(string path, string account, FileSystemRights rights, AccessControlType controlType)
{
    var sec = Directory.GetAccessControl(path);
    sec.AddAccessRule(new FileSystemAccessRule(
        account,
        rights,
        InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
        PropagationFlags.None,
        AccessControlType.Allow));
    Directory.SetAccessControl(path, sec);
}

これで下記のように設定できるようになります。

AddAccessRule(path, "MSEN\yamada", FileSystemRights.Modify, AccessControlType.Allow);

めでたしめでたし

おすすめの記事