2017-04-14 25 views
-1

このスクリプトは、あるドメインから別のドメインへの移行を支援するためのものです。私はすべてのADセキュリティグループを探しています。そして、各グループのメンバーを引っ張り、グループの名前とそのグループのメンバーでテキストファイルを作成します。PowerShellの最後のforeachループは失敗しますが、前のループは正常に動作します

次に、各グループのユーザーMailNickNameフィールドに情報を含めるための新しいテキストファイルを作成する場合は、これをNID(新しいID)といいます。私はこのMailNickNameを使って新しいドメインにNIDを保存するので、を新しいドメインの適切なグループにプッシュできます。

以下のスクリプトでは、最後のforeachループを除いてすべてが機能しますが、その理由はわかりません。それは正しいと私は答えをインターネットで検索したが、これは動作しない理由はない。

私はエラーは発生しませんが、$b変数は$iGroup変数と同じ値になります。 NIDの新しいテキストファイルも作成されません。 foreach($b in $iGroup)は、単一の項目をループあなたの

$iScript = "GetADGroups" 
$StrPath = "C:\Temp\$iScript" 
$StrFile = "$StrPath\$iScript.txt" 
if(!(Test-Path $StrPath)){New-Item -ItemType directory -Path $StrPath} 

$OU1 = "OU=Users,OU=OC,DC=domain,DC=com" 
$OU2 = "OU=Users,OU=AMC,DC=domain,DC=com" 
$OU3 = "OU=Users,OU=FI,DC=domain,DC=com" 

Get-ADGroup -Filter 'GroupCategory -eq "Security"' -SearchBase $OU1 | ft name -HideTableHeaders | Out-File "$strFile" 
Get-ADGroup -Filter 'GroupCategory -eq "Security"' -SearchBase $OU2 | ft name -HideTableHeaders | Out-File "$StrFile" -Append 
Get-ADGroup -Filter 'GroupCategory -eq "Security"' -SearchBase $OU3 | ft name -HideTableHeaders | Out-File "$StrFile" -Append 

(GC $StrFile) | ? {$_.trim() -ne ""} | Set-Content $StrFile 
$Groups = (GC $StrFile) 
$Groups | foreach{$_.TrimEnd()} | Set-Content $StrFile 
$Groups = (GC $StrFile) 

foreach($Member in $Groups){ 
    foreach($a in $Member){ 
     if(Test-Path "$StrPath\$a.Members.txt"){Remove-Item -Path "$StrPath\$a.Members.txt" -Force} 
     Write-Host $iMember 
     $iMember = Get-ADGroupMember "$a" | Select-Object sAMAccountName 
     $iMember | ft -HideTableHeaders | Out-File "$StrPath\$a.Members.txt" -Append 
     (GC "$StrPath\$a.Members.txt") | ? {$_.trim() -ne ""} | set-content "$StrPath\$a.Members.txt" 
     (GC "$StrPath\$a.Members.txt") | foreach{$_.TrimEnd()} | Set-Content "$StrPath\$a.Members.txt" 
     GCI "$StrPath\$a.Members.txt" | where {$_.Length -lt 1} | Remove-Item 
     } 
    } 

$GroupName = (GCI "$StrPath\*.Members.txt" -Name) 
foreach($iGroup in $GroupName){ 
    foreach($b in $iGroup){ 
     if(Test-Path "$StrPath\$b.NID.txt"){Remove-Item -Path "$StrPath\$b.NID.txt" -Force} 
     Write-Host $b 
     Get-ADUser -filter {sAMAccountName -eq "$b"} -Properties MailNickName | Select-Object MailNickName | Set-Content "$StrPath\$b.NID.txt" 
     } 
    } 
+0

ソース変数(または少なくとも$ iGroup)をテキストファイルに追加して、あなたが始めているものを視覚的に調べます。私の経験では、このようなテキストの奇妙さは、通常、予期せぬ値によるものです。そうでない場合は、この最後のループセットへの入力は何ですか? –

答えて

