使用PowerShell有效访问Active Directory对象
我正在尝试获取某些active directory用户对各种active directory对象的有效权限。我可以从UI中看到这些权限- 我正在尝试使用Powershell获取此信息。我已经尝试了使用PowerShell有效访问Active Directory对象,powershell,active-directory,Powershell,Active Directory,我正在尝试获取某些active directory用户对各种active directory对象的有效权限。我可以从UI中看到这些权限- 我正在尝试使用Powershell获取此信息。我已经尝试了dsacl和Get acl,但它们没有提供有效的权限。它们都给出了“谁拥有访问权/权限”,这与“谁拥有什么有效权限”不同。这些也没有列出所有能够提供有效访问上下文的细节 任何关于如何以编程方式实现这一点的建议都将不胜感激 更新- 这里的有效权限意味着根据继承或在不同级别设置的其他规则,实际上允许对象拥有
dsacl
和Get acl
,但它们没有提供有效的权限。它们都给出了“谁拥有访问权/权限”,这与“谁拥有什么有效权限”不同。这些也没有列出所有能够提供有效访问上下文的细节
任何关于如何以编程方式实现这一点的建议都将不胜感激
更新-
这里的有效权限意味着根据继承或在不同级别设置的其他规则,实际上允许对象拥有哪些权限
比如说-
下面示例中的所有属性在Get ACL中都不可见。
Get Acl显示的另一个例子是,在解析ObjectType和InheritedObjectType(使用Santiago Squarzon提到的Get-effective access函数)中的值后,我通过Get Acl获取了其中一个OU上的域管理员权限-
当UI显示有效访问时-
我的最终目标是使用powershell获得上述屏幕截图中的所有权限。这与您要查找的内容非常接近。更多细节。带有
Get ACL
的访问控制列表不像高级安全设置上的有效访问那么容易阅读,我认为没有办法解决这个问题。我确实认为,一旦习惯了它,Get ACL
会在您知道要查找的内容时提供更多详细信息\过滤ACL以获取您要查找的内容
代码
用法
默认情况下,该函数将过滤所有孤立ACL。使用IncludeOrphan
开关包括所有以S-1-*
编辑
作为参考,这是使用获取ACL时完全控制的样子
与内置\Administrators相比,后者对此OU具有写入权限,但不具有完全控制权
您可以尝试模块,我想本模块的详细信息将在功能获取有效访问
中介绍。这将有助于您获取信息。该模块已从中删除。我不确定您如何能够从Github安装该模块,我无法尝试,因为我正在使用Mac。获取Acl
应该会向您提供该信息。使用分组运算符(..)公开该代码属性<代码>(获取ACL.\).Access
。您能澄清一下“有效权限”是什么意思吗?您显示的ACL中的所有对象(完全控制)
表示完全控制ActiveDirectoryRights
,它与高级安全设置上的有效访问不同。将IdentityReference
的结果与显示的结果进行比较,您将看到差异。此外,您没有显示是否有其他ACL拒绝对该标识引用的完全控制。正如我在回答中所说,您需要知道如何读取Get ACL
的输出。这是域控制器的唯一条目。它没有任何否认规则。我没有包括身份参考,因为我想避免审查图像。两个屏幕截图都显示了相同身份引用的结果。仅供参考,我编辑了我的答案,向您展示了与WriteDACL相比完全控制的效果。感谢您提供信息和代码。这非常有用。根据我的初始测试,通过解析ObjectType和InheritedObjectType中的值,这提供了比解析更多的信息。它仍然无法获得您可以在有效访问中看到的权限。此外,对于get acl,此函数使用的权限(如Write ObjectSid、Read ObjectSid等)不可见。(将更新问题)另外,像Write属性这样的属性不能准确地告诉我哪些属性是用户授予的访问权限,而哪些属性被拒绝。
Function Get-EffectiveAccess {
[CmdletBinding()]
param(
[Parameter(
Mandatory,
ValueFromPipelineByPropertyName
)]
[ValidatePattern(
'(?:(CN=([^,]*)),)?(?:((?:(?:CN|OU)=[^,]+,?)+),)?((?:DC=[^,]+,?)+)$'
)][string]$DistinguishedName,
[switch]$IncludeOrphan
)
begin
{
# requires -Modules ActiveDirectory
$ErrorActionPreference = 'Stop'
$GUIDMap = @{}
$domain = Get-ADRootDSE
$z = '00000000-0000-0000-0000-000000000000'
$hash = @{
SearchBase = $domain.schemaNamingContext
LDAPFilter = '(schemaIDGUID=*)'
Properties = 'name','schemaIDGUID'
ErrorAction = 'SilentlyContinue'
}
$schemaIDs = Get-ADObject @hash
$hash = @{
SearchBase = "CN=Extended-Rights,$($domain.configurationNamingContext)"
LDAPFilter = '(objectClass=controlAccessRight)'
Properties = 'name','rightsGUID'
ErrorAction = 'SilentlyContinue'
}
$extendedRigths = Get-ADObject @hash
foreach($i in $schemaIDs)
{
if(-not $GUIDMap.ContainsKey([System.GUID]$i.schemaIDGUID))
{
$GUIDMap.add([System.GUID]$i.schemaIDGUID,$i.name)
}
}
foreach($i in $extendedRigths)
{
if(-not $GUIDMap.ContainsKey([System.GUID]$i.rightsGUID))
{
$GUIDMap.add([System.GUID]$i.rightsGUID,$i.name)
}
}
}
process
{
$result = [system.collections.generic.list[pscustomobject]]::new()
$object = Get-ADObject $DistinguishedName
$acls = (Get-ACL "AD:$object").Access
foreach($acl in $acls)
{
$objectType = if($acl.ObjectType -eq $z)
{
'All Objects (Full Control)'
}
else
{
$GUIDMap[$acl.ObjectType]
}
$inheritedObjType = if($acl.InheritedObjectType -eq $z)
{
'Applied to Any Inherited Object'
}
else
{
$GUIDMap[$acl.InheritedObjectType]
}
$result.Add(
[PSCustomObject]@{
Name = $object.Name
IdentityReference = $acl.IdentityReference
AccessControlType = $acl.AccessControlType
ActiveDirectoryRights = $acl.ActiveDirectoryRights
ObjectType = $objectType
InheritedObjectType = $inheritedObjType
InheritanceType = $acl.InheritanceType
IsInherited = $acl.IsInherited
})
}
if(-not $IncludeOrphan.IsPresent)
{
$result | Sort-Object IdentityReference |
Where-Object {$_.IdentityReference -notmatch 'S-1-*'}
return
}
return $result | Sort-Object IdentityReference
}
}
PS \> Get-ADOrganizationalUnit -Filter {Name -eq 'ExampleOU'} | Get-EffectiveAccess | Out-GridView
PS \> Get-EffectiveAccess -DistinguishedName 'OU=ExampleOU,DC=domainName,DC=com' | Out-GridView
PS \> $effectiveAccess = Get-ADGroup exampleGroup | Get-EffectiveAccess -IncludeOrphan
PS \> Get-ADOrganizationalUnit -Filter * | Select -First 10 | Get-EffectiveAccess | Out-GridView