如何获取目标用户(不同)域的 FQDN?

How to get FQDN of a Target User's (Different) Domain?

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

通常,我会要求所述用户采用 here 中列出的任何一种方法(例如 whoami /fqdnecho %userDNSdomain%),但如果此方法不适用于任何情况原因(例如,该帐户是代理帐户,我无法以交互方式登录,我工作的公司被收购,新所有者不是很乐意等),有什么办法可以得到这个不同用户帐户的 FQDN?

或者,采用 "emulating" 我的用户凭据返回的 FQDN 的方法也容易出错。以 运行ning 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 管理单元(e.f。dsa.msc)可用,因为我的用户帐户没有足够的权限来安装软件。

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

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

$s = [adsisearcher]'(&(objectcategory=user)(samaccountname=somename))'
$s.SearchRoot = [adsi]'LDAP://DomainFqdnOfTargetUserDomain'
$r = $s.FindOne()

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

这应该只使用 .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'

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