我正在嘗試獲取名稱以“Users-####-”(# 是數字 0-9)開頭的 AD 組串列。
我試過使用Get-ADGroup -Filter {name -like "Users-[0-9][0-9][0-9][0-9]-*"}and Get-ADGroup -Filter {name -like "Users-????-*"},但沒有結果。
我當然可以使用Get-ADGroup -Filter {name -like "Users-*"},但這也將包括在 Users- 之后有四個字符以外的所有組。
然后我決定嘗試使用 Where-Object 并且此代碼回傳了預期的組
Get-ADGroup -Filter * | Where-Object {$_.Name -like "Users-[0-9][0-9][0-9][0-9]-*"}
根據有關通配符的 Microsoft 檔案,我嘗試過的兩種方法都應該有效,但實際上并沒有。
任何人都知道我做錯了什么,或者這只是 ADGroup 過濾如何作業的一個錯誤?
uj5u.com熱心網友回復:
根據有關通配符的 Microsoft 檔案,我嘗試過的兩種方法都應該有效,但實際上并沒有。
這是一個合理的假設,但是模塊中-Filter的某些 cmdlet 公開的引數ActiveDirectory是一種欺騙性的構造- 它被設計為看起來像PowerShell 的本機運算子語法,但“在幕后” cmdlet 將過濾器運算式轉換為有效的 LDAP 查詢過濾器:
name -like "Users-*"
# is translated to
(name=Users-*)
$_.Name -like "Users-[0-9][0-9][0-9][0-9]-*"
# is translated to
(Name=Users-[0-9][0-9][0-9][0-9]-*)
由于 LDAP 不能識別通配符范圍結構[0-9],它最終會在目錄存盤中查詢名稱以字面開頭 的物件Users-[0-9][0-9][0-9][0-9]-- 同理?。
由于*是 LDAP 接受的唯一通配符,因此您可以獲得的最接近的通配符是:
Get-ADGroup -Filter {name -like "Users-*-*"}
然后在客戶端上進一步過濾結果Where-Object(在這種情況下,我們回到 PowerShell 執行比較,我們可以再次使用所有通配符):
Get-ADGroup -Filter {name -like "Users-*-*"} | Where-Object Name -like 'Users-[0-9][0-9][0-9][0-9]-*'
uj5u.com熱心網友回復:
如about_ActiveDirectory_Filter 所述:
注意:PowerShell 通配符,除了“*”,例如“?”
-Filter引數語法不支持。
在這種情況下,您可以結合-LDAPFilter使用Where-Object以保持查詢兼容和高效:
Get-ADGroup -LDAPFilter "(name=Users-*-*)" | Where-Object {
$_.Name -like "Users-[0-9][0-9][0-9][0-9]-*"
}
uj5u.com熱心網友回復:
在這種情況下,您可以將-Filter其用作預過濾器,因此至少您只會獲得名稱以 . 開頭的組Users-。
然后在進一步的 Where-Object 子句中,您可以進一步指定,在這種情況下,我將在那里使用正則運算式-match,例如:
Get-ADGroup -Filter "Name -like 'Users-*'" | Where-Object { $_.Name -match '^Users-\d{4}-.*' }
PS-Filter應該是一個字串,而不是一個腳本塊
uj5u.com熱心網友回復:
Powershell Active Directory 模塊中的過濾器有奇怪的行為。
Filter 或 Where 子句
有兩種方法可以限制 AD cmdlet 的輸出,例如 Get-ADUser。首先,您可以使用 -LDAPFilter 或 -Filter 引數來過濾輸出。其次,您可以將結果通過管道傳送到 Where-Object cmdlet。在可能的情況下,第一種方法更有效,原因有兩個。
過濾是在域控制器而不是本地客戶端上完成的。域控制器更可能是為查詢優化的服務器類計算機。過濾會導致通過網路從域控制器發送到客戶端的較小結果集。相反,Where-Object cmdlet 僅在從遠程計算機發送結果集后在本地客戶端上進行過濾。例如,您可以使用 Where-Object cmdlet 檢索部門以“IT”開頭的所有用戶,如下所示:
Get-ADUser -Filter * -Properties department | Where-Object {$_.department -Like "it*"} | Select sAMAccountName, departmentGet-ADUser 陳述句的結果集包括域中的所有用戶。獲得相同結果的更有效方法是使用過濾器,類似于以下內容:
Get-ADUser -Filter {department -Like "it*"} -Properties department | Select sAMAccountName, department現在只有需要的用戶包含在 Get-ADUser 的結果集中。在一個有 2,150 個用戶(其中?? 7 個有“IT”部門)的測驗域中,上面的第一個命令所用的時間是第二個命令的 4 倍(平均 10 次試驗,每次試驗間隔 16 分鐘)。在擁有數萬用戶的域中,差異可能很大。另外,請注意,上面的陳述句使用 -Properties 引數僅指定所需的屬性。始終包含 cmdlet 公開的默認屬性,如本例中的 sAMAccountName。如果您使用 -Properties * 請求所有屬性,則結果集將包含每個用戶的許多屬性。如果您只指定所需的擴展屬性,則結果集會小得多,例如本例中的部門。在有 2,150 個用戶的測驗域中重復上面的最后一個命令,但請求所有屬性(使用 -Properties *)平均需要多 75% 的時間才能完成。Get-ADUser cmdlet 公開的默認和擴展屬性記錄在 Active Directory 中:Get-ADUser 默認和擴展屬性。
PowerShell 過濾器語法
PowerShell Active Directory 模塊 cmdlet 支持擴展形式的 PowerShell 運算式語言。PowerShell 檔案指出 PowerShell 語法過濾器應該用大括號括起來。但是有很多例子使用單引號或雙引號代替。正如您所料,這會影響過濾器的解釋方式。
使用字串屬性 下表顯示了一些使用字串屬性(如 Department)的 PowerShell 語法過濾器示例。一些過濾器會導致錯誤,其他過濾器不會引發錯誤但不會產生結果。變數 $Dept 的定義如前所述。
Filter Result
-Filter {department -eq "IT Department"} Works
-Filter {department -eq $Dept} Works
-Filter {department -eq "$Dept"} No Results
-Filter {department -eq '$Dept'} No Results
-Filter "department -eq $Dept" Error
-Filter 'department -eq $Dept' Works
-Filter {department -eq "it*"} No Results
-Filter {department -Like "it*"} Works
-Filter "department -Like ""it*""" Works
-Filter "department -Like 'it*'" Works
-Filter 'department -Like "it*"' Works
-Filter 'department -Like ''it*''' Works
-Filter {department -ge "IT"} Works
Some of these results may not be expected.
例如,您可能希望將變數包含在帶引號的字串中。最好的策略可能是始終將 PowerShell 語法過濾器括在大括號中,并避免參考變數。
最后一個使用“-ge”運算子的示例僅在極少數情況下有用。過濾器將導致字典順序大于或等于“IT”的任何部門。例如,它將回傳“Test Department”,因為“T”大于“I”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/462210.html
標籤:电源外壳
