我試圖從我們的 AD 中獲取所有承包商和員工,并啟用 true 過濾器。AD 本身非常龐大,而且很多資料在運行 powershell 腳本時可能會導致超時限制。當我將其放入變數時出現此錯誤,如果我直接導??出,則會收到超時限制。
有沒有什么方法可以在不出現此問題的情況下,通過啟用大 AD 的員工收集所有承包商和員工資料?我得到一個輸出但不確定輸出是否真實,因為我收到錯誤。
謝謝
Param(
[Parameter(Mandatory = $true,ValueFromPipeline = $false,HelpMessage = "Specify a output file name and path.")]
[string]
$OutputFileNamePath = $null
)
$Storage = @()
Write-Host "**********************************************************" -ForegroundColor Green
Write-Host "* On Process *" -ForegroundColor Green
Write-Host "**********************************************************" -ForegroundColor Green
$filter = @("CONTRACTOR", "EMPLOYEE")
$Storage = Get-ADUser -Filter * -Properties EmployeeNumber,Name,SamAccountName,employeeType,PasswordLastSet,LastLogonDate | Where {($_.Enabled -eq $True) -and $filter -contains $_.employeeType} | Select EmployeeNumber,Name,SamAccountName,employeeType,PasswordLastSet,LastLogonDate
$Storage | Export-Csv -Path $OutputFileNamePath".csv" -Force
Write-Host "**********************************************************" -ForegroundColor Green
Write-Host "* Done *" -ForegroundColor Green
Write-Host "**********************************************************" -ForegroundColor Green
uj5u.com熱心網友回復:
這篇 TechNet 文章為我們提供了有關為什么會發生此錯誤的提示,主要是:
- Get-ADUser 使用分頁(默認每頁 256 個物件)
- 由客戶請求新頁面
- 當管道輸出 AD 物件時,管道中的代碼處理時間越長,我們從 Active Directory Web 服務檢索資料的速度就越慢
- 如果較慢的處理導致檢索時間超過 30 分鐘,則 Enumeration Context Expires
最有可能的是,您的查詢已經運行了 30 分鐘,從而導致了此例外。對此的解決方案是進行更有效的查詢,以便在此時間之前完成,或者MS 不推薦:
增加 Active Directory Web 服務的“MaxEnumContextExpiration”值。不采用這種方法的原因有很多。
您可以利用LDAPFilter來提高查詢的性能,Where-Object在這種情況下不需要使用:
$properties = 'EmployeeNumber', 'employeeType', 'PasswordLastSet', 'LastLogonDate'
$filter = '(&(!userAccountControl:1.2.840.113556.1.4.803:=2)(|(employeeType=CONTRACTOR)(employeeType=EMPLOYEE)))'
Get-ADUser -LDAPFilter $filter -Properties $properties
要將 LDAP 過濾器轉換為可讀的內容:
&- 邏輯與運算子|- 邏輯或運算子(!userAccountControl:1.2.840.113556.1.4.803:=2)- 啟用用戶物件(|(employeeType=CONTRACTOR)(employeeType=EMPLOYEE))-employeeType是“承包商”或“雇員”(&(...)(|(...)(...)))- 必須滿足所有條款。我們可以把它讀作:
(用戶已啟用) 和 (用戶employeeType是“承包商”或“雇員” )
供將來參考Active Directory:LDAP 語法過濾器
uj5u.com熱心網友回復:
我修改了你的腳本,但我只是將所有用戶抓取到一個$Users陣列中,然后ForEach為每個用戶運行一個回圈。里面有一個If檢查用戶是否已啟用以及 EmployeeType 是-likeCONTRACTOR 還是 EMPLOYEE。如果是,則將它們添加到$Storage陣列中,然后在回圈完成后將其匯出。
它對我有用,但如果您有任何問題,請告訴我:
Param(
[Parameter(Mandatory = $true,ValueFromPipeline = $false,HelpMessage = "Specify a output file name and path.")]
[string]
$OutputFileNamePath = $null
)
$Storage = @()
Write-Host "----------------------------------------------------------" -ForegroundColor Green
Write-Host "- On Process -" -ForegroundColor Green
Write-Host "----------------------------------------------------------" -ForegroundColor Green
$Users = Get-ADUser -Filter * -Properties EmployeeNumber,Name,SamAccountName,employeeType,PasswordLastSet,LastLogonDate
Foreach($user in $users){
If(($User.Enabled -eq $True) -and (($User.EmployeeType -like "*CONTRACTOR*") -or (($User.EmployeeType -like "*EMPLOYEE*")))){
$Storage = $User
}
}
$Storage | Export-Csv -Path $OutputFileNamePath".csv" -NoTypeInformation -Force
Write-Host "----------------------------------------------------------" -ForegroundColor Green
Write-Host "- Done -" -ForegroundColor Green
Write-Host "----------------------------------------------------------" -ForegroundColor Green
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/376420.html
標籤:电源外壳
