2017-06-13 59 views
1

如何为不同的受信域上的用户获取完全限定的域名(FQDN)?如何获取目标用户(不同)域的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 

可以概念调整域组件对方,信任域,与它沿用了同样的期望,但是这将是目光短浅,因为并非所有的域名遵循相同的命名惯例。我看到太多使用.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(例如dsa.msc),因为我的用户帐户没有足够的权限来安装软件。

我目前的做法得到这个其他用户的域的FQDN是设置运行Windows计划任务为上述用户,节省了上述whoami /fqdnecho %userDNSdomain%命令到一个文本文件的输出,不过这似乎有点缺憾和我希望能够从命令提示符或PowerShell提示符运行一个简单的单线程。任何建议,将不胜感激。

最后说明,如果我的术语不正确或导致混淆,我很抱歉。我愿意接受某人理解我所问的任何修改。

+1

ADSI和来自RSAT的Active Directory模块不一样。 ADSI将成为您可能想要使用的方法。 – BenH

+0

@BenH我无法在这种情况下使用这些工具,因为我的帐户没有足够的权限将软件安装到我有权访问的计算机上。 –

+0

那么你需要通过[adsisearcher]类型加速器或System.DirectoryServices.DirectorySearcher类使用shell中本地可用的内容。 – thepip3r

回答

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行注释掉。

+0

如果我调整'$ AllTrusts = $ Forest.GetAllTrustRelationships()'到'$ rootTrusts = $ Forest.RootDomain.GetAllTrustRelationships()$ targetTrusts = $ Forest.GetAllTrustRelationships()$ AllTrusts = $ rootTrusts + $ targetTrusts',这包括所有域* EXCEPT *源域。任何快速或_better_方式来包含这些额外的域名? –

1
$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]
+0

我想在这种情况下找出''LDAP:// DomainFqdnOfTargetUserDomain''。对不起,如果我的问题导致比其他任何更混乱... –

+1

什么是目标用户的域的FQDN?如果您的AD域是sears.com,而目标域是roebuck.com,那么当您从计算机运行脚本时,您需要用roebuck.com替换“DomainFqdnOfTargetUserDomain”。原因是,此属性具有默认属性,并且它默认为运行脚本的主体(即您的用户帐户的域)的USER CONTEXT。为了搜索另一个域,您必须使用SearchRoot属性将其定位到另一个域。 – thepip3r

+0

这里的场景是,没有人知道目标用户的域的FQDN,所以这正是我想要弄清楚的。 –