我对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)
答案 0 :(得分: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
当然,您可以循环遍历每个结果,以便将它们转换为您当前正在执行的单个列表。