次のコードは、自分の環境内のすべてのコントローラにクエリを送信し、最新のログインタイムスタンプを取得していることを確認します。それは私が働いている奇妙なユーザーのためのデータを取得するのに最適です。しかし、私はADで800人以上のユーザーを評価する必要があることを見出しています。 これは1.5GBを食べてから終了し、メモリ不足のエラーでスクリプトをクラッシュさせます。関数が終了した後にメモリを再利用する方法やガベージコレクションを強制する方法はありますか?私は可変変数や他のバリアントを削除しようとしました。私は時々システムのガベージコレクションを無駄にしようとしました。複数のユーザーの最後のログオンタイムスタンプを取得
私の推測はすべてのADクエリです。私が完了したら、それらをどう対処するかわかりません。
この関数の呼び出しは、関数呼び出しの前にプルしたリストから各ユーザーを送信しているforeachループの内部からのものです。私が得ることができる助けのために前もってありがとう。
$ domain変数、ちょうどそれが "example.contoso.ca"
function getDateTimeStamp
{
param
(
[string]$userID,
[string]$domain,
[string]$attribute #this is an AD attribute in this case i used "lastlogon"
)
$domainSuffix = '*.'+$domain
$myForest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
$domaincontrollers = $myForest.Sites | % { $_.Servers } | Select-Object Name | Where-Object Name -like $domainSuffix
$realUserDate = $null
foreach ($domainController in $domainControllers)
{
$userDateTime = Get-ADUser -Identity $userID -Properties $attribute -Server $domainController.Name
$userLastDateTime = $userDateTime.$attribute
if($userLastDateTime -eq $null){$userLastDateTime = 0}
elseif($userLastDateTime -eq 9223372036854775807){$userLastDateTime = 0}
if($userLastDateTime -is 'DateTime'){$tempUserDate = get-date -Date ($userLastDateTime)}
else{$tempUserDate = [DateTime]::FromFileTime([Int64]::Parse($userLastDateTime))}
if ($realUserDate -le $tempUserDate){$realUserDate = $tempUserDate}
}
return $realUserDate
}
ここに私の答えを参照してくださいが、foreachの-オブジェクトを試してみてください http://superuser.com/questions/675484/why-does-foreach-object-behave-differently-when-called-as-foreach –
I foreachを試しました($ x $ items) と私は$ items | foreach-object {} もリストの中で働いていませんでした。 – icomeinpieces
'$ attribute'をどこで定義したかわかりません。 '$ attribute'にLastLogonDateを使うと、' [Int64] 'を' [DateTime] 'に変換する必要はありません。また、正確なLastLogonが必要ですか、LastLogonTimestampを使用できますか?それは複製され、私が信じる11日以内に正確です。 – TheMadTechnician