首页 > 解决方案 > 通过 Powershell 将 AD 组添加到大型公共驱动器

问题描述

我们有一个大型文件共享,其中包含大约 1tb 的数据。以下位置下大约有 600 个文件夹。F:\Data
任务是为数据文件夹内的每个文件夹分配特定的 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
}

标签: powershellscriptingwindows-server-2016ntfs

解决方案


您需要尝试继承和传播(使用您的测试环境)并使用带有 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() 指定读​​取权限创建新规则,则该用户或组现在将只有读取权限。

推荐阅读