2014-10-07 60 views
0

我的任務是確保所有管理員都具有正確的權限。我們有幾個管理員組,所以我會做的是使用powershell和dsquery從這些組中拉出所有用戶並將其放入數組中。用戶可能在多個管理員組中,因此我只希望每個用戶中的一個。然後我會使用dsget獲取所有用戶的更多信息並將其輸出到css。我堅持這樣一個事實,即我無法得到 - 容納正確的工作。在我擁有這個用戶列表之後,應該將海量前進。PowerShell/dsquery組中的用戶列表中的用戶與獨特用戶組成一個陣列

$admingroups = @("Group 1","Group 2","Group 3","Group 4") 
$adminnames = @() 

foreach ($adming in $admingroups) { 
    $admin = (&dsquery group -samid $adming -limit 0 | dsget group -members -expand) 
    if ($adminnames -contains $admin) { 
    write-host "Dupes" 
    }Else{ 
    $adminnames += $admin 
    } 
} 

回答

0

所以,你想看看,爲每個管理員用戶,他們是什麼管理組?如果您正在通過查詢每個管理員組來檢索您的管理員用戶的總體列表,那麼您將如何刪除這些組織重複?

在這種情況下,問題是,你錯過了一個foreach循環:

$AdminGroups = @("Group 1","Group 2","Group 3","Group 4") 
$AdminNames = @() 

ForEach ($Group in $AdminGroups) { 
    $AdminsInGroup = @(dsquery group -samid $Group -limit 0 | dsget group -members -expand) 

    ForEach($Admin in $AdminsInGroup) { 
     if($AdminNames -contains $Admin) { 
      Write-Host "Dupes" 
     } else { 
      $AdminNames += $Admin 
     } 
    } 
} 

或者,選擇-對象具有 「-unique」 參數:

$AdminGroups = @("Group 1","Group 2","Group 3","Group 4") 
$AdminNames = @() 

ForEach ($Group in $AdminGroups) { 
    $AdminsInGroup = @(dsquery group -samid $Group -limit 0 | dsget group -members -expand) 

    $AdminNames += $AdminsInGroup 
} 

$AdminNames = @($AdminNames | Select -Unique) 
+0

謝謝!兩個都非常棒! – Tombomb 2014-10-08 18:14:11

+0

另外,考慮安裝遠程服務器管理工​​具,然後您可以導入ActiveDirectory模塊,並真正開始完成任務。我也是一個IT人員,每天都會使用它。鏈接: [下載鏈接](http://www.microsoft.com/en-us/download/details.aspx?id=7887)[信息鏈接](http://technet.microsoft.com/en-us /library/ee449475%28v=WS.10%29.aspx) – 2014-10-09 22:01:30

+0

@Matt,我的PowerShell 2.0沒有顯示任何這樣的需求:Get-Help Select -Full,它也不在3.0的文檔中:[Technet] (http://technet.microsoft.com/en-us/library/hh849895(v=wps.620).aspx)。 – 2014-10-12 02:31:16

0

我一直在看你的邏輯,不能把我的手指放在我認爲完全錯誤的東西上。它主要是你的名字varialble $admin-contains應該檢查一個元素是否是數組的一部分。來自about_Comparison_Operators

描述:包含運算符。講述的 參考值的集合是否包括測試值

但是你可以有兩種$adminnames$admin是數組。首先你的dsquery將返回並且DistinguishedName的數組。爲了你的邏輯工作,你將不得不循環每一個,以便-contains做你所期望的。

您是否需要使用dsquery才能獲取此信息?一些內置的cmdlet可以輕鬆應對。

$groups = @("group 1","group 2") 
$groups | ForEach-Object{Get-ADGroupMember -Identity $_} | Sort-Object -Unique | Select -ExpandProperty DistinguishedName 

如果你想使用dsquery我仍還在使用Sort-Object

foreach ($adming in $admingroups) { 
    $adminnames += (&dsquery group -samid $adming -limit 0 | dsget group -members -expand) 
} 
$adminnames | Sort-Object -Unique 

如果你關心重複類似於你已經有的東西,你可以只是比較計數。

$uniqueAdminNames = $adminnames | Sort-Object -Unique 
Write-Host "Ignored $($adminnames.Count - $uniqueAdminNames.Count) duplicate(s)" 
相關問題