Powershell 仅从 Get-ADUser 获取与字符串模式匹配的属性

Powershell get only properties matching string pattern from Get-ADUser

我试图从 AD 用户(HomeDirectory、HomeDrive 等)获取包含字符串“home”的所有属性。我可以根据 :

执行以下操作来完成这项工作
Get-ADUser -Identity MyUser -Properties * | Select-Object -Property "*home*"

但是,如果我在 for 循环中执行此操作,这将使系统陷入困境,因为它会首先获取 所有属性 ,然后过滤掉那些匹配 属性 名称中任意位置的字符串“home”。

有没有办法在 Get-ADUser 调用中执行此过滤以减少发送的信息量?我想更一般的问题是:Powershell 中是否有办法只获取与特定字符串模式匹配的对象的属性?

您可以通过调用 get-aduser -id myuser -properties * | % { $_.propertynames -match "home" } 自己创建此模式 - 这样做一次,您可以将结果存储到一个数组中,然后将其提供给进一步的 get-aduser 调用。

$proplist=get-aduser -id myuser -properties * | % { $_.propertynames -match "home" }
get-aduser -properties $proplist

另一种方法可能是首先从 AD 架构中获取所有 LDAP 属性名称的数组:

function Get-ADUserAttributeNames {
    # First, get all AD user attributes defined in the Active Directory schema
    $searchBase    = (Get-ADRootDSE).SchemaNamingContext
    $schemaAttribs = (Get-ADObject -SearchBase $searchBase -Filter "name -like 'user'" -Properties MayContain,SystemMayContain |
                     Select-Object @{Name = 'Attribs'; Expression = {$_.maycontain + $_.systemmaycontain}}).Attribs

    # Next, get all created user attributes. These are not defined in the schema, but calculated when asked for
    $flagsAttribs = (Get-ADObject -SearchBase $searchBase -LDAPFilter '(systemFlags:1.2.840.113556.1.4.803:=4)' -Properties systemFlags).Name

    return ($schemaAttribs + $flagsAttribs) | Sort-Object
}
$userAttribs = Get-ADUserAttributeNames

在后续调用中,使用返回的 $userAttribs 数组,如下所示:

$homeAttribs = $userAttribs | Where-Object { $_ -like '*home*' }
Get-ADUser -Filter * -Properties $homeAttribs

一些解释

此方法从 AD 架构本身检索 LDAP 用户属性名称列表,因此无需探测已知用户。返回的属性适用于您的 AD 环境中的任何 用户对象。

使用 ,您 需要一个您知道存在的用户,但这当然没问题,因为您可以简单地使用自己的 SamAccountName。

我强调 LDAP 的原因是 Ldap 属性名称并不总是像您希望的那样具有自我描述性,有时只是一个字符,而在其他情况下又长得离谱。 . 这就是为什么 PowerShell 将最常见的属性名称映射到更友好(并且不区分大小写)的名称。

一些示例:

LDAP                        PowerShell
----                        ----------
l                           City
o                           Organization
cn                          Name
physicalDeliveryOfficeName  Office
facsimileTelephoneNumber    Fax
wWWHomePage                 HomePage
nTSecurityDescriptor        CannotChangePassword

PowerShell 在某些情况下还会将属性的格式更改为更易于使用的格式,例如 Enabled 其中 returns 来自计算 LDAP userAccountControl (bit mask not 2)PasswordLastSet 其中 returns 来自 ldap 的 pwdLastSet 属性的 DateTime 对象。

可以使用更多属性扩展 AD 架构。有时软件会这样做(例如 Exchange 用大量 msExch* 属性扩展架构),但您(作为管理员)也可以添加新属性。 因此,您使用上述函数获得的列表是相当的,但不是完全静态的,并且会随着时间而改变。