2015-02-06 73 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