5

私のアプリケーションでは、フォルダに書き込む権限があるかどうかを確認する必要があります。私は次の方法を使用します:

public bool IsAvailable(string path)
        {
            bool hasPermissions = false;

            if (Directory.Exists(path))
            {
                var permission = new FileIOPermission(FileIOPermissionAccess.Write, path);
                try
                {
                    permission.Demand();
                    hasPermissions = true;
                }
                catch(SecurityException e)
                {
                    hasPermissions = false;
                }
            }

            return hasPermissions;
        }

誰もアクセスできないことが確実にわかっているフォルダへのパスを指定すると(フォルダのプロパティの[セキュリティ]タブですべてのユーザーのすべてのアクセス許可を削除しました)、例外はスローされません。tryブロックに沿って続行します。

このチェックをより適切に行う理由または方法はありますか?

他の質問で見つけたAppDomain.PermissionSetプロパティ関連の回答は成功しませんでした。

前もって感謝します。

4

3 に答える 3

4

私はそれを成し遂げるために次の方法を使用しました:

public static bool HasWritePermissionOnDir(string path)
    {
        var writeAllow = false;
        var writeDeny = false;
        var accessControlList = Directory.GetAccessControl(path);
        if (accessControlList == null)
            return false;
        var accessRules = accessControlList.GetAccessRules(true, true, typeof(System.Security.Principal.SecurityIdentifier));
        if (accessRules == null)
            return false;

        foreach (FileSystemAccessRule rule in accessRules)
        {
            if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write) continue;

            if (rule.AccessControlType == AccessControlType.Allow)
                writeAllow = true;
            else if (rule.AccessControlType == AccessControlType.Deny)
                writeDeny = true;
        }

        return writeAllow && !writeDeny;
    }

それがあなたを助けたかどうか、そしてはいならそれもマークしてください私に知らせてください

于 2013-03-27T10:15:51.180 に答える
2

この方法(アクセス可能かどうかを尋ねてから何かを行う)は、競合状態になりがちです。チェックとそのディレクトリ内のコンテンツへの実際のアクセスの間に、権限が変更される場合があります。

そのディレクトリで何かを読み書きして、潜在的な例外をキャッチすることをお勧めします。

だからしないでください

if(IsAvailable(path)) {
    try {
        doSomething();
    } catch (...) {
    }
}

むしろ

try {
    doSomething();
} catch (...) {
}

グレースホッパーの引用:

「許可を得るよりも、許しを求める方が常に簡単です。」</ p>

于 2013-03-27T10:04:07.100 に答える
0
var permissionSet = new PermissionSet(PermissionState.None);    
var writePermission = new FileIOPermission(FileIOPermissionAccess.Write, filename);
permissionSet.AddPermission(writePermission);

if (permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet))
{}
于 2013-03-27T10:04:26.020 に答える