Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 从ADUser DifferentizedName获取CN值_Powershell_Active Directory_Distinguishedname - Fatal编程技术网

Powershell 从ADUser DifferentizedName获取CN值

Powershell 从ADUser DifferentizedName获取CN值,powershell,active-directory,distinguishedname,Powershell,Active Directory,Distinguishedname,我有一个PS脚本,用于检查Active Directory中某些自定义用户的属性。 其中一个属性是“经理” 当我运行脚本时,我得到: 用户的管理者是CN=cool.boss,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC=com 问题是,对于某些用户而言,text“OU=SO、OU=PL、OU=RET、OU=HBG、DC=domain、DC=com”会有所不同 如何修改输出并删除除“cool.boss”之外的所有内容? 提前感谢您您可以使用reg

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

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

用户的管理者是CN=cool.boss,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC=com
问题是,对于某些用户而言,text
“OU=SO、OU=PL、OU=RET、OU=HBG、DC=domain、DC=com”
会有所不同

如何修改输出并删除除“cool.boss”之外的所有内容?
提前感谢您

您可以使用regex进行以下操作:

$s = "CN=cool.boss,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC =com"

$pattern = [regex]"CN=.*?OU"
$r = $pattern.Replace($s, "CN=OU")
$r

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

$DN = "CN=cool.boss,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC =com"
$DN.Split(',').Split('=')[1]

我的建议是,将其放入另一个
Get ADUser
中,以获得更整洁输出的显示名(:

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

($data.manager -split "," | ConvertFrom-StringData).CN

要使用PowerShell惯用解决方案补充此处的有用答案,请执行以下操作:

  • 使用
    -split
    ,基于正则表达式:
$dn='CN=cool.boss,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC=com'
($dn-split'(?:^ |,)CN=|,')[1]#->“酷.老板”
  • 使用
    -replace
    ,基于正则表达式:
$dn='CN=cool.boss,OU=Users,OU=SO,OU=PL,OU=RET,OU=HBG,DC=domain,DC=com'
$dn-替换“(?:^ |,)CN=([^,]+).*”,“$1”#->“cool.boss”
注:

  • 上述解决方案不依赖于输入中名称-值对(RDN)的特定顺序(即,
    CN
    条目不必是第一个条目),但如果存在多个条目,它们只提取第一个
    CN
    条目的值,并且它们假定(至少)存在一个条目

  • 原则上,以输入字符串为例,可以在组成DN的名称-值对的值中嵌入
    字符,转义为
    (或者,在十六进制表示法中,
    \2C
    );例如,
    “CN=boss\,cool,OU=Users,”

  • 一个真正强大的解决方案必须考虑到这一点,并且理想情况下还可以取消最终的价值;在撰写本文时,现有的答案都没有这样做;请参见下文


可靠地解析LDAP/AD DN()

以下
拆分DN
函数

  • 正确处理转义、嵌入的
    字符以及其他转义序列

  • 取消转义值,这不仅包括删除语法
    \
    ,还包括转换形式为
    \
    的转义序列,其中
    hh
    是一个两位十六进制数。表示字符代码点的数字转换为它们所表示的实际字符(例如,
    \3C
    )(对不起,我误读了这个问题-你的答案是正确的)。+1对于一个优雅的解决方案,它唯一的限制是嵌入在值(
    \,
    )中的转义逗号可能不常见,无法正确处理。解析
    CN
    +1的非常巧妙的方法。@mklement0是的,这就是我所说的“多多少少”;)不过,感谢您的回答,这是一个很好的参考,以防有人需要一个功能齐全的解决方案。
    ($data.manager -split "," | ConvertFrom-StringData).CN
    
    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}
    
    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
    }