出于审核目的,我们希望查询Active Directory以确定是否通过or、组或用户分配了较高风险的委派访问权限。
我们开发了一个Powershell脚本,它确实可以做到这一点,但是,我们遇到了性能问题,我们希望优化该脚本。
$objectList = (Get-ADObject -Filter 'ObjectClass -eq "organizationalUnit" -or ObjectClass -eq "group" -or ObjectClass -eq "user"')
ForEach($object in $objectList){
$delegated_rights += (Get-Acl -Path "AD:\$object" |
Select-Object -ExpandProperty Access).Where({($_.objectType.ToString() -eq '00000000-0000-0000-0000-000000000000' <# All #>`
-or $_.objectType.ToString() -eq 'bf967aba-0de6-11d0-a285-00aa003049e2' <# User #>`
-or $_.objectType.ToString() -eq '00299570-246d-11d0-a768-00aa006e0529' <# User-Force-Change-Password #>`
-or $_.objectType.ToString() -eq 'bf967a9c-0de6-11d0-a285-00aa003049e2' <# Group #>`
-or $_.objectType.ToString() -eq 'f30e3bbe-9ff0-11d1-b603-0000f80367c1' <# GP-Link #>`
-or $_.objectType.ToString() -eq 'f30e3bbf-9ff0-11d1-b603-0000f80367c1' <# GP-Options #>`
-or ($_.objectType.ToString() -eq 'bf9679c0-0de6-11d0-a285-00aa003049e2'-and $_.inheritedObjectType -eq 'bf967a9c-0de6-11d0-a285-00aa003049e2') <# Member in combination with Group #> )}) |
Select-Object @{name='Type';expression={'Object'}}, `
@{name='DistinguishedName';expression={$object}}, `
@{name='objectTypeName';expression={$schemaIDGUID.Item($_.objectType)}}, `
@{name='inheritedObjectTypeName';expression={$schemaIDGUID.Item($_.inheritedObjectType)}}, `
*
}在较大的活动目录上,上面的代码执行时间太长。我们如何改进逻辑以使其更有效?
发布于 2019-08-30 03:55:33
如果这完全按照您的需要工作,但速度很慢,您可能需要考虑尝试powershell工作流,这将允许并行foreach。这也可能是一个最好的微优化,但尝试将所有这些字符串放入一个数组中并对$_.objectType.ToString()使用-contains可能会节省一些时间。
https://stackoverflow.com/questions/57716787
复制相似问题