2014-10-15 2 views
0

사용자 이름이 전달되는 사용자가 그룹 이름이 전달되는 그룹의 멤버인지 알고 싶습니다.powershell을 사용하여 Win32_group 멤버쉽을 확인하십시오.

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

그래서 나는 SID 속성을 가진 두 개의 객체를 얻습니다.

사용자 $u이 (가) 그룹 $g의 회원인지 어떻게 확인할 수 있습니까?

+0

'activedirectory' 모듈에 접근 할 수 있습니까? 'Get-Aduser -memberof'를 사용하여이 정보를 얻을 수 있습니다. – Matt

+0

광고 모듈에 액세스 할 수 없다고 생각합니다. –

+0

내 대답은 당신을 도울 수 있습니다. – Matt

답변

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) 

은 위의 True 또는 False를 반환합니다 실행할 수 있습니다. 당신은

OpenLDAP를 내가 수집 것과이를 지원해야 import-module activedirectory

계속 테스트를 사용하여 광고 cmdlet을 설치하고 훨씬 빠르게 이전 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을 다시하십시오.

+0

나는 다음의 코드를 시도해 보았다. (매우 천천히 물론 ...)'$ g.GetRelated ('Win32_UserAccount')'. 예, 실제로 작동하지만 이것은 순전히 느림입니다 !!! (1000 개의 계정과 같은 것이 있습니다) –

+0

'[adsi] '를 사용하는 솔루션이 더 빠를 지 확인하고 있습니다. @MUYBelgium – Matt

+0

사용자가 AD가 아니라 OpenLDAP에 저장됩니다. 개체 [adsi]에 문제가 있습니까? –

관련 문제