首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Par等位化Active查询

Par等位化Active查询
EN

Stack Overflow用户
提问于 2017-03-09 10:22:09
回答 1查看 519关注 0票数 3

我想从所有域控制器的所有Active用户那里获取所有的最后登录日期。这将导致一个列表与所有用户和他们的最新登录日期。我的脚本运行得很好,但是可以更多地并行化吗?

目前,仅为一个用户查询所有20个域控制器需要1秒左右(调用-并行非常有用)。

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

以下是代码:

代码语言:javascript
复制
. '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

你有更快的想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-09 10:40:55

假设您有20个域控制器,您目前正在执行20 * 120000 +2 LDAP查询--即将近250万个查询。

相反,您可以做的是对每个DC进行一次查询,并在每次DC中一次检索所有用户:

代码语言:javascript
复制
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
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42692693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档