【问题标题】:Obtain a text list of OUs from a computer that isn't on a domain without AD module using powershell使用 powershell 从不在没有 AD 模块的域中的计算机获取 OU 的文本列表
【发布时间】:2014-08-11 01:03:53
【问题描述】:

我正在尝试编写可以从给定域中检索 OU 列表以进行进一步处理的 powershell 代码。我只想要一个纯文本列表(出于各种原因)。我无法在这些机器上安装 AD 模块。

$tld = "lan"
$domain = "contoso"
$adLogin = "Administrator"

$mainOU = "Workstations"
$dnSuffix = "OU=$mainOU,DC=$domain,DC=$tld"
$computerPrefix = ""
$computerSuffix = ""
$DomainDN = "LDAP://$domain.$tld"

$adDomain = "$domain" + "." + "$tld"
$adAuthName = "$adDomain\$adLogin"
$Credential = Get-Credential -Credential $adAuthName

# There's probably a better way to do this, but the adsi searcher documentation is hard to sift through, and these machines can't install the AD module.
$remoteObject = New-Object -TypeName System.DirectoryServices.DirectoryEntry -ArgumentList $DomainDN,$($Credential.UserName),$($Credential.GetNetworkCredential().password)
$adObj = ([ADSISearcher]"ObjectClass=OrganizationalUnit")
$adObj.SearchRoot = $remoteObject
$adObj.PropertiesToLoad.AddRange("CanonicalName")
$ouList = $adObj.findall().Properties.canonicalname | Select-String $mainOU | Out-String
$ouList = $ouList.ToString()
$removeText = "$domain" + "." + "$tld" + "/" + "$mainOU"
$ouList = $ouList -replace $removeText
$ouList = $ouList -replace "/"
$ouList = $ouList.Trim()
$ouList = $ouList.Split("`n")
echo $ouList

在目标域内的计算机上运行它会产生以下结果:(这些是用于实验室模拟的虚假 OU。)

    chips
    vinegar
    salsa

但是在域外的计算机上运行它不会产生任何结果。 Powershell 似乎没有提供任何工具来解决原因。是的,我已经验证我可以从那台机器上解析 contoso.lan。有人有什么建议吗?

【问题讨论】:

  • 我将其复制粘贴到我的家用计算机(未加入域)上,该计算机通过 VPN 连接到 AD 网络。一旦我将$tld$domain$adLogin$mainOU 更改为与该域相对应的值,它就完美地工作了(太棒了)。我想不出它不起作用的原因。
  • 我的设置可能有点奇怪。我真的不确定,但我确实找到了一个更优雅的解决方案来解决我之前的问题,它也有效。我将把它作为答案发布。
  • 您可能遇到了安全限制。我存在用于禁止域外计算机进行身份验证的策略。
  • 我在实验室环境中对其进行了测试,该环境只是全新安装的 Windows Server 2012 R2 Datacenter 版本,仅提升到名为 contoso.lan 的域。不知道为什么它不起作用。我展示的代码正是我使用的(域名、tld 等)。

标签: .net powershell active-directory


【解决方案1】:

这是我自己的问题的一个更优雅的解决方案:

$domain = "contoso"
$tld = "lan"
$adLogin = "Administrator"

$mainOU = "Workstations"
$dnSuffix = "OU=$mainOU,DC=$domain,DC=$tld"

$adDomain = "$domain" + "." + "$tld"
$adAuthName = "$adDomain\$adLogin"
$adCredentials = Get-Credential -Credential $adAuthName
$ldapRootPath = "LDAP://" + "$domain" + "." + "$tld"
$ldapWorkstationPath = "LDAP://" + "$domain" + "." + "$tld" + "/OU=" + "$mainOU" + ",DC=" + "$domain" + ",DC=" + "$tld"

$remoteObject = New-Object System.DirectoryServices.DirectoryEntry("$ldapWorkstationPath",$($adCredentials.UserName),$($adCredentials.GetNetworkCredential().password)) -ErrorAction 'Stop' -ErrorVariable ErrProcessNewObjectCred
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $remoteObject
$objSearcher.Filter = ("(objectCategory=OrganizationalUnit)")
foreach ($item in "name") {$objSearcher.PropertiesToLoad.Add($item) | Out-Null }
$searchResult = $objSearcher.FindAll()
$ouList = foreach ($result in $searchResult) {$objOrganizationalUnit = $result.Properties; $objOrganizationalUnit.name}

虽然搜索主体不同,但我认为我的问题中发布的代码不起作用的原因是因为我的 LDAP 路径不完整。应该是 LDAP://contoso.lan/OU=Workstaions,DC=contoso,DC=lan (我发现的例子只表明你需要 LDAP://dc=contoso,dc=lan,这是错误的,powershell 不需要不要费心告诉你这是错误的,只是假装什么都没发生。)

我基于在某处找到的代码示例,但现在我无法再次找到它,否则我会感谢原作者。 (具有讽刺意味的是,它是一个讨论线程的一部分,作者把它扔掉了,支持使用 AD 模块 - 我没有这个选项。)

我明白他们为什么使用 AD 模块,因为这个过程看起来非常复杂,如果我没记错的话,是基于 .net 的吗? (老实说,我不知道什么是 .net 和什么不是 .net 之间的区别;我只是按照示例进行调整以适应我的需求,因为我的技能不足以成为一名真正的软件开发人员,哈哈。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多