检查AD用户是否属于可能位于其子组中的AD组

时间:2014-03-06 07:07:13

标签: powershell command-line vbscript cmd

我想询问用户他是否属于该组,这里的问题是......有时很难确定它是否属于它的一部分,因为他可能处于组子组的多个级别。

示例,如果我想检查用户是否在“所有销售用户”中。 他可以在“所有销售用户”的子组中> “销售美国”> “销售SJ”> “Prod A”> “项目B”

问题是,我必须打开所有搜索他的子组。我怎么知道他是否是“所有销售用户”的一部分?如果查询可以显示层次结构,则为最佳。

我尝试了PowerShell,但它只显示了成员。不知道如何帮助解决这个问题。

2 个答案:

答案 0 :(得分:0)

递归Powershell实现,假设您安装了ActiveDirectory Powershell模块。它将为用户所属的所有组返回Common Name,包括嵌套,因此在您的示例中将返回所有5个组。

function findGroup($n){
    $g = Get-ADGroup $n;
    $parents = Get-ADGroup -Filter {Members -eq $g.DistinguishedName}
    if($parents -eq $null){
        return $g.Name;
    }
    else{
        $g.Name;
        $parents | % { findGroup $_ }
    }
}

利用第一个功能的第二个功能:

function findUsersGroup($userName){
    $u = (Get-ADUser $userName -Properties memberof).memberof
    $u | % { findGroup $_}
}

因此,如果您将上述2个功能粘贴到您的PowerShell窗口中,则可以运行

PS C:\> findUsersGroup raf

这将返回用户所属的组列表,包括层次结构:

insideinsidetopgroup
insidetopgroup
topgroup
othergroup

答案 1 :(得分:0)

您可以尝试LDAP with Powershell

$strFilter = "(&(memberOf:1.2.840.113556.1.4.1941:={0})(objectCategory=person)(objectClass=user)(sAMAccountName={1}))"

$objDomain = New-Object System.DirectoryServices.DirectoryEntry

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$objSearcher.SearchScope = "Subtree"

$colProplist = "name"
foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)}

$colResults = $objSearcher.FindAll()

foreach ($objResult in $colResults)
    {$objItem = $objResult.Properties; $objItem.name}

{0}是嵌套组,应该是专有名称

{1}是您想要的用户 sAMAccountName (您可以在(sAMAccountName={1})中使用除sAMAccountName之外的任何其他用户属性)