检查目录是否具有当前用户的权限

时间:2015-11-12 17:50:32

标签: .net vb.net directory acl windows-identity

我试图确定一个目录是否具有以下功能的指定权限:

 @user.update_attributes({:password => params[:password], :password_confirmation => params[:password_confirmation]})

用法示例:

Public Function DirectoryHasRights(ByVal directoryPath As String,
                                   ByVal rights As FileSystemRights,
                                   ByVal accessControlType As AccessControlType) As Boolean

    Dim dInfo As DirectoryInfo = New DirectoryInfo(directoryPath)
    Dim user As WindowsIdentity = WindowsIdentity.GetCurrent
    Dim principle As WindowsPrincipal = DirectCast(Thread.CurrentPrincipal, WindowsPrincipal)
    Dim acl As AuthorizationRuleCollection = 
        dInfo.GetAccessControl.GetAccessRules(True, True, GetType(SecurityIdentifier))

    For Each rule As FileSystemAccessRule In acl

        If user.User.Equals(rule.IdentityReference) Or
           principle.IsInRole(DirectCast(rule.IdentityReference, SecurityIdentifier)) Then

            If rule.AccessControlType.Equals(accessControlType) Then

                If rule.FileSystemRights.HasFlag(rights) Then
                    Return True
                End If

            End If

        End If

    Next

    Return False

End Function

我遇到的问题是,我尝试检查每个用户权限的Dim hasRights As Boolean = DirectoryHasRights("C:\Test Folder\", FileSystemRights.Read Or FileSystemRights.Write, AccessControlType.Allow) 规则和AccessControlType.Allow规则。我的意思是,例如我设置一个目录来拒绝我 FullControl ,我确保我无法访问该文件夹,但迭代规则的For循环得到一个规则,其中 FullControl 是允许的,还有另一条规则,其中 FullControl 对我当前的用户都被拒绝,这怎么可能?

我如何解决这个问题?。

更新

所以我将@Olivier Jacot-Descombes readelf(1) 翻译成了Vb.Net,并对其进行了调整以检查AccessControlType.DenyAccessControlType.Allow,但是下面的函数没有按预期工作。

如果我拒绝读取用户权限到文件夹,那么我使用多个标记调用下面的函数,我总是得到 True

AccessControlType.Deny

它应该返回False,因为我无法从该文件夹中读取。似乎该函数没有比较多个标志。

我如何解决它?。

源代码

DirectoryHasRights("C:\Test Folder\",
                   FileSystemRights.Read Or FileSystemRights.Write,
                   AccessControlType.Allow)

0 个答案:

没有答案