2017-06-22 37 views
0

我有以下foreach塊,它循環顯示Get-ACL的結果,並將路徑,用戶名,權限等打印爲CSV報告。嵌套的Foreach不會將變量返回?

可變$groups被另一腳本中定義:

. C:\Powershell\Get-LocalGroup.ps1 
$groups = Get-LocalGroup -Computername $computerName 

下面是主要的foreach塊:

foreach ($u in $access.Access) { 

    if ($u.IdentityReference -like "$domain") { 
     Try { 
      [String]$uIdent = $u.IdentityReference 
      $displayName = get-aduser $uIdent.split("\")[1] -Properties DisplayName | Select-Object DisplayName 
      $user = "$($displayName.DisplayName) ($MUDID)" 
     } 
     Catch { 
      $user = "$($u.IdentityReference) (User not found)" 
     } 

    } 
    elseif ($u.IdentityReference -like "S-*") { 
     #PROBLEM STARTS HERE 
     write-host "SID" 
     foreach ($g in $groups) { 
      if ($g.SID -like $u.IdentityReference) { 
       Write-Host $u.IdentityReference  
       Write-Host $g.SID 
       Write-Host $g.Name 
       $userSID = $g.Name 

      } 
      else { 
       $userSID = $u.IdentityReference 
      } 
     } 
     $user = $userSID 
     Write-Host "User: $user" 
    } 
    else { 
     $user = $u.IdentityReference 
    } 
} 

代碼工作幾乎完美,但它似乎拒絕通過以下變量退出foreach:

$userSID = $g.Name 

由於您ca n的距離(放置只測試...我發誓)寫主機事件此示例輸出中看到:

SID 
S-1-5-21-4175155190-227829953-2793635334-1036 
S-1-5-21-4175155190-227829953-2793635334-1036 
AUK-PH-Distribution-Depart 
User: S-1-5-21-4175155190-227829953-2793635334-1036 

我認爲這個問題是作用域,但我從來沒有碰到這一點,所以我不確定如何處理它。任何人都可以指出我在這裏做錯了嗎?

+0

你有沒有試過在foreach之前定義'$ userSID'? '#PROBLEM從這裏開始$ userSID =''' –

+0

不能肯定地說,但我高度懷疑它與第一行一致:if($ u.IdentityReference-like「$ domain」)。類似的運算符做一個通配符匹配,除非你包含一些通配符(例如「$ domain \ *」,它將會完成匹配。 – mjolinor

+0

如果我在foreach之前定義了'$ userSID ='test'',它仍然 –

回答

1

您的foreach循環僅有效地返回$Groups中最後一個元素的評估結果。它正在爲每個組更新$UserSID,但它也會更新它的最後一個。

我相信你會需要像這樣:

$UserSID = $u.IdentityReference 
$G = $Groups | where SID -like $u.IdentityReference 
if ($G) {$UserSID = $G.Name} 

你事先指定的默認值。您嘗試使用此類SID($G =...)查找組,如果找到它,則將其名稱指定給您的變量。

+0

我明白了......現在你有理由解釋說,foreach只是循環遍歷,而不是我想象的那樣。星期一之前我不會回來工作,但期待這可能是正確的解決方案。我會檢查出來,然後標記回答它是否指向正確的方向。 –

+0

經過測試,它工作完美。謝謝您的幫助。 –