Powershell 對值和陣列的作用不同?

Powershell 對值和陣列的作用不同?

我嘗試使用 Powershell 從 Active Directory 中獲取一些信息,但出現一些奇怪的行為。這是我的腳本:

$toFind = ( 'bobjones', 'samsmith' )

filter Get-AdUser {
    $strFilter = "(&(objectCategory=User)(sAMAccountName=$_))"

    $objDomain = New-Object System.DirectoryServices.DirectoryEntry
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.SearchRoot = $objDomain
    $objSearcher.PageSize = 1000
    $objSearcher.Filter = $strFilter

    $colProplist = ("name", "department")
    foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}

    ($objSearcher.FindAll() | %{$_.Properties})
}

"paul" | get-aduser # Works
$toFind | get-aduser # Doesn't work?!

前者列印我所期望的屬性表;後者最終只是重複列印“0 1”,儘管我不確定為什麼。為什麼單例可以工作,而陣列卻不行?

答案1

您想要做的是查詢全域目錄,因為您想要搜尋整個森林。有多種方法,但最簡單的是將搜尋根更改為 GC。例如

$objSearcher.SearchRoot = [ADSI]"GC://$($objDomain.Name)" 

或者,您可以查詢森林,然後向其請求全域目錄列表,並使用其中一個作為初始目錄條目,但這是一個足夠簡單的更改,只要您正在搜尋的欄位位於GC 中,它將執行您想要的操作。在您的情況下,搜索部分不應該成為問題,因為您正在按默認情況下全局的用戶名進行搜索,但您不會從搜索結果結果中返回“部門”字段,因為默認情況下“部門”不是全局的。要取得它,您需要使用搜尋結果中的專有名稱對使用者網域進行後續 AD 查找以取得完整的 AD 使用者對象,然後從中提取部門。您可以更改您的架構,以便 Department 是全球性的,但這在我看來有點激進。

您可以找到完整的列表此處預設全域屬性。

答案2

您可能必須指定一個 foreach 循環,例如 foreach ($user in $toFind) { get-aduser $user }

如果您只需在提示符號處輸入 $toFind 會發生什麼?我假設它會列出兩個名字,每行一個,就像它應該的那樣。

我嘗試對我的 AD 運行相同的程式碼並得到以下結果:0 1

名稱 值 ---- ----- 名稱 {Sahnti L. Aphil} adspath {LDAP://CN=Sahnti L. Aphil,OU=Users,OU=Jackson,DC=company,DC=local} 0 1 名稱{Hamong Justice} 廣告路徑{LDAP://CN=Hamong Justice,OU=Users,OU=Jackson,DC=company,DC=local}

答案3

只是附註:我強烈建議您研究 Quest AD cmdlet 套件(http://www.quest.com/powershell/activeroles-server.aspx) 對於所有與 AD 相關的 powershell 事物。它填補了一個漏洞,因為 powershell 中的內建 AD 支援非常糟糕。這將為您節省大量的開發時間。

答案4

僅供參考,您獲得 0 和 1 輸出的原因是因為對 $objSearcher.PropertiesToLoad.Add() 的呼叫傳回已新增屬性的索引(0 表示第一個屬性,1 表示第二個屬性)。這對於腳本中的每個用戶都會發生一次。您可以透過將傳回值傳遞給 Out-Null 來抑制傳回值。

相關內容