1. ホーム
  2. c#

[解決済み] .NETでディレクトリやファイルの書き込み権限をチェックする

2023-05-02 11:32:12

質問

私の .NET 2.0 アプリケーションでは、ディレクトリにファイルを作成し、書き込むのに十分なパーミッションが存在するかどうかを確認する必要があります。この目的のために、私はファイルを作成し、それに 1 バイトを書き込もうとする次の関数を持っており、権限が存在することをテストするために後で自分自身を削除します。

私は、チェックする最良の方法は、実際にそれを試して、発生するすべての例外をキャッチすることであると考えました。しかし、私は一般的な例外のキャッチについて特に満足していませんので、これを行うより良い、またはおそらくより受け入れられた方法はありますか?

private const string TEMP_FILE = "\\tempFile.tmp";

/// <summary>
/// Checks the ability to create and write to a file in the supplied directory.
/// </summary>
/// <param name="directory">String representing the directory path to check.</param>
/// <returns>True if successful; otherwise false.</returns>
private static bool CheckDirectoryAccess(string directory)
{
    bool success = false;
    string fullPath = directory + TEMP_FILE;

    if (Directory.Exists(directory))
    {
        try
        {
            using (FileStream fs = new FileStream(fullPath, FileMode.CreateNew, 
                                                            FileAccess.Write))
            {
                fs.WriteByte(0xff);
            }

            if (File.Exists(fullPath))
            {
                File.Delete(fullPath);
                success = true;
            }
        }
        catch (Exception)
        {
            success = false;
        }
    }

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

回答は リチャード ジェイソン は、ある意味正しい方向です。しかし、あなたがすべきことは 有効なパーミッションの計算 を計算することです。上記のどの例も、例えばグループ メンバーシップを正しく考慮していません。

確か キース・ブラウン には、これを行うコードがあったはずです。 wiki バージョン (この時点ではオフライン) の Windows セキュリティのための .NET 開発者ガイド . また、このことは、彼の プログラミング Windows セキュリティ の本でも、それなりに詳しく説明されています。

効果的なパーミッションを計算することは、気の弱い人のためではなく、ファイルを作成し、投げられたセキュリティ例外をキャッチしようとするあなたのコードは、おそらく最も抵抗の少ない道でしょう。