Powershell 从ADUser DifferentizedName获取CN值
我有一个PS脚本,用于检查Active Directory中某些自定义用户的属性。 其中一个属性是“经理” 当我运行脚本时,我得到: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
用户的管理者是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
)(对不起,我误读了这个问题-你的答案是正确的)。+1对于一个优雅的解决方案,它唯一的限制是嵌入在值(\3C
)中的转义逗号可能不常见,无法正确处理。解析\,
+1的非常巧妙的方法。@mklement0是的,这就是我所说的“多多少少”;)不过,感谢您的回答,这是一个很好的参考,以防有人需要一个功能齐全的解决方案。CN
($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 }