【问题标题】:Active Directory Group Members - PowershellActive Directory 组成员 - Powershell
【发布时间】:2013-12-16 20:28:48
【问题描述】:

我对 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)

【问题讨论】:

  • 您使用的是哪个版本的 PowerShell?您使用 Quest 而不是 ActiveDirectory 模块有什么原因吗?

标签: powershell active-directory


【解决方案1】:

与其尝试自己进行连接,不如考虑使用 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

当然,您可以像当前所做的那样循环遍历每个结果以将它们放到一个列表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多