我对Powershell中的脚本编程是相当陌生的,并且曾经面对过这个任务。显示标识特定OU中的服务器的表,并确保它们是正确组的成员。脚本中也不应该有任何“硬编码”(即服务器名称或组名称)。基本上,该脚本应该评估服务器的名称,并确定它应该是哪个组的成员。如果它在正确的组中,则将其打印到显示正确的表中,如果不正确,则也将其打印到表中,指示它在错误的组中。
我开始使用Quest ActiveRoles插件,并确定我需要使用嵌套循环。我将首先遍历安全组,并根据该组评估每个服务器,看看它是否是成员。然后,我将计算机和组添加到自定义PSObject中,并能够将其打印出来作为正确答案。这部分工作得很好。当我试图打印出不正确的答案时,我会遇到问题。由于我构造循环的方式,大多数服务器将不在所选的组中,因此它们都将返回为不正确。
我的问题是,通过循环这些信息并将服务器名称与组成员身份进行比较,并且仍然能够显示哪些属于正确的组,哪些属于不正确的组,最好的方法是什么?我的代码如下。
#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)
发布于 2013-12-16 21:00:38
与其自己尝试连接,不如考虑使用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
当然,您可以遍历每个结果以将它们添加到一个列表中,就像您当前所做的那样。
https://stackoverflow.com/questions/20620261
复制相似问题