2013-12-16 122 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 

你可以,当然,循环每个结果,让他们到一个列表,你正在做的目前。

相关问题