0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowerShellのGet-ADUser繰り返し処理を高速化

Last updated at Posted at 2020-07-01

背景

PowerShellのGet-ADUserコマンドレットをつかって、Active Directoryから数千件以上の単位でユーザオブジェクトを取得後、ユーザの属性を使って繰り返し処理をすると、非常に遅くなります。

例えばこんな感じです。

Sample01.ps1
$users = Get-ADUser -Server MyADServer01:3268 -Filter { enabled -eq $true } -Properties SAMAccountName,mail,department,lastLogonDate

foreach ($user in $users) {
    if ($user.lastLogonDate -lt (Get-Date).AddMonths(-6)) {
        # 何かの処理
    }
}

繰り返し処理内部の各ユーザのプロパティーは、どうやらそのつどActive Directoryへ問合せが発生するようで、パイプラインを使っても速度は改善されません。

SearchBaseオプションで検索対象のOUを限定しても、戻り値のユーザ数を大幅に減らさない限り処理速度は大きく変わりません。

また、いったん連想配列に代入しても、メモリ上にキャッシュしてくれるわけではないようで、やはり問題は解決しません。

StackOverflowにもこの質問はいくつか見つかりましたが、決定打となる回答はありませんでした。

ところが、非常にシンプルな解決法を偶然見つけました。

いったんCSVファイルに書き出すだけ

Export-CsvでGet-ADUserの結果をいったんCSVファイルに書出し、Import-Csvで連想配列に読み込みましょう。

Sample02.ps1
Get-ADUser -Server MyADServer01:3268 -Filter { enabled -eq $true } -Properties SAMAccountName,mail,department,lastLogonDate |
Export-Csv -Path .\temp.csv -Delimiter "," -Encoding UTF8 -Force

$users = Import-Csv Path .\temp.csv -Delimiter "," -Encoding UTF8

Remove-Item -Path .\temp.csv

これだけでメモリにキャッシュしてくれるようで、繰り返し処理が場合によっては2桁のレベルで高速化します。

以上

0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?