用于确定用户是否具有对不起作用的文件夹的写访问权的逻辑

时间:2015-06-08 14:40:19

标签: c# acl

我在我的应用程序的对话框中有以下方法,用于确定用户是否具有对文件夹的写入权限:

private bool UserCanWriteToFolder( FileSystemNode node ) {
    try {
        WindowsIdentity currentUser = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal( currentUser );

        DirectoryInfo directoryInfo = new DirectoryInfo( node.FullPath );
        DirectorySecurity acl = directoryInfo.GetAccessControl( AccessControlSections.All );

        AuthorizationRuleCollection rules = acl.GetAccessRules( true, true, typeof( NTAccount ) );

        foreach ( AuthorizationRule rule in rules ) {
            FileSystemAccessRule fsAccessRule = rule as FileSystemAccessRule;
            if ( fsAccessRule == null )
                continue;

            if ( ( fsAccessRule.FileSystemRights & FileSystemRights.WriteData ) > 0 ) {
                NTAccount ntAccount = rule.IdentityReference as NTAccount;
                if ( ntAccount == null )
                    continue;

                if ( principal.IsInRole( ntAccount.Value ) )
                    return true;
            }
        }
    } catch ( Exception ) {
        return false;
    }
    return false;
}

这种逻辑有效,但存在问题。

我的用户位于Administrators组中。当我选择C:\ Windows文件夹时,此方法返回true,但是,当我的程序尝试写入C:\ Windows文件夹时,程序将抛出UnauthorizedAccessException。显然,我的代码没有考虑到该文件夹​​的不同之处。

这是我机器上C:\ Windows文件夹的iacls输出:

C:\Windows NT SERVICE\TrustedInstaller:(F)
           NT SERVICE\TrustedInstaller:(CI)(IO)(F)
           NT AUTHORITY\SYSTEM:(M)
           NT AUTHORITY\SYSTEM:(OI)(CI)(IO)(F)
           BUILTIN\Administrators:(M)
           BUILTIN\Administrators:(OI)(CI)(IO)(F)
           BUILTIN\Users:(RX)
           BUILTIN\Users:(OI)(CI)(IO)(GR,GE)
           CREATOR OWNER:(OI)(CI)(IO)(F)
           APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(RX)
           APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(OI)(CI)(IO)(GR,GE)

Successfully processed 1 files; Failed processing 0 files

不幸的是,我不知道ACL中的哪一行是导致引发UnauthorizedAccessException的行。有人可以向我指出问题吗?

1 个答案:

答案 0 :(得分:0)

我决定放弃上面的代码。当我以普通用户身份启动程序时,检索ACL的行会抛出PrivilegeNotHeldException。具体来说,消息文本为

  

该流程不具备“SeSecurityPrivilege”'此操作所需的权限。

此时,我要做的是尝试在所选文件夹中创建一个临时文件。如果成功,我将删除它并返回true。如果失败(抛出异常),我将返回false。在任何情况下,我都必须捕获实际写入文件夹时出现的任何异常,并显示有用的错误消息,因为正如评论中所述,安全性可能会在此方法退出和执行写入之间发生变化。 / p>