Sql server 使用CTE查找孤立文件夹

Sql server 使用CTE查找孤立文件夹,sql-server,common-table-expression,Sql Server,Common Table Expression,我正在尝试创建一个SQL语法,以便在我的数据库中搜索用户无法访问的网络文件夹 让我解释一下: 我的数据库有5个表: 表:文件夹 FUID-INT-唯一ID Path-Varchar-Example:E:\shared 状态-INT-1=良好,0=过时 表:小组 GRUID-INT-Unique-ID Class-varchar-User或Admin组(Admin组是sysadmin组) 名称-HR\U用户示例 状态-INT-1=良好,0=过时 表:用户: URUID-INT-Uniqu

我正在尝试创建一个SQL语法,以便在我的数据库中搜索用户无法访问的网络文件夹

让我解释一下:

我的数据库有5个表:

表:文件夹

  • FUID-INT-唯一ID
  • Path-Varchar-Example:E:\shared
  • 状态-INT-1=良好,0=过时
表:小组

  • GRUID-INT-Unique-ID
  • Class-varchar-User或Admin组(Admin组是sysadmin组)
  • 名称-HR\U用户示例
  • 状态-INT-1=良好,0=过时
表:用户:

  • URUID-INT-Unique-ID
  • 类-varchar-标准用户或管理员用户(管理员用户是系统管理员)
  • Name-Varchar-示例:史密斯,约翰
  • 状态-INT-1=良好,0=过时
表:UG_连接:

  • 唯一ID
  • GRUID-INT-与组的关系
  • URUID-INT-与用户的关系
  • 状态-INT-1=良好,0=过时
表:ACL:

  • UID-INT-唯一ID
  • FUID-INT-与文件夹FUID的关系
  • GRUID-INT-与组GRUID的关系
  • URUID-INT-与用户URUID的关系
  • ACCESS-VARCHAR-访问类型、列表、读取、修改、完全控制
  • 状态-INT-1=良好,0=过时
我必须在ACL表中同时包含用户和组的原因是,有些用户直接在文件夹中分配权限,而不是按组分配权限

无论如何,我想知道的是:

  • 哪些文件夹对标准用户没有任何权限
  • 包括以上内容,我希望能够通过访问权限进行筛选,因此搜索标准用户没有修改权限的文件夹)
  • 还希望使用状态列筛选出过时的组、用户、UG_连接、文件夹和ACL
我不想找到某些用户可以访问的内容。我不在乎,我想要的是标准用户无法访问的文件夹(列表、读取、修改、完全控制)。我不希望在结果中看到用户名或组名,只希望看到路径


从逻辑上讲,我能想到的就是获取管理员有权访问的所有路径(即100%的路径),然后跳过最终用户有权访问的两条路径,只留下只有管理员有权访问的路径。你知道我会怎么做吗?谢谢

请尝试下面的查询。它获取所有文件夹,然后使用该用户的所有标准用户和任何标准组,然后再应用过滤器,仅显示在指定的标准组中没有标准用户或标准用户的文件夹

SELECT DISTINCT
    F.Path
FROM Folders F
    INNER JOIN ACLS A
        ON A.FUID = F.FUID
    LEFT OUTER JOIN (
        SELECT
            U.URUID,
            G.GRUID
        FROM Users U
            LEFT OUTER JOIN UG_JOIN UG
                ON UG.URUID = U.URUID
            LEFT OUTER JOIN Groups G
                ON G.GRUID = UG.GRUID
                    AND G.Class = 'User' -- Whatever class needs to be user group
        WHERE U.Class = 'Standard User' -- Whatever class neeed to be standard group
            -- AND U.STATUS = 1 -- If you only care about active users
    ) UG
    ON (A.URUID = UG.URUID OR A.GRUID = UG.URUID)
WHERE UG.URUID IS NULL

不知道如何结合第一个和第二个要求,所以我在下面使用Or运算符,让我知道我是否误解了u:)


要求1和2是两个独立的查询。很抱歉造成混淆。如果不返回过时的权限/文件夹/用户/组,此查询可能会正常工作。这是一个很好的开始。非常感谢。很高兴它帮助了你。抱歉搞混了。根据您的问题,我假设您正在通过基于表结构的脚本刷新数据库中的权限。是否要求powershell脚本读取实际ACL并遍历文件夹?否我有一个powershell脚本,用于读取每个文件夹的实际ACL并将原始值放入数据库。该脚本还查询所有用户和组成员的active directory。我已经将其设置为每两周自动刷新一次数据。说到这里,我真的只需要一个SQL查询,它可以告诉我文件共享用户无法访问哪些文件夹(读取/列出)(1),另一个查询可以查看哪些文件夹用户不能修改/写入(2)
DECLARE @Class NVARCHAR(100) = 'STANDARD USER'
DECLARE @Access NVARCHAR(100) = 'Modify'



SELECT F.[PATH]
    FROM Folders F
    INNER JOIN ACLS A
        ON A.FUID = F.FUID
    INNER JOIN Users U
        ON U.URUID = A.URUID
    INNER JOIN Groups G
        ON G.GRUID = A.GRUID
    INNER JOIN UG_JOIN UG
        ON UG.URUID = U.URUID
    INNER JOIN UG_JOIN UG2
        ON UG2.GRUID = G.GRUID      
    WHERE (U.Class != @Class --First requirement : What Folders dont have any permission for standard user
                           -- means i will filter out standuser
     OR (A.Access Not LIKE '%' + @Access + '%' 
        AND U.Class = @Class)-- second requirement: search for folders where standard users dont have modify access
     )
    AND F.Status != 0 --Third reqirement : also want to filter out stale group for all the table
    AND A.Status != 0
    AND U.Status != 0
    AND G.Status != 0
    AND UG.Status != 0
    AND UG2.Status != 0