首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ADUser DistinguishedName获取CN值

从ADUser DistinguishedName获取CN值
EN

Stack Overflow用户
提问于 2021-05-12 11:30:42
回答 4查看 7.1K关注 0票数 3

我有一个PS脚本来检查Active Directory中一些自定义用户的属性。其中一个属性是“经理”。

代码语言:javascript
复制
 $data = Get-ADUser $user -Properties * |  Select-Object DisplayName, LockedOut, Enabled, LastLogonDate, PasswordExpired, EmailAddress, Company, Title, Manager, Office

 Write-Host "9." $user "manager is" $data.manager -ForegroundColor Green

当我运行脚本时,我得到了:

代码语言:javascript
复制
User's manager is CN=cool.boss,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC=com

问题是对于某些用户来说,文本"OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC=com"是不同的。

除了"cool.boss"之外,我如何修改输出并删除所有内容?提前谢谢你

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-05-12 12:03:41

这应该是一种或多或少安全且仍然简单的解析它的方法:

代码语言:javascript
复制
($data.manager -split "," | ConvertFrom-StringData).CN
票数 3
EN

Stack Overflow用户

发布于 2021-05-12 14:55:53

为了用PowerShell-惯用的regex解决方案来补充这里的有用答案:

代码语言:javascript
复制
$dn = 'CN=cool.boss,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC=com'

($dn -split '(?:^|,)CN=|,')[1] # -> 'cool.boss'
代码语言:javascript
复制
$dn = 'CN=cool.boss,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC=com'

$dn -replace '(?:^|,)CN=([^,]+).*', '$1' # -> 'cool.boss'

注意:

  • 上面的解决方案不依赖于输入中名称-值对(RDNs)的特定顺序(也就是说,CN条目不必是第一个),但是如果存在多个CN条目,它们只提取第一个CN条目的值,并且它们确实假定(至少)存在一个。
  • 原则上,以输入字符串为例的DNs (杰出名称)可以将,字符嵌入构成DN的名称-值对的值中,转义为\, (或以十六进制表示为\2C);例如"CN=boss\, cool,OU=Users,..."
  • 一个真正可靠的解决方案必须考虑到这一点,并且理想的情况下也会取消结果的价值;截至本文撰写之时,现有的答案都没有这样做;请参见下面的内容。

(可分辨名称) /AD(可分辨名称)解析

下面的Split-DN 函数

  • 正确地处理转义、嵌入的,字符以及其他转义序列。
  • 取消转义值,这不仅包括删除语法\,还包括转换表单\<hh>中的转义序列,其中hh是两位数的十六进制。表示字符代码点的数字,到它们所表示的实际字符(例如,\3C,被转换为<字符)。
  • 输出一个有序的哈希表,其键是名称组件(例如,CNOU),并将多次出现的名称的值(如OU )表示为数组。

示例调用:

代码语言:javascript
复制
PS> Split-DN 'CN=I \3C3 Huckabees\, I do,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC=com'

Name                           Value
----                           -----
CN                             I <3 Huckabees, I do
OU                             {Users, SO, PL, RET…}
DC                             {domain, com}

注意转义序列\3C如何转换为<、它所代表的字符以及如何将\,识别为嵌入在CN值中的,

由于输入字符串包含多个OUDC名称-值对(所谓的RDNs,相对可分辨的名称),它们相应的哈希表条目变成了值数组(在{ ... }的只显示输出中表示,而,将元素分隔开来)。

Split-DN**'s 函数源代码:**

注意:为了简洁起见,省略了错误处理和验证。

代码语言:javascript
复制
function Split-DN {

  param(
    [Parameter(Mandatory)]
    [string] $DN
  )

  # Initialize the (ordered) output hashtable.
  $oht = [ordered] @{}

  # Split into name-value pairs, while correctly recognizing escaped, embedded
  # commas.
  $nameValuePairs = $DN -split '(?<=(?:^|[^\\])(?:\\\\)*),'

  $nameValuePairs.ForEach({

    # Split into name and value.
    # Note: Names aren't permitted to contain escaped chars.
    $name, $value = ($_ -split '=', 2).Trim()

    # Unescape the value, if necessary.
    if ($value -and $value.Contains('\')) {
      $value = [regex]::Replace($value, '(?i)\\(?:[0-9a-f]){2}|\\.', {
        $char = $args[0].ToString().Substring(1)
        if ($char.Length -eq 1) { # A \<literal-char> sequence.
          $char # Output the character itself, without the preceding "\"
        }
        else { # A \<hh> escape sequence, conver the hex. code point to a char.
          [char] [uint16]::Parse($char, 'AllowHexSpecifier') 
        }
      })
    }
    
    # Add an entry to the output hashtable. If one already exists for the name,
    # convert the existing value to an array, if necessary, and append the new value.
    if ($existingEntry = $oht[$name]) {
      $oht[$name] = ([array] $existingEntry) + $value
    }
    else {
      $oht[$name] = $value
    }

  })

  # Output the hashtable.
  $oht
}
票数 3
EN

Stack Overflow用户

发布于 2021-05-12 11:59:13

您可以使用.split()方法获得所需的内容。

代码语言:javascript
复制
$DN = "CN=cool.boss,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC =com"
$DN.Split(',').Split('=')[1]

我建议的是将它放入另一个Get-ADUser中,以获得更整洁的输出的displayname (:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67502781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档