2016-11-16 59 views
0

我知道这个主题已经在这里讨论过了,但是这里和其他网站上的解决方案似乎不适合我。set-acl到AD OU

我想添加到CNO:创建计算机对象的OU上的“CLUSTER”权限。

更多或更少的所有解决方案都基于以下理念:

$ou = 'OU=sql,OU=prod,DC=ssd,DC=xxx,DC=net' 
$cno = 'CLUSTER1' 
$sid = [System.Security.Principal.SecurityIdentifier](Get-ADComputer -Filter "name -eq `"$cno`"").SID 
$acl = get-acl $ou 
$objectGUID = New-Object guid bf967a86-0de6-11d0-a285-00aa003049e2 
$guidNull = New-Object guid 00000000-0000-0000-0000-000000000000 
$ace1 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $sid,"ReadProperty,GenericExecute","Allow",$guidNull,"None",$guidNull 
$acl.AddAccessRule($ace1) 
$ace2 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $sid,"CreateChild","Allow",$ObjectGUID,"None",$guidNull 
$acl.AddAccessRule($ace2) 
set-acl -aclobject $acl $ou 

我收到以下错误:

Set-Acl : This security ID may not be assigned as the owner of this object 
At line:1 char:8 
+ set-acl <<<< -aclobject $acl $ou 
    + CategoryInfo   : NotSpecified: (OU=sql,OU=ssd...=xxx,DC=net:String) [Set-Acl], ADException 
    + FullyQualifiedErrorId : ADProvider:SetSecurityDescriptor:ADError,Microsoft.PowerShell.Commands.SetAclCommand 

任何想法可能是错误的?

回答

0

我在使用Get-Acl/Set-Acl时在文件系统上看到过这个错误。即使您不需要,Get-Acl也会检索整个ACL。你只需要DACL。然后Set-Acl尝试写入因Microsoft而失败的整个ACL。尝试改变获取的ACL呼吁:

$acl = (get-acl $ou).Access 

这应该只给你,你正试图追加到访问规则。

编辑

道歉的错误信息,在文件系统上这个工作,但AD是“特殊”。根本问题是相同的,Get-Acl在尝试设置所有者时将所有内容和Set-Acl扼流圈拉到一起。尝试在域管理员的上下文中以admin身份运行的PowerShell窗口中运行上述命令。这可能会让你强制过去。相反,我会尝试使用ADSI加速器。

$ou = 'OU=sql,OU=prod,DC=ssd,DC=xxx,DC=net' 
$cno = 'CLUSTER1' 
$sid = [System.Security.Principal.SecurityIdentifier](Get-ADComputer -Filter "name -eq `"$cno`"").SID 
$ouObject = [ADSI]("LDAP://$OU") 
$objectGUID = New-Object guid bf967a86-0de6-11d0-a285-00aa003049e2 
$guidNull = New-Object guid 00000000-0000-0000-0000-000000000000 
$ace1 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $sid,"ReadProperty,GenericExecute","Allow",$guidNull,"None",$guidNull 
$ouObject.psbase.ObjectSecurity.AddAccessRule($ace1) 
$ace2 = new-object System.DirectoryServices.ActiveDirectoryAccessRule $sid,"CreateChild","Allow",$ObjectGUID,"None",$guidNull 
$ouObject.psbase.ObjectSecurity.AddAccessRule($ace2) 
$ouObject.psbase.CommitChanges() 

另一种办法是尝试它周围的工作与DSACLS,你需要正是你想,虽然使用的permissions syntax弄清楚。请在运行实时OU之前进行测试。

$ou = 'OU=sql,OU=prod,DC=ssd,DC=xxx,DC=net' 
$cno = 'CLUSTER1' 
$sid = [System.Security.Principal.SecurityIdentifier](Get-ADComputer -Filter "name -eq `"$cno`"").SID 
#should grant the SID Generic Execute, Read Property, Create Children 
dsacls $ou /G $sid:GERPCC 
+0

但在这种情况下,我不能运行$ acl.AddAccessRule($ ACE1) –

+0

另外如何执行最后一行其中$ ACL对象是参数:'设置ACL -aclobject $ ACL $ ou' –

+0

我已经更新ADSI解决方案的答案是我能够测试和确认作品。 – StephenP