【问题标题】:powershell create folder and AD permission from arraypowershell从数组创建文件夹和AD权限
【发布时间】:2013-07-08 15:06:09
【问题描述】:

我有一个包含大量安全组的 Active Directory OU(包含学生和教师用户名的课程部分) 我想通过powershell编写脚本,该脚本创建使用安全组名称命名的文件夹,然后将每个安全组的修改权限分配给相应的文件夹。 这是我的脚本

#get all security groups
$sec_groups = Get-ADObject -SearchBase "ou=class,ou=Groups,ou=Colleague,dc=school,dc=edu" -LDAPFilter "(name=13_su*)" -ResultSetSize 10 | FT Name -HideTableHeaders 

ForEach ($sec_group in $sec_groups)
{
#create folder for each security group
$newPath = Join-Path -Path "\\server\classes" -childpath $sec_group
New-Item $newPath -type directory

#set permission for each folder
$acl = Get-Acl $newpath
$acl.SetAccessRuleProtection($True, $False)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("labadmins","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$sec_group","Modify", "ContainerInherit, ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule)

Set-Acl $newPath $acl
}

为每个安全组创建文件夹成功,但设置$sec_group权限失败。

我做错了什么?

【问题讨论】:

    标签: powershell security permissions


    【解决方案1】:

    按照您的编写方式,$sec_groups 是一组格式化的表格条目。添加规则时,您正在尝试对表条目对象进行字符串插值并将其用作组的名称。要使 $sec_groups 成为组名称的数组,请将第二行中的 FT Name -HideTableHeaders 更改为 Select-Object -ExpandProperty Name:

    $sec_groups = Get-ADObject -SearchBase "ou=class,ou=Groups,ou=Colleague,dc=school,dc=edu" -LDAPFilter "(name=13_su*)" -ResultSetSize 10 | Select-Object -ExpandProperty Name
    

    但是,由于您正在执行创建文件夹的操作(这意味着 $sec_group 在用作 -Childpath),您也许可以在设置规则时摆脱 $sec_group 周围的引号:

    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule($sec_group,"Modify", "ContainerInherit, ObjectInherit", "None", "Allow")
    

    不过,第一个习惯更好。

    事实上,无论哪种情况,您都不需要引用 $sec_group。单独对字符串变量进行字符串插值是多余的。

    【讨论】:

    • 如果有效,请点击左侧的复选标记接受答案。我有超过 99% 的把握会。您修改权限的语法是正确的,我看到的唯一问题是“$sec_group”不会评估组的名称。
    • 我收到此错误 AddAccessRule:使用“1”参数调用“AddAccessRule”的异常:“无法翻译部分或全部身份引用。” + $acl.AddAccessRule
    • 哦,对了 - 域名不见了。将 New-Object 调用中的 $sec_group 替换为 "school.edu\$sec_group"。如果 labadmins 也是域组,则在第一个 New-Object 调用中应该是 "school.com\labadmins"。 (当然,您也可以使用域的 NetBIOS 名称。)
    • Adi,我试过了,在任何一种情况下,“实验室管理员”都可以正常工作,但其他组则不行。我注意到“Pre-2000”名称有一个以 $ 开头的字符串,而“labadmins”在 pre2000 名称中也有“labadmins”。这有什么影响吗?
    猜你喜欢
    • 2011-08-18
    • 2023-04-06
    • 2023-03-28
    • 1970-01-01
    • 2016-11-02
    • 2018-01-17
    • 2021-02-15
    • 2021-07-17
    • 2020-06-16
    相关资源
    最近更新 更多