2017-06-13 46 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,所以這正是我想要弄清楚的。 –

相關問題