2011-11-08 9 views
10

Tôi đang cố liệt kê mọi người trong nhóm bảo mật trong thư mục hoạt động mà không sử dụng CmdLets trong PowerShell. Điều kỳ lạ với kịch bản của tôi là nó hoạt động nếu tôi liệt kê toàn bộ thư mục nhưng nếu tôi cố gắng và chỉ định với một truy vấn ldap những gì tôi muốn được liệt kê nó không hoạt động. Tôi biết truy vấn ldap của tôi là chính xác bởi vì tôi đã sử dụng nó trong một vbs tương tự và nó hoạt động. Các dòng nhận xét là nơi tôi đã cố gắng đưa vào truy vấn.Liệt kê người dùng trong nhóm quảng cáo đệ quy bằng tập lệnh powershell mà không cần CmdLets

$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

Tại sao bạn không thể sử dụng lệnh ghép ngắn? Điều đó giống như nói "Tôi muốn lập trình một cái gì đó trong C# mà không sử dụng phương pháp". – JNK

+0

Những người đang đề xuất tôi sẽ phải cài đặt và tôi muốn điều này chạy trên bất kỳ máy tính nào chỉ với tập lệnh. – yoyomommy

+0

CmdLets có sẵn với mô-đun thư mục hoạt động trong PowerShell 2.0. – JPBlanc

Trả lời

8

Đây là thứ hoạt động trong Active-Directory 2003 SP2 và 2008 R2. Tôi sử dụng ADSI và Microsoft LDAP_MATCHING_RULE_IN_CHAIN. Nó tìm kiếm đệ quy (nhưng trong một truy vấn) tất cả các người dùng từ một nhóm (cẩn thận nó trở lại người dùng từ nhóm bảo mật và phân phối)

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

để có danh sách đầy đủ người dùng, máy tính và nhóm sử dụng dòng này đã thay đổi: $ dsLookFor.Filter = "(& (thành viên: 1.2.840.113556.1.4.1941: = CN = sg01, OU = sg, DC = int, DC = io, DC = local) (objectCategory = *)) "; –

+0

Cả hai đều làm việc hoàn hảo nhưng điều này có nhiều chức năng hơn như những gì tôi đang tìm kiếm vì vậy tôi đã chọn này. Cảm ơn một tấn cho sự giúp đỡ của bạn! – yoyomommy

6

này sẽ nhận được tất cả các thành viên của nhóm quản trị miền, bao gồm các thành viên lồng nhau (yêu cầu .NET 3.5).

$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

Cả hai đều làm việc hoàn hảo nhưng thứ hai có nhiều chức năng hơn như những gì tôi đang tìm kiếm vì vậy tôi đã chọn một. Cảm ơn một tấn cho sự giúp đỡ của bạn! Xin lỗi tôi không thể cung cấp cho cả hai tín dụng của bạn ... – yoyomommy

+0

+1 Vì nó ngắn hơn tôi; o) – JPBlanc

+0

Không có vấn đề yoyomommy. @ JPBlanc cảm ơn vì đã bỏ phiếu. –

0

Vì vậy, miễn là bạn biết tên nhóm, bạn có thể chạy sau (xấu xí) quasi-one-liner:

## 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}} 

Cũng kể từ khi bạn hiếm khi làm một mà không có người kia, tôi cũng sẽ bao gồm các cách để liệt kê tất cả các nhóm cho một người sử dụng bằng cách sử dụng phương pháp tiếp cận cơ bản giống nhau:

## 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}} 

cả hai truy vấn tên miền hiện tại của bạn và không yêu cầu bất kỳ trình độ miền, cũng không đòi hỏi bất kỳ module hoặc libr thêm aries được cài đặt. Tôi cũng thấy mình làm việc trong một môi trường khá vani theo thời gian với các điều khoản tối thiểu, nơi tôi cần phải tìm kiếm thông qua AD, và tôi thấy hai lệnh này giúp tôi với điều đó khá một chút.