2012-08-16 47 views
0

我試圖通過NAS共享上的目錄/子目錄的廣泛結構遞歸地查找文件夾上的組及其可分辨名稱(DN)。內存被吞噬問題

我做的代碼和它的工作原理,但它是緩慢的,狼吞虎嚥的內存出於某種原因。

我在尋找幫助,瞭解我可能會做錯什麼,或者如果有更快/更少的內存密集型方式來做到這一點。

  • 看來它需要每一個$acct並創建$acctsQADObjectGet-QADObject放緩。

  • 我看到每個容器(目錄)8-10 $acct,並且需要大約5秒或更多來處理每個容器。

  • 看起來的$acct每次迭代緩存的東西,它不釋放,所以$acct每個迴路可以觀看內存增長0.02+ MB

  • 我是從$accts突然離開$acct並試圖迫使$acctsQADObject$null,試圖得到一些內存清除。但它似乎並沒有幫助。 $groups散列然後被帶到另一個函數來獲得每個組的用戶,但我認爲這很好。

注:Get-QADObject來自quest.com,和他們的論壇似乎很沉默,所以我希望能找到幫助這裏。

我到目前爲止的代碼:

$containers = @(Get-Item -Path $Path | ? {$_.psIscontainer}) 
    $containers += Get-ChildItem -Path $Path -Recurse | ? {$_.psIscontainer} 

    if ($containers -eq $null) {break} 
    while ($containers) { 
     $container,$containers = $containers 
     Write-Output "Container: " $container 
     $accts=$null 
     [email protected]() 
     $accts = @((Get-ACL $container.fullname).Access) 
     while ($accts) { 
      $acct,$accts = $accts 
      $acctsQADObject = $null 
      $acctsQADObject = Get-QADObject -PageSize 1000 -DontUseDefaultIncludedProperties -SizeLimit 0 -Identity ([string]$acct.IdentityReference) 
      if ($acctsQADObject.ObjectClass -contains 'group') { 
       $Name = $acctsQADObject.Name 
       $DN = $acctsQADObject.DN 
       $key = "$($Name)|$($DN)" 
       if (!$groups.ContainsKey($key) -and $key -notcontains "Group|Member") { 
        Write-Output "Found first reference to a group: $($DN) assigned to directory $container" 
        $msg += "Found first reference to a group: $($DN) assigned to directory $container `n" 
        $groups.add($key,$DN) 
       } 
      }       

     } 
    } 
+0

您是否處於鎖定QAD cmdlet的環境中?你有一臺2008R2服務器嗎?如果可以,我會用MS AD cmdlet重寫它。 – EBGreen 2012-08-16 14:06:14

+0

我在while($ accts)循環[System.GC] :: Collect()後添加了內存,但內存仍在爬行。 – archcutbank 2012-08-16 14:07:47

+0

EBGReen,你有一些代碼可以替代使用MS AD cmdlet的while($ accts)循環嗎?我在2008R2上,並未鎖定使用QAD cmdlet。 – archcutbank 2012-08-16 14:09:15

回答

0

爲什麼不使用Get-QADGroup代替Get-QADObject?這樣你保證得到一個組。然後,您可以從中取出DN屬性。我寫了一些對文件夾審計有用的代碼,這聽起來像是你正在做的事情。它可以在另一篇文章here中找到。要獲得組的成員,您可以使用Get-QADGroupMember $groupname -Indirect