微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

执行 [adsisearcher] 并存储在哈希表或字典集合列表中的最快方法

如何解决执行 [adsisearcher] 并存储在哈希表或字典集合列表中的最快方法

我使用 [adsisearcher] 来获取 AD 用户信息,因为它比 get-aduser 快得多。我还试图弄清楚如何使用 LINQ 或任何其他快速替代方法将其添加到哈希表或字典中。对我而言,我正在努力获得最佳性能/最高效率,因为长期目标是将数据导入联系人列表。

这是我目前拥有的,而且效果很好,但我很好奇是否有更快的方法来组织数据?

$start = Get-Date

$searcher=[adsisearcher]""
$searcher.sort.PropertyName = "sn"
$searcher.Filter = "(&(extensionAttribute2=customValue)(|(mobile=*)(telephonenumber=*)))"
$colProplist = "givenname","extensionattribute2","initials","mobile","telephonenumber","sn","displayname","company","title","mail","department","thumbnailphoto","samaccountname"
foreach ($i in $colPropList){$searcher.PropertiesToLoad.Add($i) > $NULL }

$End = Get-Date

Write-Host "User info took $($start - $End) seconds"
Write-Host ""

#----------------------------------------------------

Write-Host "Creating User Hashtable"
$start = Get-Date

$Users=@{}

$Users = $searcher.FindAll() | ForEach-Object{
    New-Object -TypeName PSCustomObject -Property @{

        'FirstName' = $_.properties.givenname -join ''
        'MiddleName' = $_.properties.initials -join ''
        'LastName' = $_.properties.sn -join ''
        'displayName' = $_.properties.displayname -join ''
        'SamAccountName' = $_.properties.samaccountname -join ''
        'Email' = $_.properties.mail -join ''
        'Mobile' = $_.properties.mobile -join ''
        'TelephoneNumber' = $_.properties.telephonenumber -join ''
        'Title' = $_.properties.title -join ''
        'Dept' = $_.properties.department -join ''
        'Company' = $_.properties.company -join ''
        'Photo' = $_.properties.thumbnailphoto -join ''
        'ExtensionAttribute2' = $_.properties.extensionattribute2 -join ''

     } | Select-Object -Property FirstName,MiddleName,LastName,displayName,SamAccountName,Email,Mobile,TelephoneNumber,Title,Dept,Company,Photo,ExtensionAttribute2
 }

$End = Get-Date

Write-Host "User HashTable took $($start - $End) seconds"
Write-Host ""

我听说使用 LINQ 非常快,但我无法正确使用语法,而且我似乎找不到好的文档或如何使用它的示例。

解决方法

因此,正如在我的评论中一样,我个人认为您的脚本没有太大的改进空间。我修改了一些小东西。您应该使用 measure-command 进行测试,看看代码是使用经典的 foreach 循环还是使用 foreach-object 循环运行得更快。

我还更改了强类型 -join ''[string],我不确定,但可能会更快。

回答你的问题,为什么 -join '' 存在,这是因为每个属性都是 ResultPropertyValueCollection 类型

PS /> $z.samaccountname.GetType()

IsPublic IsSerial Name                                     BaseType                                                                         
-------- -------- ----                                     --------                                                                         
True     False    ResultPropertyValueCollection            System.Collections.ReadOnlyCollectionBase 

通过执行 -join '',您将每个属性的值转换为字符串:

PS /> ($z.samaccountname -join '').GetType()

IsPublic IsSerial Name                                     BaseType                                                                         
-------- -------- ----                                     --------                                                                         
True     True     String                                   System.Object   

PS /> ([string]$z.samaccountname).GetType()

IsPublic IsSerial Name                                     BaseType                                                                         
-------- -------- ----                                     --------                                                                         
True     True     String                                   System.Object   

但是为什么这很重要?
好吧,基本上,如果您尝试导出数据而不将这些值转换为 string 到 Csv,例如,您最终会得到这样的结果(您会看到每个值的类型):

enter image description here

$start = Get-Date

$searcher=[adsisearcher]""
$searcher.Sort.PropertyName = "sn"
$searcher.Filter = "(&(objectcategory=person)(objectclass=user)(extensionAttribute2=*)(|(mobile=*)(telephonenumber=*)))"

$colProplist = @(
    'givenname','extensionattribute2'
    'initials','mobile','telephonenumber'
    'sn','displayname','company'
    'title','mail','department'
    'thumbnailphoto','samaccountname'
)

$colPropList | foreach-object {
    $searcher.PropertiesToLoad.Add($_) > $null
}

$end = Get-Date

Write-Host "User info took $($Start - $End) seconds"
Write-Host ""

#----------------------------------------------------

Write-Host "Creating User Hashtable"
$start = Get-Date

$users = foreach($user in $searcher.FindAll())
{
    $i = $user.properties

    [pscustomobject]@{
        FirstName = [string]$i.givenname
        MiddleName = [string]$i.initials 
        LastName = [string]$i.sn 
        DisplayName = [string]$i.displayname 
        SamAccountName = [string]$i.samaccountname 
        Email = [string]$i.mail 
        Mobile = [string]$i.mobile 
        TelephoneNumber = [string]$i.telephonenumber 
        Title = [string]$i.title 
        Dept = [string]$i.department 
        Company = [string]$i.company 
        Photo = [string]$i.thumbnailphoto 
        ExtensionAttribute2 = [string]$i.extensionattribute2
    }
}

$End = Get-Date

Write-Host "User HashTable took $($Start - $End) seconds"
Write-Host ""

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。