1. ホーム
  2. c#

アプリケーションで作成したファイルに対して、全ユーザーのフルパーミッションを与えるには?

2023-10-07 15:17:54

質問

私が開発するツールは、そのツールで作成されたファイルにアクセス権 "Full Control" を付与する必要があります。それは、すべての Windows アカウント、さらに将来の可能性のあるアカウントから読み取り、変更、および削除する必要があります。これは実現可能でしょうか?

私は、SPECIFIC_USER に対してこれを試すことができることを知っています。

FileSystemAccessRule rule = new FileSystemAccessRule(SPECIFIC_USER, FileSystemRights.FullControl, AccessControlType.Allow);
FileSecurity fSecurity = File.GetAccessControl(filePath);
fSecurity.SetAccessRule(rule);
File.SetAccessControl(filePath, fSecurity);

しかし、すべてのユーザーにそれを許可するにはどうしたらよいでしょうか?そして、将来の可能性のあるアカウントにも?後者が不可能な場合、最初の要件についてはどうすればよいのでしょうか?

ありがとうございます。

EDITです。

これは、私のために動作したコードです。回答者のリンクから引用しています。

private void GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(
        new SecurityIdentifier(WellKnownSidType.WorldSid, null), 
        FileSystemRights.FullControl,
        InheritanceFlags.ObjectInherit |
           InheritanceFlags.ContainerInherit,
        PropagationFlags.NoPropagateInherit,
        AccessControlType.Allow));

    dInfo.SetAccessControl(dSecurity);
}

この PropagationFlags.NoPropagateInherit が必要であることに注意してください (リンク先の最後の方に書いてあります)。これは、将来のアカウントにも権限を与えるものです。

どのように解決するのですか?

これを使う人への注意

にリテラル文字列を使用する場合 FileSystemAccessRule を使用する場合は、以下のようになります。 WellKnownSidType.WorldSid ではなく "everyone" .

理由は、Windowの言語は複数あり、EveryoneはEN言語のものにのみ適用されるため、スペイン語の場合、"Todos"(または他のもの)となる可能性があるからです。

using System.Security.AccessControl;
using System.Security.Principal;
using System.IO;

private void GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
    dInfo.SetAccessControl(dSecurity);
}