使用powershell检查Win32_group成员资格

时间:2014-10-15 13:20:38

标签: windows winapi powershell

我想知道交付用户名的用户是否是交付组名的组的成员。

$u = Get-WmiObject -Class Win32_UserAccount -Filter "Name='$username'"
$g = Get-WmiObject -Class Win32_Group -Filter "Name='$groupname'"

所以我得到了两个带有属性SID的对象。

如何检查用户$u是否为$g组成员?

1 个答案:

答案 0 :(得分:1)

您可以使用Associators查询(example)执行此操作。这是出了名的慢,但工作。

$u = Get-WmiObject -Class Win32_UserAccount -Filter "Name='user'"
$group = Get-WmiObject -Class Win32_Group -Filter "Name='group'" | Select-Object -ExpandProperty Caption

$u | foreach { 
    $query = “Associators Of {Win32_UserAccount.Domain='” `
    + $_.Domain + “',Name='” + $_.Name `
     + “'} WHERE AssocClass=Win32_GroupUser”    
    $memberOf = Get-WmiObject -Query $query | 
    select -ExpandProperty Caption

    If($memberOf -contains $group){
        Write-Host "$($_.Name) is a member of $group"
    } Else {
        Write-Host "$($_.Name) is not a member of $group"
    }
}

获取您正在寻找的用途并将您正在检查以确定用户是否是其成员。虽然u$应该只有一个用户,但它仍然是一个拥有一个成员的集合。将其封装到ForEach-Object并构建Associators查询。执行查询并返回所有组标题(domain \ groupname)。由于$memberof是一个数组,我们可以使用-contains来查看您要查找的组是否存在。

<强>替代地

如果您有权访问AD cmdlet并运行以下

,则可以使用它
(Get-ADUser $user -Properties memberof | Select-Object -ExpandProperty memberof) -contains (Get-ADGroup -Identity $group)

上述内容将返回TrueFalse。您可以使用import-module activedirectory

安装广告cmdlet

继续测试

OpenLDAP应该从我收集的内容中支持这一点,它比之前的WMI快得多。

$search = [adsisearcher]"(&(objectcategory=user)(Name=userFullName))"
$userLDAP = $search.FindOne().Path
$userMembers = ([ADSI]$userLDAP).memberof

$search = [adsisearcher]"(&(objectcategory=group)(Name=groupname))" 
$group = ($search.FindOne().Path) -replace "LDAP://"

$userMembers -contains $group

很抱歉,因为我无法访问OpenLDAP进行测试。搜索用户并将MemberOf设为$userMembers。然后将该组加入$group。需要从字符串中删除LDAP前缀。然后再做一次-Contains