0

我有这个:

Get-ADUser myuser |
Select @{n='OU';e={$_.DistinguishedName -replace '^.*?,(?=[A-Z]{2}=)'}}

但我只需要获取特定用户的部分 OU,我必须在开始时将其定义为变量。

我明白了

OU=Users,OU=Munich,DC=xyzdom,DC=xyz

我想检测用户是否在慕尼黑 OU 或任何地方。所以输出应该只是$city输入$username

我不知道该怎么做。但我怀疑实现这个目标应该没有那么难。

也许有人有时间和热情向我展示如何:)

非常感谢你的问候

非常感谢您的帮助。(我不能使用 city 属性。)我的解决方案现在看起来像这样:

Import-Module ActiveDirectory
$samaccountname = "Smith"

$ou = Get-ADUser $samaccountname | Select @{n='OU';e={$_.DistinguishedName.split(',')[-3].split("=")[-1]}} | FT -HideTableHeaders

$ou

现在,输出只是:慕尼黑

我想继续使用这个变量,但可能格式错误。当我尝试将它与协调器一起使用时,我得到如下输出:Microsoft.PowerShell.Commands.Internal.Format.FormatStartData Microsoft.PowerShell.Commands.Internal.Format.GroupStartData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft。 PowerShell.Commands.Internal.Format.GroupEndData Microsoft.PowerShell.Commands.Internal.Format.FormatEndData

所以也许它必须被格式化为字符串???我怎样才能做到这一点?

4

1 回答 1

2

我同意 Santiago 的观点,即使用 users AD 属性City会是一个更好的解决方案,但如果您没有在 users 中填写该属性,您可以在下面尝试。

DistinguishedName 可以包含逗号、转义字符,甚至是转换为十六进制表示的特殊字符。看这里那里

因此,简单地在逗号上拆分 DN 可能会返回不需要的结果。

为此,我前段时间编写了一个小辅助函数,您可以使用:

function Parse-DistinghuishedName {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true, Position = 0)]
        [string[]]$DistinghuishedName
    )
    begin {
        function _ReplaceSpecial([string]$value) {
            # replace all special characters formatted as BackSlash-TwoDigitHexCode
            $match = ([regex]'(?i)\\([0-9a-f]{2})').Match($value)
            while ($match.Success) {
                $value = $value -replace "\\$($match.Groups[1].Value)", [char][convert]::ToUInt16($match.Groups[1].Value, 16)
                $match = $match.NextMatch()
            } 
            # finally, replace all backslash escaped characters
            $value -replace '\\(.)', '$1'
        }
    }
    process {
        foreach ($dn in $DistinghuishedName) {
            $hash = [ordered]@{}
            # split the string into separate RDN (RelativeDistinguishedName) components
            $dn -split ',\s*(?<!\\,\s*)' | ForEach-Object {
                $name, $value = ($_ -split '=', 2).Trim()
                if (![string]::IsNullOrWhiteSpace($value)) {
                    $value = _ReplaceSpecial $value

                    switch ($name) {
                        'O'       { $hash['Organization']       = $value }
                        'L'       { $hash['City']               = $value }
                        'S'       { $hash['State']              = $value }
                        'C'       { $hash['Country']            = $value }
                        'ST'      { $hash['StateOrProvince']    = $value }
                        'UID'     { $hash['UserId']             = $value }
                        'STREET'  { $hash['Street']             = $value }
                        # these RDN's can occur multiple times, so add as arrays
                        'CN'      { $hash['Name']               += @($value) } 
                        'OU'      { $hash['OrganizationalUnit'] += @($value) }
                        'DC'      { $hash['DomainComponent']    += @($value) }
                    }
                }
            }
            $hash
        }
    }
}

它将 DN 解析为其 RDN 组件并返回一个 Hashtable。

在你的情况下,像这样使用它:

(Parse-DistinghuishedName 'OU=Users,OU=Munich,DC=xyzdom,DC=xyz').OrganizationalUnit[1]  # --> Munich
于 2021-06-21T14:29:40.373 回答