【问题标题】:How to get FQDN of a Target User's (Different) Domain?如何获取目标用户(不同)域的 FQDN?
【发布时间】:2017-06-13 16:08:42
【问题描述】:

如何为不同的受信任域中的用户获取完全限定域名 (FQDN)?

通常情况下,我会要求所述用户采用here 概述的任何一种方法(例如whoami /fqdnecho %userDNSdomain%),但如果这种方法由于某种原因不可用(例如该帐户是代理)我无法以交互方式登录的帐户,我工作的公司已被收购,新的所有者不是那么即将到来,等等),有没有办法获得这个不同用户帐户的 FQDN?

或者,采用“模拟”我的用户凭据返回的 FQDN 的方法也容易出错。以我的用户身份运行whoami /fqdn 的输出为例:

C:\Users\john.eisbrener>whoami /fqdn
CN=John M. Eisbrener,OU=Standard Users,OU=Resources,DC=CONTOSO,DC=COM

可以在概念上将CONTOSO 域组件调整为另一个受信任的域,期望它遵循相同的结构,但这是短视的,因为并非所有域都遵循相同的结构命名约定。我看到太多受信任的域使用.org 或在其 LDAP 根路径中包含额外的域前缀或后缀。

所有这一切的主要驱动因素是我需要将正确的域组件传递给以下 PowerShell 查询,我在尝试查找可能需要将哪些用户组和用户名添加到某些安全组时依赖这些查询,文件路径等。

## List Groups for a Username
$domainName = 'CONTOSO'
$domainSuffix = 'COM'
$username = 'john.eisbrener'
(New-Object System.DirectoryServices.DirectorySearcher((New-Object System.DirectoryServices.DirectoryEntry("LDAP://dc=$($domainName),dc=$($domainSuffix)")), "(&(objectCategory=User)(samAccountName=$($username)))")).FindOne().GetDirectoryEntry().memberOf | % { (New-Object System.DirectoryServices.DirectoryEntry("LDAP://"+$_)) } | Sort-Object sAMAccountName | SELECT @{name="Group Name";expression={$_.Name}},@{name="Group sAMAccountName";expression={$_.sAMAccountName}}


## List Members in a Group
$domainName = 'CORP'
$domainSuffix = 'ORG'
$groupname = 'RemoteUsers'
(New-Object System.DirectoryServices.DirectoryEntry((New-Object System.DirectoryServices.DirectorySearcher((New-Object System.DirectoryServices.DirectoryEntry("LDAP://dc=$($domainname),dc=$($domainSuffix)")), "(&(objectCategory=Group)(name=$($groupname)))")).FindOne().GetDirectoryEntry().Path)).member | % { (New-Object System.DirectoryServices.DirectoryEntry("LDAP://"+$_)) } | Sort-Object sAMAccountName | SELECT @{name="User Name";expression={$_.Name}},@{name="User sAMAccountName";expression={$_.sAMAccountName}}

为什么我不能安装任何其他组件或模块?我使用的计算机非常普通,没有任何额外的 PowerShell 模块或 mmc 管理单元(例如dsa.msc)可用,因为我的用户帐户没有足够的权限来安装软件。

我目前获取此其他用户域的 FQDN 的方法是设置一个以所述用户身份运行的 Windows 计划任务,将上述 whoami /fqdnecho %userDNSdomain% 命令的输出保存到文本文件中,但这似乎是有点笨拙,我希望有一个简单的单行程序,可以从命令提示符或 PowerShell 提示符运行。任何建议将不胜感激。

最后,如果我的术语不正确或导致混淆,我深表歉意。我愿意接受理解我所问内容的人对此进行的任何编辑。

