我问这个问题主要是想问是否有更好的方法来做我的工作。我还想知道是否有人认为以这种方式获取此信息有任何问题。
我正在尝试获取用户所在的顶级 OU,以及任何较低级别的 OU。主要问题是我们有多个站点,其中一些站点具有用于用户帐户的多层 OU ( ou=doctors,ou=Users,ou=Site,dc=example,dc=com
),而有些站点只有一个 OU ( ou=Users,ou=Site,dc=example,dc=com
)。我使用下面的脚本来获取 DN 路径,拆分它,然后用最后三个部分向后重建它。任何人都可以看到这样做的任何问题。只是感觉有些不对劲......
$user = Get-ADUser CKnutson
$user.DistinguishedName
# Returns: CN=Cory Knutson,OU=IT,OU=Users,OU=Site,DC=example,DC=com
$split = $user.DistinguishedName.Split(',')
$path = "$($split[-3]),$($split[-2]),$($split[-1])"
Write-Host $path
# Returns: OU=Site,DC=example,DC=com
简而言之,我的最终目标是找到通往每个“站点”OU 内部的“禁用”OU 的路径。因此,我的脚本可以在禁用帐户时将对象移动到该站点的顶级 OU ( OU=Disabled,OU=Site,DC=example,DC=com
) 中的适当位置。
是的,我看到您当前的方法可能会出现两个直接问题。
1.转义逗号
考虑一个名称中带有逗号的 OU,例如:
OU=Users\, Admin,DC=corp,DC=example
您的使用
string.Split()
不会关心转义序列,您最终会得到:使用
-split
正则表达式运算符并向后看,以确保您忽略转义的逗号:2. 便携性
您的代码假定 DN 的 NC 部分(例如
DC=example,DC=com
)始终只有 2 个标签宽。这意味着如果您在可能希望在其他域/环境中重用的脚本中使用它,您的代码将会失败。我会从右到左抓取每个部分,直到找到没有
DC
RDN 前缀的部分:在我看来,使用路径名 COM 对象并简单地询问 DN 的父级更简单。您可以将其放入
while
循环中以获取对象的层次结构。使用我的ADName模块的示例:示例输出:
所以你是在账户路径的 DN 之后?您可以使用使用 (?) ungreedy 限定符的正则表达式来做到这一点。没有拆分,因此转义逗号不是问题。
编辑
我不清楚这句话
the top level OU that a user is in, and any lower level OUs.
你也可以这样做: