通过 Powershell 将 AD 组添加到大型公共驱动器

问题描述

我们有一个大型文件共享,其中包含大约 1 TB 的数据。 以下位置下面有大约 600 个文件夹。 F:\数据
任务是为数据文件夹内的每个文件夹分配一个特定的 AD 组读取权限,子文件夹无关紧要。

我想看看下面的脚本是否是最好的方法? 我担心这是一个文件服务器,我不想破坏任何东西 或弄乱任何权限,也不确定脚本运行时是否 是一个文件打开会导致错误

我曾尝试在测试环境中运行此脚本,效果很好,但没有错误日志,即使它在某个地方停止,我也可以检查。

我可能想多了,但只是想看看是否有人经历过这样的事情?

$startingPath = "PATH"
$Right = "Read"
$Principal = "Domain\ADGroup"

$Rule = New-Object System.Security.AccessControl.FileSystemAccessRule($Principal,$Right,"Allow")

foreach ($Folder in $(Get-ChildItem -Directory $startingPath -Recurse)) {
$Acl=Get-Acl $Folder.FullName
$Acl.SetAccessRule($Rule)
Set-Acl $folder.Fullname $Acl
}

解决方法

您需要试验继承和传播(为此使用您的测试环境)并使用带有 5 个参数的重载方法为此创建新的访问规则。

这样,您只需将新规则添加到主数据共享文件夹中,而不必迭代所有子文件夹。

# FileSystemRights:  https://docs.microsoft.com/en-us/dotnet/api/system.security.accesscontrol.filesystemrights
# Inheritance flags: https://docs.microsoft.com/en-us/dotnet/api/system.security.accesscontrol.inheritanceflags
# Propagation flags: https://docs.microsoft.com/en-us/dotnet/api/system.security.accesscontrol.propagationflags

$Principal  = "TheADGroupWithReadPermissions"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($Principal,"Read","ContainerInherit,ObjectInherit","None","Allow")
$acl = Get-Acl "F:\Data"
$acl.SetAccessRule($accessRule)
Set-Acl -Path "F:\Data" -ACLObject $acl

AddAccessRule()SetAccessRule() 的区别:

添加访问规则 设置访问规则
此方法会将此访问规则添加到 ACL。如果用户或组具有修改权限,并且我们使用 AddAccessRule() 创建具有读取权限的新规则,则该用户或组将还具有修改权限。 此方法删除任何现有访问权限并用指定规则替换该访问权限。如果用户或组具有修改权限,并且使用 SetAccessRule() 创建了指定读取权限的新规则,则该用户或组现在将仅具有读取权限。