列出所有文件夹,其中用户(管理员除外)允许完全访问
List all folders, where users (except admin) have allow full access
几年前,我们公司的文件服务器曾经拥有松散的权限。
意思是,有些文件夹用户往往拥有完全权限。这是一件坏事(用户玩弄权限,锁定系统(及其备份)并且只给自己访问权限。
我的目标:
逐个文件夹扫描文件服务器文件夹(文件太多)并输出
- 文件夹完整路径
- 安全身份参考
如果除了域管理员或系统之外还有人拥有完全访问权限。
输出结果如下:
Path, ACL
E:\share\projectfolder, DomainJohnDoe
E:\share\commonfolder, Domain\Everyone
...
这就是我所拥有的,但还远远不够:
##define variable
$path = "E:\Share"
## begin script
foreach ($file in Get-Childitem $path -Recurse -Directory) {
if (Get-Acl $file.FullName |
select -ExpandProperty Access |
where {$_.IdentityReference -notlike "AT\Domain Admins" -and
$_.IdentityReference -notlike "NT AUTHORITY\SYSTEM" -and
$_.AccessControlType -like "Allow" -and
$_.FileSystemRights -like "FullControl"}
) {
Write-Host $file.FullName >> e:\check_acl.txt
Get-Acl $file.FullName |
select -ExpandProperty Access |
where {$_.IdentityReference -notlike "AT\Domain Admins" -and
$_.IdentityReference -notlike "NT AUTHORITY\SYSTEM" -and
$_.AccessControlType -like "Allow" -and
$_.FileSystemRights -like "FullControl"
} >> e:\check_acl.txt
}
}
但我想,我无法像那样获得输出(进入文件!)。
Write-Host
仅向控制台显示文本,无法保存。 Get-Acl >> check_acl.txt
将写入整个 "object" 而不仅仅是身份引用。您想要的是创建一个带有路径和 ACL (identityreference)-属性 的自定义对象并将其导出到 csv.
我还简化了您的身份排除并将 if 测试更改为 foreach 循环,因此您不必 运行 整个 Get-ACL
行两次。
试试这个:
##define variable
$path = "E:\Share"
$ExcludeUsers = 'AT\Domain Admins','NT AUTHORITY\SYSTEM','AT\AT-IT','ATSTREW','ATBRUND','ATKNAFP','ATBECKC'
## begin script
#Create regex-pattern to match all excluded users
$ExcludeUsersRegex = ($ExcludeUsers | % { [regex]::Escape($_) }) -join '|'
Get-Childitem $path -Recurse -Directory | ForEach-Object {
$file = $_
Get-Acl -Path $file.FullName |
Select-Object -ExpandProperty Access |
Where-Object {$_.IdentityReference -notmatch $ExcludeUsersRegex -and $_.AccessControlType -eq "Allow" -and $_.FileSystemRights -eq "FullControl"} |
ForEach-Object {
#Foreach ACL
New-Object psobject -Property @{
Path = $file.FullName
ACL = $_.IdentityReference
}
}
} | Select-Object -Property Path, ACL | Export-Csv e:\check_acl.csv -NoTypeInformation
示例输出:
"Path","ACL"
"C:\Users\frode\Desktop\TEST\YES","CONTOSO\frode"
"C:\Users\frode\Desktop\TEST\YES","CONTOSO\FrodesOtherAccount"
几年前,我们公司的文件服务器曾经拥有松散的权限。 意思是,有些文件夹用户往往拥有完全权限。这是一件坏事(用户玩弄权限,锁定系统(及其备份)并且只给自己访问权限。
我的目标:
逐个文件夹扫描文件服务器文件夹(文件太多)并输出
- 文件夹完整路径
- 安全身份参考
如果除了域管理员或系统之外还有人拥有完全访问权限。
输出结果如下:
Path, ACL E:\share\projectfolder, DomainJohnDoe E:\share\commonfolder, Domain\Everyone ...
这就是我所拥有的,但还远远不够:
##define variable
$path = "E:\Share"
## begin script
foreach ($file in Get-Childitem $path -Recurse -Directory) {
if (Get-Acl $file.FullName |
select -ExpandProperty Access |
where {$_.IdentityReference -notlike "AT\Domain Admins" -and
$_.IdentityReference -notlike "NT AUTHORITY\SYSTEM" -and
$_.AccessControlType -like "Allow" -and
$_.FileSystemRights -like "FullControl"}
) {
Write-Host $file.FullName >> e:\check_acl.txt
Get-Acl $file.FullName |
select -ExpandProperty Access |
where {$_.IdentityReference -notlike "AT\Domain Admins" -and
$_.IdentityReference -notlike "NT AUTHORITY\SYSTEM" -and
$_.AccessControlType -like "Allow" -and
$_.FileSystemRights -like "FullControl"
} >> e:\check_acl.txt
}
}
但我想,我无法像那样获得输出(进入文件!)。
Write-Host
仅向控制台显示文本,无法保存。 Get-Acl >> check_acl.txt
将写入整个 "object" 而不仅仅是身份引用。您想要的是创建一个带有路径和 ACL (identityreference)-属性 的自定义对象并将其导出到 csv.
我还简化了您的身份排除并将 if 测试更改为 foreach 循环,因此您不必 运行 整个 Get-ACL
行两次。
试试这个:
##define variable
$path = "E:\Share"
$ExcludeUsers = 'AT\Domain Admins','NT AUTHORITY\SYSTEM','AT\AT-IT','ATSTREW','ATBRUND','ATKNAFP','ATBECKC'
## begin script
#Create regex-pattern to match all excluded users
$ExcludeUsersRegex = ($ExcludeUsers | % { [regex]::Escape($_) }) -join '|'
Get-Childitem $path -Recurse -Directory | ForEach-Object {
$file = $_
Get-Acl -Path $file.FullName |
Select-Object -ExpandProperty Access |
Where-Object {$_.IdentityReference -notmatch $ExcludeUsersRegex -and $_.AccessControlType -eq "Allow" -and $_.FileSystemRights -eq "FullControl"} |
ForEach-Object {
#Foreach ACL
New-Object psobject -Property @{
Path = $file.FullName
ACL = $_.IdentityReference
}
}
} | Select-Object -Property Path, ACL | Export-Csv e:\check_acl.csv -NoTypeInformation
示例输出:
"Path","ACL"
"C:\Users\frode\Desktop\TEST\YES","CONTOSO\frode"
"C:\Users\frode\Desktop\TEST\YES","CONTOSO\FrodesOtherAccount"