首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用什么代替SecurityManager.IsGranted?

用什么代替SecurityManager.IsGranted?
EN

Stack Overflow用户
提问于 2018-06-14 15:22:02
回答 1查看 436关注 0票数 2

我还没找到我想问的问题。

我想知道用户是否有权限/权限删除给定的文件或文件夹

我在用这个:

代码语言:javascript
复制
Private Function UserHasPermissionsToSource(ByVal source As String) As Boolean    
    Dim writePermission As FileIOPermission = New FileIOPermission(FileIOPermissionAccess.Write, source)
    Return SecurityManager.IsGranted(writePermission)
End Function

但是由于isGranted过时了,我不太清楚该用什么替换它。这是我目前所拥有的,有人能确认这是否正确吗?

代码语言:javascript
复制
Private Function UserHasPermissionsToSource(ByVal source As String) As Boolean
    'Get the permissions of the file/folder
    Dim writePermission As FileIOPermission = New FileIOPermission(FileIOPermissionAccess.Write, source)

    'Create your permission set and add file permissions for write
    Dim permissionSet As PermissionSet = New PermissionSet(PermissionState.None)
    permissionSet.AddPermission(writePermission)

    'checks permissions????
    If permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet) Then
        Return True
    End If

    Return False
End Function

为了同样的结果,似乎要付出更多的努力。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-20 12:42:28

上面是不对的,我找到了一个解决办法。

代码语言:javascript
复制
Private Function GetFileAccessControl(ByVal source As String) As String

        Dim denied As Boolean = False
        Dim allowed As Boolean = False

        'Gets the current User
        Dim wid As WindowsIdentity = WindowsIdentity.GetCurrent()

        Try
            Dim arc As AuthorizationRuleCollection = GetAuthorizationRuleCollection(source)
            Dim ars As IList(Of FileSystemAccessRule) = New List(Of FileSystemAccessRule)(arc.OfType(Of FileSystemAccessRule))
            Dim widgs As IList(Of IdentityReference) = New List(Of IdentityReference)

            For Each g As SecurityIdentifier In wid.Groups
                If g.IsAccountSid() Then
                    widgs.Add(g)
                End If
            Next

            'User not inherited rules
            For Each rule As FileSystemAccessRule In (From r In ars Where r.IdentityReference.Equals(wid.User) AndAlso Not r.IsInherited)
                denied = denied Or DeniesWriteAccess(rule)
                allowed = allowed Or AllowsWriteAccess(rule)
            Next

            For Each rule As FileSystemAccessRule In (From r In ars Where r.IdentityReference.Equals(wid.User) AndAlso r.IsInherited)
                denied = denied Or DeniesWriteAccess(rule)
                allowed = allowed Or AllowsWriteAccess(rule)
            Next

            For Each rule As FileSystemAccessRule In (From r In ars Where widgs.Contains(r.IdentityReference) AndAlso Not r.IsInherited)
                denied = denied Or DeniesWriteAccess(rule)
                allowed = allowed Or AllowsWriteAccess(rule)
            Next

            For Each rule As FileSystemAccessRule In (From r In ars Where widgs.Contains(r.IdentityReference) AndAlso r.IsInherited)
                denied = denied Or DeniesWriteAccess(rule)
                allowed = allowed Or AllowsWriteAccess(rule)
            Next
        Catch ex As UnauthorizedAccessException

        End Try

        If Not denied AndAlso allowed Then
            Return True
        End If

        Return False
    End Function

    Private Function GetAuthorizationRuleCollection(ByVal source As String) As AuthorizationRuleCollection

        'Gets the current User
        Dim wid As WindowsIdentity = WindowsIdentity.GetCurrent()
        Dim arc As AuthorizationRuleCollection
        arc = Nothing

        If (Directory.Exists(source)) Then
            Dim di As DirectoryInfo = New DirectoryInfo(source)
            Dim acl As DirectorySecurity = di.GetAccessControl()
            arc = acl.GetAccessRules(True, True, GetType(SecurityIdentifier))
        ElseIf File.Exists(source) Then
            Dim fi As FileInfo = New FileInfo(source)
            Dim acl As FileSecurity = fi.GetAccessControl()
            arc = acl.GetAccessRules(True, True, GetType(SecurityIdentifier))
        End If

        Return arc
    End Function

    Private Function AllowsWriteAccess(rule As FileSystemAccessRule) As Boolean
        If rule.AccessControlType = AccessControlType.Allow AndAlso
                (rule.FileSystemRights.HasFlag(FileSystemRights.Write) OrElse
                rule.FileSystemRights.HasFlag(FileSystemRights.WriteData) OrElse
                rule.FileSystemRights.HasFlag(FileSystemRights.CreateDirectories) OrElse
                rule.FileSystemRights.HasFlag(FileSystemRights.CreateFiles)) Then
            Return True
        End If
        Return False
    End Function

    Private Function DeniesWriteAccess(rule As FileSystemAccessRule) As Boolean
        If rule.AccessControlType = AccessControlType.Deny AndAlso
                (rule.FileSystemRights.HasFlag(FileSystemRights.Write) OrElse
                rule.FileSystemRights.HasFlag(FileSystemRights.WriteData) OrElse
                rule.FileSystemRights.HasFlag(FileSystemRights.CreateDirectories) OrElse
                rule.FileSystemRights.HasFlag(FileSystemRights.CreateFiles)) Then
            Return True
        End If
        Return False
    End Function
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50860941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档