1
  1. 、彼らは常に等しくなります。デモ:

    $GroupName = "Group1.Members.txt","Group2.Members.txt","Group3.Members.txt" 
    foreach($iGroup in $GroupName){ 
        foreach($b in $iGroup){ 
         Write-Host $b 
        } 
    } 
    Group1.Members.txt 
    Group2.Members.txt 
    Group3.Members.txt 
    

    確かにファイルを読みたくないですか? Ex。オブジェクトをエクスポートおよびインポートする場合

    foreach($Group in (GCI "$StrPath\*.Members.txt")){ 
        Write-Host $Group.Name 
        foreach($User in (Get-Content -Path $Group.FullName)){ 
         Write-Host $User 
        } 
    } 
    
  2. 、あなたはめったに彼らは、コンソール内のデータを表示し、オブジェクトを破壊するために意図されているようFormat-* -cmdletsを使いたいん。このため、毎回テキストファイルをクリーンアップする必要があります。 Export-CSVImport-CSVを使用するCSVファイル、またはカスタムテキストファイルを使用することを強くお勧めします(その場合は、Select-Object -ExpandProperty Nameを使用してgroupnameのみを表示してください)。

  3. ファイルの読み取り、変更、削除に時間を浪費しています。私はこのような何かにそれを書き換えます:

    $iScript = "GetADGroups" 
    $StrPath = "C:\Temp\$iScript" 
    $StrFile = "$StrPath\$iScript.txt" 
    #-Force to also create missing parents-folders 
    if(!(Test-Path $StrPath)){New-Item -ItemType Directory -Path $StrPath -Force} 
    
    $OUs = "OU=Users,OU=OC,DC=domain,DC=com", "OU=Users,OU=AMC,DC=domain,DC=com", "OU=Users,OU=FI,DC=domain,DC=com" 
    $Groups = $OUs | Foreach-Object { Get-ADGroup -Filter 'GroupCategory -eq "Security"' -SearchBase $_ } 
    #Save groupnames to file if you need them 
    $Groups | Select-Object -ExpandProperty Name | Set-Content -Path $StrFile 
    
    foreach($group in $Groups){ 
        Write-Host $group 
        $members = @(Get-ADGroupMember -Identity $group) 
    
        #If group contains members 
        if($members.Count -gt 0) { 
         #Create list of members 
         $members | Select-Object -ExpandProperty sAMAccountName | Set-Content -Path "$StrPath\$group.Members.txt" 
    
         #Create list with new IDs (is the other list necessary?) 
         $members | Get-ADUser -Properties MailNickName | Select-Object -ExpandProperty MailNickName | Set-Content -Path "$StrPath\$group.NID.txt" 
        } 
    } 
    

    、好ましくは、ユーザ名とmailnicknameは、単一の行を使用してリンクされている単一のCSVファイルにメンバーとNID-リストをマージします。例:

    #If group contains members 
    if($members.Count -gt 0) { 
        #Create csv-list of members with current username (samaccountname) and new id (mailnickname) 
        $members | Get-ADUser -Properties MailNickName | Select-Object -Property sAMAccountName, MailNickName | Export-CSV -Path "$StrPath\$group.csv" -NoTypeInformation 
    } 
    

    さらに1ステップ進んで、すべてのグループメンバーシップを持つ1つのcsvファイルがあります。

    $iScript = "GetADGroups" 
    $StrPath = "C:\Temp\$iScript" 
    $StrFile = "$StrPath\$iScript.txt" 
    
    $OUs = "OU=Users,OU=OC,DC=domain,DC=com", "OU=Users,OU=AMC,DC=domain,DC=com", "OU=Users,OU=FI,DC=domain,DC=com" 
    $Groups = $OUs | Foreach-Object { Get-ADGroup -Filter 'GroupCategory -eq "Security"' -SearchBase $_ } 
    #Save groupnames to file if you need them (if you're migrating empty groups) 
    $Groups | Select-Object -ExpandProperty Name | Set-Content -Path $StrFile 
    
    $Groups | Foreach-Object { 
        $group = $_ 
        Write-Host $group 
        Get-ADGroupMember -Identity $group | 
        #Getting ADUser object to get missing property 
        Get-ADUser -Properties MailNickName | 
        Select-Object -Property @{n="Group";e={$group}}, sAMAccountName, MailNickName 
    } | Export-CSV -Path "$StrPath\GroupMembers.csv" -NoTypeInformation 
    

    あなたのCSVはどの簡単に、インポートする新しいグループにメンバーを追加するときImport-CSVと後でなどをグループ化することができ、次のようになります。私は私は書くだろうと思う

    Group,sAMAccountName,MailNickName 
    Group1,user1,mailnickforuser1 
    Group2,user1,mailnickforuser1 
    Group2,user2,mailnickforuser2 
    
+0

あなたはそれをずっと簡単にしました。最後のCSVファイルが好きですが、Export-CSV行に「-append」を追加する必要がありました。それ以外の場合は、エントリグループが1つだけになりました。 – Jas

+0

foreach-loopをパイプラインに変更するのを忘れたforeach。今すぐcsv-solutionを更新しました。:-) –

+0

私はいくつかのグループにいくつかのエラーがあると思いますので、 -ErrorAction SilentlyContinue をGet-ADGroupMember行とGet-ADUser行に追加しました。 – Jas

関連する問題