2015-02-06 74 views
0

我正在尝试创建一个SQL语法来搜索我的数据库以查找用户无法访问的网络上的文件夹。使用CTE查找孤立文件夹

让我解释一下:

我的数据库有5个表:

表:文件夹

  • FUID - INT - 独特的ID
  • 路径 - 的Varchar - 例如:E:\共享
  • STATUS - INT - 1 =良好,0 =陈旧

表:团体

  • GRUID - INT - 唯一ID
  • 类 - VARCHAR - 用户或管理组(admin组是一个sysadmin组)
  • 名称 - 实施例HR_Users
  • STATUS - INT - 1 =良好,0 =陈旧

表:用户:

  • URUID - INT - 唯一ID
  • 类 - VARCHAR - 标准用户或管理员用户(管理员用户是一个系统管理员)
  • 名称 - 的Varchar - 实施例:史密斯,约翰
  • STATUS - INT - 1 =良好, 0 =陈旧

表:UG_JOIN:

  • UID:唯一ID
  • GRUID - INT - 到群组
  • 关系
  • URUID - INT - 到用户关系
  • STATUS - INT - 1 =良好,0 =陈旧

表:ACLS:

  • UID - INT - 唯一ID
  • FUID - INT - 与文件夹的关系FUID
  • GRUID - INT - 与组GRUID的关系
  • URUID - INT - 与用户的关系URUID
  • ACCESS - VARCHAR - 访问类型,列表,读取,修改,完全控制
  • 状态 - INT - 1 =良好,0 =陈旧

我之所以有两个用户和组在ACL表中是因为有些用户直接在文件夹中分配权限,而不是按组进行分配。

无论如何,我试图找出是:

  • 什么文件夹没有标准用户
  • 包括上述的任何权限,我希望能够通过ACCESS过滤掉,所以搜索标准用户不具有修改权限的文件夹)。
  • 也想筛选出陈旧组,用户UG_Join,文件夹和ACL使用状态栏

我不会试图查找某些用户访问。我不关心这一点,我想要的是标准用户无法访问(列表,读取,修改,完全控制)文件夹。我不希望在我的结果中看到用户名或组名,只是路径。

从逻辑上讲,我能想到的是获取管理员访问的所有路径(这是路径的100%),然后跳过最终用户可以访问的路径,只留下只有管理员才能访问的路径。有关我将如何去做这件事的任何想法?谢谢!

回答

0

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

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 
+0

该查询可能只是工作,如果它没有返回陈旧的权限/文件夹/用户/组。不过这是一个很好的开始。谢谢! – 2015-02-18 13:21:32

+0

很高兴帮助你。抱歉混淆。我从你的问题中假设你正在通过基于表结构的脚本刷新数据库中的权限。你是否要求一个PowerShell脚本来读取实际的ACL和遍历文件夹? – 2015-02-18 20:13:12

+0

不,我有一个powershell脚本,它读取每个文件夹的实际ACL并将原始值放入数据库。该脚本还查询所有用户和组成员的活动目录。我已经设置了每两周自动刷新一次数据。这就是说,我真的只想要一个SQL查询,可以告诉我我们的文件共享用户无法访问哪些文件夹(读/列表)(1),另一个查询来查看用户无法修改哪些文件夹/写入(2) – 2015-02-18 20:24:37

0

不知道如何第一和第二个要求运营商以低于结合,所以我用或者,让我知道,如果我误解ü:)

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 
+0

要求1和2是两个独立的查询。我很抱歉混淆。 – 2015-02-18 13:20:08