2011-11-08 2 views
10

PowerShell에서 CmdLets를 사용하지 않고 활성 디렉토리의 보안 그룹에있는 모든 사용자를 나열하려고합니다. 이상하게도 내 스크립트를 사용하면 전체 디렉토리를 나열하면 작동하지만 목록에 넣고 싶은 LDAP 쿼리를 지정하면 작동하지 않습니다. 나는 다른 비슷한 vbs에서 사용했기 때문에 나의 LDAP 쿼리가 정확하다는 것을 안다. 주석 처리 된 줄은 내가 쿼리에 넣으려고하는 곳입니다.CmdLets없이 powershell 스크립트를 사용하여 재귀 적으로 광고 그룹에 사용자 나열

$strFilter = "(&(objectCategory=person)(objectClass=user))" 
#$strFilter = "(&(objectCategory=person)(objectClass=user)(memberOf=CN=Common Name,OU=User Groups,...,DC=ad,DC=domain,DC=com))" #... is just left out part of query 

#$objDomain = New-Object System.DirectoryServices.DirectoryEntry 
$objDomain = New-Object System.DirectoryServices.DirectoryEntry("LDAP://CN=Common Name,OU=User Groups,...,DC=ad,DC=domain,DC=com") #... is just left out part of query 

$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} 
+2

왜 cmdlet을 사용할 수 없습니까? 마치 "메서드를 사용하지 않고 C#에서 무언가를 프로그램하고 싶다"는 말입니다. – JNK

+0

사람들은 내가 설치해야 할 것이라고 제안하고 나는이 스크립트를 모든 컴퓨터에서 실행하기를 원합니다. – yoyomommy

+0

CmdLets는 PowerShell 2.0의 활성 디렉토리 모듈과 함께 사용할 수 있습니다. – JPBlanc

답변

8

여기는 Active Directory 2003 SP2 및 2008 R2에서 작동하는 것입니다. 저는 ADSI와 Microsoft LDAP_MATCHING_RULE_IN_CHAIN을 사용합니다. 그것은 필요 (그룹에서 (그러나 하나 개의 쿼리에서) 재귀 적으로 모든 사용자를 검색

Clear-Host 
$dn = New-Object System.DirectoryServices.DirectoryEntry ("LDAP://WM2008R2ENT:389/dc=dom,dc=fr","[email protected]","PWD") 

# To find all the users member of groups "MonGrpPlusSec" : 
# Set the base to the groups container DN; for example root DN (dc=societe,dc=fr) 
# Set the scope to subtree 
# Use the following filter : 
# (member:1.2.840.113556.1.4.1941:=CN=MonGrpPlusSec,OU=ForUser1,DC=dom,DC=fr) 

$dsLookFor = new-object System.DirectoryServices.DirectorySearcher($dn) 
$dsLookFor.Filter = "(&(memberof:1.2.840.113556.1.4.1941:=CN=MonGrpPlusSec,OU=ForUser1,DC=dom,DC=fr)(objectCategory=user))"; 
$dsLookFor.SearchScope = "subtree"; 
$n = $dsLookFor.PropertiesToLoad.Add("cn"); 
$n = $dsLookFor.PropertiesToLoad.Add("distinguishedName"); 
$n = $dsLookFor.PropertiesToLoad.Add("sAMAccountName"); 

$lstUsr = $dsLookFor.findall() 
foreach ($usrTmp in $lstUsr) 
{ 
    Write-Host $usrTmp.Properties["samaccountname"] 
} 
+0

전체 사용자, 컴퓨터 및 그룹 목록을 사용하려면이 줄을 다음과 같이 변경하십시오. $ dsLookFor.Filter = "(& (memberof : 1.2.840.113556.1.4.1941 : = CN = sg01, OU = sg, DC = int, DC = io, DC = local) (objectCategory = *)) "; –

+0

이 두 제품 모두 완벽하게 작동했지만이 제품은 내가 원하는 제품과 같은 더 많은 기능을 갖추고 있으므로이 제품을 선택했습니다. 도와 주셔서 감사합니다. – yoyomommy

6

이 중첩 된 구성원을 포함하여 도메인 관리자 그룹의 모든 구성원을, 얻을 것이다 (이것은 보안 및 배포 그룹에서 사용자를 반환주의) .NET 3.5). 당신은 거의 다른 않고 하나를 수행하지 않기 때문에, 난 또한

## List Members in a Group 
$groupname = 'GroupNameHere' 
(New-Object System.DirectoryServices.DirectoryEntry((New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=Group)(name=$($groupname)))")).FindOne().GetDirectoryEntry().Path)).member | % { (New-Object System.DirectoryServices.DirectoryEntry("LDAP://"+$_)) } | Sort-Object sAMAccountName | SELECT @{name="User Name";expression={$_.Name}},@{name="User sAMAccountName";expression={$_.sAMAccountName}} 

:

$Recurse = $true 

Add-Type -AssemblyName System.DirectoryServices.AccountManagement 
$ct = [System.DirectoryServices.AccountManagement.ContextType]::Domain 
$group=[System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($ct,'Administrators') 
$group.GetMembers($Recurse) 
+0

이 두 가지 모두 완벽하게 작동했지만 두 번째 것은 내가 찾고있는 것과 같은 더 많은 기능을 가지고있어서 그 중 하나를 선택했습니다. 도와 주셔서 감사합니다. 죄송합니다. 두 분 모두에게 신용을 줄 수는 없습니다 ... – yoyomommy

+0

+1 내보다 짧기 때문에, o) – JPBlanc

+0

문제 없습니다. @ JPBlanc, 투표에 감사드립니다. –

0

그래서 당신이 그룹 이름을 알고, 다음 (추한) 준 한 줄을 실행할 수 있습니다 이들 모두는 현재 도메인을 쿼리하고 모든 도메인 자격을 필요로하지 않는 없으며을

## List Groups for a Username 
$username = 'UsernameHere' 
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($username)))")).FindOne().GetDirectoryEntry().memberOf | % { (New-Object System.DirectoryServices.DirectoryEntry("LDAP://"+$_)) } | Sort-Object sAMAccountName | SELECT @{name="Group Name";expression={$_.Name}},@{name="Group sAMAccountName";expression={$_.sAMAccountName}} 

어떤 모듈 또는 추가 LIBR이 필요합니다 같은 기본적인 접근 방식을 사용하여 사용자에 대한 모든 그룹을 나열하는 방법을 포함하는 것 양자리가 설치됩니다. 또한 필자는 AD를 검색해야하는 최소한의 권한으로 꽤 바닐라 환경에서 일하고 있음을 알았습니다.이 두 명령이 저를 상당히 도와줍니다.

관련 문제