我正在尝试编写一个脚本来分别显示用户特定的属性、名称、邮件地址、OU。输出符合预期,但是我找不到任何解决方案来仅提取和显示用户的 OU 详细信息。当我选择“DistinguishedName”时,响应如下模式:{CN = X, OU = Y, DC = Z},我只想显示 OU。 iv'e 试图找到一种方法来分割 DN 字符串,但到目前为止还没有什么乐趣。
提前致谢
Set-ExecutionPolicy Unrestricted
$filepath = "C:\Users\Administrator\Desktop\ADusers.Csv"
$searchDomain = "DC = GSDOM, DC=internal"
$adminCredential = Get-Credential
$adSrv = 'GSDC'
$session = New-PSSession -ComputerName "$adSrv" -Credential ($adminCredential)
Invoke-Command $session -Scriptblock { Import-Module ActiveDirectory }
Import-PSSession -Session $session -module ActiveDirectory
Get-ADUser -Filter * -Properties * | Select-Object "Name", "EmailAddress", "distinguishedName"
一种有效的方法是从
DistinguishedName
导出OU:
Get-ADUser -Filter * -Properties Mail |
Select Name,Mail,DistinguishedName,@{n='OU';e={$_.DistinguishedName -replace '^.*?,(?=[A-Z]{2}=)'}}
这利用了计算属性,可以在Select-Object中找到。
-replace
使用不区分大小写的正则表达式进行匹配。由于我们没有包含替换字符串,因此匹配的文本只是被删除。 -creplace
是区分大小写的版本。有关正则表达式的详细信息,请参阅Regex。
使用
-Properties *
并不明智,因为这可能会从远程服务器返回大量数据。由于您还使用 -Filter *
,这意味着您将返回所有用户的所有属性。它非常慢并且资源有限。
我就是这样做的
Get-ADUser -Filter * -Properties Mail |
Select Name,Mail,DistinguishedName,@{n='OU';e={($_.DistinguishedName.Split(",") | Where-Object {-Not $_.StartsWith("CN=")}) -join ","}}
$Default_Title = "OU=Users,OU=Workers,DC=ad,DC=colorland,DC=pl"
$justName = $Default_Title.Split(',').Split('=')[-7]
$justName
它只显示工人。
OU 也可以在 CanonicalName 属性中找到。这看起来更像是一个目录结构,如下所示。
域名/OU1/OU2/姓氏、名字
但是,由于它使用“/”作为分隔符,因此如果用户的专有名称中可能有“,”,则使用 split 会更简单。
添加以下内容应该可以获得用户名之前最后一个 OU 的所需结果
e@{n=OU:e={($_.CanonicalName -split "/")[-2]}}
所以像下面这样的查询
Get-Aduser -filter * -properties CanonicalName | FT Name,@{n='OU';e={($_.CanonicalName -split "/")[-2]}}
会回来 姓氏、名字 OU2