如何在不同的受信任域上获取完全限定域名(FQDN)?
通常情况下,我会要求用户采用here概述的任何一种方法(例如whoami /fqdn
或echo %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 snapins(e.f。dsa.msc
)可用,因为我的用户帐户没有足够的权限来安装软件。
我目前获取此其他用户域的FQDN的方法是设置以所述用户身份运行的Windows预定任务,将上述whoami /fqdn
或echo %userDNSdomain%
命令的输出保存到一个文本文件,但这似乎有点kludgy我希望一个简单的单行,我可以从命令提示符或PowerShell提示符运行。任何建议将不胜感激。
最后请注意,如果我的术语不正确或导致混淆,我道歉。对于那些了解我所问的内容的人,我可以对此进行任何修改。
答案 0 :(得分:3)
这应该只使用.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
行。
答案 1 :(得分:1)
$s = [adsisearcher]'(&(objectcategory=user)(samaccountname=somename))'
$s.SearchRoot = [adsi]'LDAP://DomainFqdnOfTargetUserDomain'
$r = $s.FindOne()
$r.properties
$s.PropertiesToLoad.Add('propertyname')
.FindOne()
方法以返回单个项目。如果您正在进行通用搜索,例如(samaccountname = tom *),您可以将其切换为.FindAll()
。$r.properties.samaccountname[0]