MS AD を更新し、エラーを txt ファイルに出力するために MySQL クエリを実行しています。コードは正常に動作しますが、数分後に「System.OutOfMemoryException」というエラーが発生します。
以下はコードの短い部分です。
Function Addmembers {
$query = "SELECT * FROM allstudents_groups"
$dtResult = New-Object "System.Data.DataTable"
$hashOptions = @{ }
$hashOptions["strServer"] = "servername"
$hashOptions["strDatabase"] = "DB"
$hashOptions["strUser"] = "user"
$hashOptions["strPassword"] = "pass"
$hashOptions["strQuery"] = $query
$dtResult = executeMYSQLQuery($hashOptions)
$OU = "OU=Class Group,DC=company,DC=internal"
ForEach ($row in $dtResult){
$result = $row.GroupName
$resmember = $row.Members
$out_file = "C:\Scripts\Users.txt"
$studentOU = "OU=Users,OU=CHS,OU=Est,DC=Company,DC=internal"
$resmember | %{$_.Split(',')} | %{
If(Get-QADUser -PageSize 1000 -DontUseDefaultIncludedProperties -SizeLimit 0 -SearchRoot "$studentOU" -LdapFilter "(name=$_)")
{Add-ADGroupMember -Identity $result -Members "$($_)"
[System.GC]::Collect()
}
Else
{"$_" | out-file "$out_file" -append}
}}
[System.GC]::Collect()
}
$dtResult = $Null
}
Addmembers
これは、コードがすべての DB を取得し、それをメモリに保持しようとしたためだと思います。ForEach-Object はメモリがいっぱいになるのを防ぐと思いますが、それはロジックをサポートしていないようです。[System.GC]::Collect() を IF ステートメント内に追加しようとしましたが、RAM の増加を止めることはできません。