2013-12-16 182 views
0

我對Powershell中的腳本相當陌生,並且已經面對這個任務。顯示標識特定OU中的服務器的表格,並確保它們是正確組的成員。應該沒有任何「硬編碼」到腳本中(即服務器名稱或組名稱)。實質上,腳本應評估服務器的名稱並確定它應該是哪個組。如果它位於正確的組中,請將其打印到顯示正確的表格中,但如果不正確,也將其打印到表格中,以指示它在錯誤的組中。
我開始使用Quest ActiveRoles插件並確定我需要使用嵌套循環。我首先會遍歷安全組並評估每個服務器對該組,以查看它是否爲成員。然後我將計算機和組添加到一個自定義的PSObject中,並能夠將其打印出來作爲正確的答案。這部分工作正常。當我嘗試打印出不正確的答案時,我遇到了問題。由於我具有循環結構的方式,大多數服務器將不在選定組中,因此它們都會返回爲不正確。
我的問題是,循環這些信息並將服務器名稱與組成員身份進行比較並仍然能夠顯示哪些組件處於正確組以及哪些組件處於錯誤組中的最佳方法是什麼。我的代碼如下。
Active Directory組成員 - Powershell

#Load Quest Active Roles Snapin 
Add-PSSnapin quest.activeroles.admanagement 

#Load Active Directory module 
Import-Module ActiveDirectory 

#Variables 
$AccelGroup = Get-QADGroup -SearchRoot 'lumosnet.com/Centrify/Role Groups' -GroupType  'Security' | where {$_.name -like "* Servers"} 
$AccelComputer = Get-QADComputer -SearchRoot 'lumosnet.com/Centrify/servers' 
$report = @() 

$AccelGroup | foreach{$ADN=$_.DN 
    $AccelComputer | foreach{$AMember=$_.memberof 
     $AComp=$_.name 

     If($AMember -like $ADN) 
     { 
      $ReportObj = New-Object PSObject 
      $ReportObj | Add-Member -MemberType NoteProperty -Name Computer_Name -Value  $AComp       
      $ReportObj | Add-Member -MemberType NoteProperty -Name Group_Name -Value  $($AMember -replace '^CN=([^,]+),OU=.+$','$1') 
      $ReportObj | Add-Member -MemberType NoteProperty -Name Correct? -Value "Correct" 
      $report += $ReportObj 
     } 
     Else 
     { 

     } 
    }  
} 

write-host ($report | FT -Autosize | Out-String) 
+0

您使用的是什麼版本的PowerShell?您是否有使用Quest而不是ActiveDirectory模塊的原因? – Simon

回答

0

,而不是試圖做自己的加盟,可以考慮使用LDAP查詢來獲取組中的服務器,然後又找回那些不在組。它仍然可能會落得簡單:

$ouPath = "LDAP://OU=Database,OU=Domain Servers,DC=EXAMPLE,DC=LOCAL" 
$groupPath = "CN=ITT Testing Servers,OU=Domain Servers,DC=EXAMPLE,DC=LOCAL" 

$correctFilter = ("(&(objectClass=computer)(memberof={0}))" -f $groupPath) 
$incorrectFilter = ("(&(objectClass=computer)(!(memberof={0})))" -f $groupPath) 

# set up the searcher 
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher 
$objSearcher.SearchRoot = $ouPath 
$objSearcher.PageSize = 1000 
$objSearcher.SearchScope = "Subtree" 
@("name","operatingSystem","lastLogonTimestamp") | %{ $unused = $objSearcher.PropertiesToLoad.Add($_) } 

# retrieve the correct items 
$objSearcher.Filter = $correctFilter 

Write-Host "Servers correctly in group" 
$goodItems = $objSearcher.FindAll() 
$goodItems | %{ New-Object PSObject -Property $_.Properties } | ft name,operatingsystem,lastLogonTimestamp 

# retrieve the bad items 
$objSearcher.Filter = $incorrectFilter 

Write-Host "Servers in wrong group" 
$badItems = $objSearcher.FindAll() 
$badItems | %{ New-Object PSObject -Property $_.Properties } | ft name,operatingsystem,lastLogonTimestamp 

你可以,當然,循環每個結果,讓他們到一個列表,你正在做的目前。

相關問題