【问题讨论】:

  • ADSI 和 RSAT 的 Active Directory 模块不一样。 ADSI 将是您可能想要使用的方法。
  • @BenH 在这种情况下我无法使用这些工具中的任何一个,因为我的帐户没有足够的权限将软件安装到我有权访问的计算机上。
  • 那么您需要通过 [adsisearcher] 类型加速器或 System.DirectoryServices.DirectorySearcher 类使用 shell 中本机可用的内容。
  • ADSI 未安装。它是 .Net 的一部分。 @thepip3r whoami /fqdn 确实返回了专有名称。
  • 对于当前用户,AD 不会将其称为“FQDN”,它是一个专有名称。它可能恰好是完全限定的,因为它包括它所属的权威:例如dc=contoso,dc=com 但只是想确保它是他正在寻找的 DN。

标签: powershell active-directory fqdn distinguishedname


【解决方案1】:

这应该只使用 .Net 类,所以它应该适合你。

Function Get-TrustedDomainUser{
Param([String]$Alias)
    $Forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
    $AllTrusts=$Forest.GetAllTrustRelationships()
    $Filter = "(&(sAMAccountName=$Alias)(objectClass=user))"
    $Searcher = [adsisearcher]$Filter
    ForEach($Domain in $AllTrusts.TargetName){
        Write-Host "Trying to find user in $Domain"
        $LDAP = 'DC=' + ($Domain.split('.') -join ',DC=')
        $Searcher.SearchRoot = "LDAP://$LDAP"
        $ErrorActionPreference = 'Stop'
        try{
            $DomUser = $Searcher.FindAll()

        }Catch{
            Write-Host "User not found in $Domain"
        }
        If(!([string]::IsNullOrEmpty($DomUser.Path))){Break}
    }
    $DomUser
}

Get-TrustedDomainUser -Alias 'SomeUser'

这将获取所有受信任的域,然后尝试在每个域中查找用户,直到找到该用户,此时它返回该用户。如果您不喜欢屏幕上的垃圾邮件,只需将 Write-Host 行注释掉即可。

【讨论】:

  • 如果我将$AllTrusts=$Forest.GetAllTrustRelationships() 调整为$rootTrusts = $Forest.RootDomain.GetAllTrustRelationships() $targetTrusts = $Forest.GetAllTrustRelationships() $AllTrusts = $rootTrusts + $targetTrusts,这包括所有域除了源域。有什么快速或更好的方法来包含这些额外的域?
【解决方案2】:
$s = [adsisearcher]'(&(objectcategory=user)(samaccountname=somename))'
$s.SearchRoot = [adsi]'LDAP://DomainFqdnOfTargetUserDomain'
$r = $s.FindOne()

$r.properties
  • 使用 adsisearcher 类型加速器构造函数来指定我们要运行的 ldap 搜索
  • 使用基础 DirectorySearcher 对象的属性来指定我们不想使用默认用户的域,而是使用我们指定的域(必须是 ADSI 引用)。
  • distinguishedname 是返回的默认 AD 属性。如果不是,或者您需要添加一个不是默认的,您可以使用:$s.PropertiesToLoad.Add('propertyname')
  • 执行.FindOne() 方法返回一个单数项。如果您正在进行通用搜索,例如(samaccountname=tom*),您可以将其切换为.FindAll()
  • 将结果发送到屏幕,以便您查看返回的对象属性。
  • 请理解,出于某种疯狂的原因,这些调用将每个属性作为数组返回(即使它在 AD 架构中定义为单值),因此在大多数情况下,虽然引用该属性将在单项数组中工作,但它也更适合按索引引用它:例如$r.properties.samaccountname[0]

【讨论】:

  • 我试图在这种情况下找出'LDAP://DomainFqdnOfTargetUserDomain'。对不起,如果我的问题比其他任何问题都更令人困惑......
  • 目标用户域的 FQDN 是什么?如果您的 AD 域是 sears.com 并且目标域是 roebuck.com,那么当您从计算机运行脚本时,您需要将 'DomainFqdnOfTargetUserDomain' 替换为 roebuck.com。原因是,这个属性有一个默认属性,它默认为运行脚本的主体的用户上下文(即您的用户帐户的域)。为了搜索另一个域,您必须使用 SearchRoot 属性使其定位到另一个域。
  • 这里的场景是没有人知道目标用户域的FQDN,所以这正是我想要弄清楚的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多