对于运行 Windows Server 2003 的计算机,是否可以列出给定组对其具有明确权限的所有文件夹/文件?如果可以,怎么做?如果能看到继承的权限就更好了,但我只能使用明确的权限。
简单介绍一下背景:我正在尝试更新测试服务器上的组/权限。其中一个组,Devs
在创建时没有正确实现,我的目标是将其从系统中删除。它已被替换LeadDevelopers
,它对许多(但自然不是全部)相同的文件夹具有权限。我想确保在删除时不会意外使任何文件夹成为孤立文件夹或导致任何其他问题Devs
。它确实有一些管理员级别的权限。
编辑:到目前为止的答案——至少*cacls
——AccessEnum
提供了一种方法来找出哪些组/用户对已知目录/文件具有权限。我实际上想要撤销此行为的原因是:我知道该组,并且正在寻找该组具有权限的目录/文件。此外,正如我在评论中指出的那样,该Devs
组本身不是任何其他组的成员。
答案1
答案2
Sysinternals 的 AccessEnum可能会帮助您完成想要的操作。它将枚举目录上的权限。它不会准确显示权限是显式的还是继承的,但它会向您显示权限与其父级不同的所有目录(和文件)。这可能会为您提供相同的信息。它还可以以相同的方式枚举权限注册表项。
答案3
我发现论坛条目这可能会有帮助。
以下是摘录:
if (($args.Count) -eq 2) {
$dir = $args[0]
if ((Test-Path $dir) -eq $true) {
$script:FoldersFound = New-Object System.Collections.ArrayList
$GroupName = $args[1]
$folders = Get-ChildItem $dir -Recurse | Where-Object {$_.PSIsContainer}
foreach($folder in $folders) {
$ACL = Get-Acl -Path $folder.FullName
foreach($ACE in $ACL.access) {
if (($ACE.IdentityReference) -like "*\$GroupName") {
if (($ACE.IsInherited) -eq $false) {
$FoldersFound.Add($folder.FullName) | Out-Null
break
}
}
}
}
$FoldersFound.Sort()
foreach($folder in $FoldersFound) {
Write-Host $folder
}
}
} else {
Write-Host "Syntax:" $MyInvocation.MyCommand.Name """path""" """Group Name"""
}
将上述代码保存为<filename>.ps1
,并从 PowerShell 提示符运行它,并使用两个参数:“文件夹路径”后跟“组名称”。
示例:导航到保存脚本的文件夹,然后键入以下内容,其中<filename>
(显然)是您为文件指定的名称,并用您自己的路径和组名替换:
.\<filename>.ps1 "C:\Users" "Administrators"
请注意,脚本中没有错误处理,因此它不会处理访问被拒绝的错误或太长的路径名等。
答案4
尝试cacls.exe 或 xcacls.exe 或 icacls.exe甚至设置ACL。这些不仅会列出权限(包括继承),还允许您编辑或替换它们。
cacls/xcalcs 和 icacls 不太适合显示特定用户或组的权限,但 SetACL 似乎具有该功能,而且语法复杂但功能强大。