gpt4 book ai didi

powershell - 并行化 Active Directory 查询

转载 作者:行者123 更新时间:2023-12-03 17:56:10 24 4
gpt4 key购买 nike

我想从所有域 Controller 的所有 Active Directory 用户那里获取所有上次登录日期。这将生成一个包含所有用户及其最新登录日期的列表。我的脚本运行良好,但是否可以进一步并行化它?

目前,只需大约 1 秒即可为一个用户查询所有 20 个域 Controller (Invoke-Parallel 有很大帮助)。

这里的问题是我们有 ~120k 用户

代码如下:

. 'D:\scripts\InPa\Invoke-Parallel-lite-nolog.ps1'

function Get-UsersLastLogon{
$AllDCs = ([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().domainControllers).Name
$AllUser = ((New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User))")).FindAll().Properties).samaccountname

foreach($SamAccountName in $AllUser){
$Latest = $AllDCs | Invoke-Parallel -Throttle 60 -ScriptBlock {
$de=[adsi]"LDAP://$_"
$UserSeacher = (New-Object System.DirectoryServices.DirectorySearcher($de,"(&(objectCategory=User)(samaccountname=$Using:SamAccountName))")).FindAll().Properties

$co = New-Object System.Object
$co | Add-Member -type NoteProperty -name SamAccountName -value $Using:SamAccountName
$co | Add-Member -type NoteProperty -name lastlogon -value ([datetime]::FromFileTime([string]$UserSeacher.lastlogon))
$co

}
$Latest | Sort-Object -Property lastlogon -Descending | Select-Object -First 1
}
}

Get-UsersLastLogon | Export-Csv -Path D:\UsersLastLogon.csv -Delimiter ';' -NoTypeInformation

您有什么想法可以进一步加快速度吗?

最佳答案

假设您有 20 个域 Controller ,您目前正在执行 20 * 120000 + 2 个 LDAP 查询 - 几乎是 250 万个查询。

您可以改为查询每个 DC 一次,并在每个 DC 中一次检索所有用户:

function Get-UsersLastLogon{

# Gather all DC names
$AllDCs = ([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().domainControllers).Name

# In parallel, query the DCs for ALL users
$AllEntries = $AllDCs | Invoke-Parallel -Throttle 60 -ScriptBlock {
$de=[adsi]"LDAP://$_"
$UserSeacher = New-Object System.DirectoryServices.DirectorySearcher($de,"(&(objectCategory=User))")
[void]$UserSeacher.PropertiesToLoad.Add('lastLogon')
$Users = $UserSeacher.FindAll().Properties

foreach($User in $Users){
New-Object psobject -Property @{
SamAccountName = $User.SamAccountName
LastLogon = ([datetime]::FromFileTime([string]$User.lastlogon))
}
}
}

# Group all the results by user name
foreach($UserEntry in $AllEntries |Group-Object SamAccountName){
# Emit the newest entry per username
$UserEntry.Group |Sort-Object -Property LastLogon -Descending | Select-Object -First 1
}
}

关于powershell - 并行化 Active Directory 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42692693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com