powershell - सक्रिय निर्देशिका प्रश्नों को समानांतर करें



active-directory (1)

मान लें कि आपके पास 20 डोमेन नियंत्रक हैं, आप वर्तमान में 20 * 120000 + 2 एलडीएपी क्वेरीज़ कर रहे हैं - जो करीब 2 और एक डेढ़ लाख सवाल है

इसके बजाय आप प्रत्येक डीसी को एक बार पूछ सकते हैं, और डीसी प्रति एक बार में सभी उपयोगकर्ता प्राप्त कर सकते हैं:

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
    }
}

मैं सभी डोमेन नियंत्रक के सभी सक्रिय निर्देशिका उपयोगकर्ताओं से सभी अंतिम लॉगऑन दिनांक प्राप्त करना चाहता हूं। इसका परिणाम सभी उपयोगकर्ताओं और उनके नवीनतम लॉगऑन की तारीख के साथ होगा। मेरी स्क्रिप्ट ठीक काम कर रही है, लेकिन इसे और भी अधिक समांतर करना संभव है?

फिलहाल यह केवल एक उपयोगकर्ता के लिए सभी 20 डोमेन नियंत्रक को खोजने के लिए लगभग 1 सेकेंड लेता है (आदान-समानांतर बहुत मदद कर रहा है)

यहां समस्या हमारे पास ~ 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

क्या आपके पास इसे और भी तेज करने के लिए एक विचार है?





active-directory