4

特定の OU のメンバーを含むすべてのグループのリストを作成しようとしています。これを行うには、すべてのグループ名のリストを含むファイルを読み取り、get-ADGroupMember $groupName を使用して各グループのメンバーを見つけます。各メンバーの値を文字列に変換し、$member.indexOf("specific OU") と比較しています。問題は、$member[$i].indexOf("specific OU") を取得する方法がわからないことです。私のコードは以下です。

編集: for-each ループを使用すると、メンバーを適切にループできますが、重複を防ぐブレークを使用できません。

Import-Module ActiveDirectory
#declaring end result group array
$results = @()

#sets path for files
$pathName = $MyInvocation.MyCommand.Path
$pathLen = $pathName.LastIndexOf("\")
$pathStr = $PathName.Substring(0,$pathLen +1)
$APgroupFile = $pathStr + "APGroups.csv"
$groupFile = $pathStr + "GGroups.csv"

#gets the list of group names and loops through them
get-content $groupFile | foreach-object{
#sets all of the group names
#start of if1 
if($_.IndexOf("CN=") -ge 0){
$nameStart = $_.IndexOf("CN=")+3
$nameEnd = $_.indexOf(",")-$nameStart
$name = $_.substring($nameStart, $nameEnd)

#issue starts here
#goal is to find member of "specific OU".
#If found, add group to $results.  If not, go to next group
$members = get-ADGroupMember -Identity $name
if($members.length -gt 0){
$i=0
for($i=0; $i -le ($members.length -1); $i++){
#need to check users OU for specific OU.  If a user is member, save group to .txt.  If none are members, move to next group
    $OU = $members.toString()
    if($OU.indexOf("OU=specific OU") -ge 0){#start of if OU
    $results += New-Object psObject -Property @{'GroupName'=$name; 'Member'=$OU}
    break
    }#end if OU
    }#end for mem.length
}#end if mem.length
}#end if1
}#end foreach

$results | Export-Csv $APgroupFile -NoTypeInformation
4

2 に答える 2

4

これを試して:

Get-ADGroupMember -Identity $name |
Where-Object {$_.distinguishedName -like '*OU=specific OU*'}
于 2012-09-10T15:00:01.093 に答える
0

明示的に言及されていない考慮事項: ネストされた OU はどうですか? つまり、ターゲット OU 内のメンバーのみを検討していますか? それとも、あなたの目的のために、論理的にも 2 レベルまたは 3 レベルの深さの OU のメンバーが含まれますか? たとえば、「California」がターゲット OU の場合、California 直下のオブジェクトのみが必要ですか? それとも、サンフランシスコのすべてのメンバーとサンディエゴのすべてのメンバー (カリフォルニアのサブ OU) を結果セットに含めますか? どちらにしても:

Get-ADUser には、検索およびフィルター機能が含まれています - http://technet.microsoft.com/en-us/library/ee617241

  Get-ADuser -Filter {sAMAccountName -eq "jdoe"} -SearchBase "OU=IS,DC=foodomain,DC=com" -SearchScope SubTree

  Get-ADuser -Filter {sAMAccountName -eq "jdoe"} -SearchBase "OU=IS,DC=foodomain,DC=com" -SearchScope OneLevel

したがって、ここでのアプローチは、ターゲット OU でターゲット ユーザーを検索し、ユーザーごとに個別に検索することです。返された結果セットでそのユーザーを取得するかどうか。それはあなたがテストする条件である可能性があります。明らかに、「jdoe」を適切な変数に置き換えたいと思うでしょう (私は $members[i].SamAccountName がそこでトリックを行うと思います)。


Shay Levyの答えを見たところです。はるかに簡潔で、良い仕事です。明示的な検索ベースがないと、他の親 OU の下に埋もれている同じ名前のコンテナーにアクセスすることになる可能性がありますが、結果セットは同じである必要があります。たとえば、すべての都市に標準の "Office Staff" OU が含まれている場合、それぞれの都市は " OU=Office Staff " 式で検索されます。両方のアプローチを試して、パフォーマンスの違いをテストすることをお勧めします。それが同じなら、Shay Levy's の方が楽しく読めます。

于 2012-09-10T16:54:10.987 に答える