1

そのため、BUILTIN \ Usersグループのアクセス許可を変更して、少なくともファイルシステムの変更アクセス権を持たせようとしています。残念ながら、以下のコードを使用しようとすると、変更されていないACLが生成されます。

            SecurityIdentifier usersSecurityIdentifier = ntAccount.Translate(typeof(SecurityIdentifier)) as SecurityIdentifier;
            DirectorySecurity directorySecurity = Directory.GetAccessControl(source.FullName);
            FileSystemAccessRule accessRule 
                = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, AccessControlType.Allow);

            directorySecurity.ModifyAccessRule(AccessControlModification.Add,
                accessRule,
                out modified);

            Console.WriteLine(modified);

変更されたレポートはすべての場合に当てはまりますが、フォルダーのプロパティでパーマを確認してもパーマは更新されません。

また、同様のコードを使用して、ディレクトリのACLをまだ持っていないSecurityIdentifierのアクセスルールを追加しようとしましたが、変更する代わりにAddAccessRuleだけを追加しました。新しいSecurityIdentifierがディレクトリのpermsリストに表示されましたが、指定したアクセス権がありませんでした。

管理者アカウントが所有しているEnvironment.SpecialFolders.CommonApplicationDataの専用ディレクトリへのアクセスを変更しようとしています。また、管理者としてACLを変更しようとしています。

上記のコードの何が問題になっているのか、またはネイティブの.NETクラスを使用してACLを設定する正しい方法につながるリソースを持っている人はいますか?

4

1 に答える 1

3

私はマイクロソフトで働いている友人の助けを借りてこれを理解しました。実際、ACLを設定するために使用していたプロセスは正確でした。結果を間違って解釈していました。基本的に、変更を加えようとするときに管理者として操作している限り、この方法でディレクトリにACLを設定することに問題はありません。

フォルダの正確なアクセス許可は、次の方法で(Vistaで)表示できました。

  1. 問題のフォルダを右クリックして、プロパティを選択します
  2. [セキュリティ]タブを選択します
  3. [詳細]をクリックします
  4. [編集]をクリックします
  5. アクセス許可を表示するエンティティを選択し、[編集]をクリックします。

これは私が欠けていた部分です。CommonApplicationDataパスには、BUILTIN\Usersエンティティに設定された権限がすでにあります。したがって、コードを実行した後、実際には2つのエンティティになります。1つは読み取りと実行、もう1つは特別なアクセス許可と言います。特別な権限でエンティティを編集すると、実際にはBUILTIN\Usersがディレクトリへのアクセス権を持っていることがわかります。

私は本当にディレクトリとそのすべての子フォルダとオブジェクトにアクセスできるBUILTIN\Usersを探していました。これが私が最終的に使用したものからのコードスニペットです。テストハーネスと、ファイルとディレクトリのACLリストを手動で検査することの両方で、コードが機能することを確認できました。

DirectorySecurity directorySecurity = Directory.GetAccessControl(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
FileSystemAccessRule accessRule
    = new FileSystemAccessRule(@"BUILTIN\Users", FileSystemRights.FullControl, 
        InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, 
        PropagationFlags.None, 
        AccessControlType.Allow);

bool modified=false;
directorySecurity.ModifyAccessRule(AccessControlModification.Add,
    accessRule,
    out modified);

if (modified)
{
    source.Create(directorySecurity);
}
else
{
    source.Create();
}
于 2009-09-18T20:25:54.120 に答える