Windows

列出使用者的文件夾訪問權限

  • January 2, 2019

我在域中有一個使用者可以訪問多個文件夾中的多個子文件夾。他的權利被定義得非常細緻。現在他將離開公司,但將繼續作為契約資源為一家公司工作。

我需要找到他有權訪問的所有文件夾並撤銷他的權限,然後為他設置一組不同的訪問權限。

是否有任何工具(最好是免費軟體)列出給定使用者的所有 NTFS 權限?我已嘗試使用 Sysinternals 的 AccessEnum,但該列表無法按使用者名過濾,對我來說毫無用處。我也看過 CACLS,但據我所知,它顯示的是按文件排序的權限,而不是按使用者排序的權限。

有任何想法嗎?

這似乎可以解決問題(可能需要注意),使用內置的 Windows icacls 命令查找使用者“someuser”有權訪問的所有文件夾,在 C 驅動器上的此範例中:

icacls c:\*. /findsid someuser /t /c /l

/t 需要告訴它遞歸目錄。即使遇到錯誤,也需要 /c 來告訴它繼續執行。/l 使其與符號連結(如果有)一起工作。(最後一個是 L,這些標誌可以是大寫或小寫。)

DOS的*.老前輩們將其辨識為“查找目錄,而不是文件”的方式。當然,如果您確實想查找文件而不是文件夾,請將其更改為*.*,當然您可以將其指向任何驅動器,或者從任何文件夾執行它並保留驅動器/文件夾路徑並讓它相對於該路徑進行搜尋僅文件夾。

我尋求與 OP 相同的答案,並找到了此條目,但很沮喪地看到僅基於可下載工具的報價。像其他人一樣,我更喜歡使用內置的東西,我在這個 icacls 工具中找到了它。

而且我已經確認它可以在 Windows Server 2012、2008 和 Windows 7 上執行,所以我懷疑它也可以在 Server 2003、Windows 8 等上執行。

結果列表將是逐行指示的文件夾,例如:

找到 SID:c:\somedir\somesubdir。

請注意,如果您以本身沒有權限訪問某些正在遍歷的目錄的使用者身份執行此命令,則會在結果中交錯出現錯誤,例如:

c:\System 卷資訊:訪問被拒絕。

如果您可能正在搜尋整個驅動器,則可能會導致數百個此類錯誤,從而很難在其中找到結果。

有些人可能認為答案是以管理員身份執行命令行,但這只會導致出現更多此類錯誤,因為您現在將遍歷以前隱藏的文件夾。

現在,如果您對隱藏這些錯誤感興趣,您將無法使用 find 命令僅通過管道傳輸確實成功的結果(那些確實引用“找到 SID”的結果),因為不會過濾掉錯誤通過管道到 find 命令。相反,如果要刪除所有錯誤,則需要使用相當晦澀的技巧,即使用2>nul:. 所以上面的例子會變成:

icacls c:\*. /findsid someuser /t /c /l 2>nul:

請注意,某些產生此類錯誤的文件夾(這些錯誤現在已隱藏)很可能是名為“someuser”的文件夾可以訪問但您不能訪問。因此,您可能需要三思而後行,忽略這些錯誤。但是,如果您願意,那就是您可以做到的。

我意識到,這種可能性確實可能會限制這個答案的價值。如果有更熟悉事物的人想擴展或更正我的答案,我會歡迎它。

您可以使用 PowerShell 而無需下載任何其他內容。這將適用於 v2.0 及更高版本:

$ReferenceAccountName = 'DOMAIN\Username'
[string[]]$SearchDirectories = @('X:\SomeDirectory', 'F:\AnotherDirectory')

foreach ($RootDir in $SearchDirectories) {
   $DirACL = Get-Acl -Path $RootDir
   foreach ($ACL in $DirACL.Access){
       if ($ACL.IdentityReference -like $ReferenceAccountName){
           Write-Output $RootDir
       }
   }
   foreach ($Directory in (Get-ChildItem -Path $RootDir -Recurse | `
                           Where-Object -FilterScript {$_.Attributes `
                           -contains 'Directory'})){
       $DirACL = Get-Acl -Path $Directory.FullName
       foreach ($ACL in $DirACL.Access){
           if ($ACL.IdentityReference -like $ReferenceAccountName){
               Write-Output $Directory.FullName
           }
       }
   }
}

它不像 PowerShell v3 及更高版本中可用的那樣乾淨,但它會工作。這將以字元串格式輸出找到的目錄列表。

您可以輕鬆地將它們作為對象輸出並繼續使用它們(將它們導出到 CSV 文件,在找到它們時刪除條目,使用資訊更新票證……等等)輸出呼叫。

引用自:https://serverfault.com/questions/171320