2016-11-22 1 views
0

En cours de traitement sur un script PowerShell pour un système d'audit de coffre de données/sécurité.Expanding MemberOf

J'ai actuellement quelques difficultés avec le script ci-dessous

$table_user = @() 
$record_user = [ordered]@{ 
    "ObjectGUID"   = "" 
    "SamAccountName"  = "" 
    "Name"    = "" 
    "Surname"   = "" 
    "GivenName"   = "" 
    "Created"   = "" 
    "Modified"   = "" 
    "LastLogon"   = "" 
    "Enabled"   = "" 
    "Office"    = "" 
    "Company"   = "" 
    "Department"   = "" 
    "MemberOf"   = "" 
    "HomeDirectory"  = "" 
} 
$Users = Get-AdUser -Filter * -Properties * | 
     select ObjectGUID, SamAccountName, Name, Surname, GivenName, 
       @{Name='Created';Expression={$_.Created.ToString("yyyy\/MM\/dd HH:mm:ss")}}, 
       @{Name='Modified';Expression={$_.Modified.ToString("yyyy\/MM\/dd HH:mm:ss")}}, 
       @{Name="LastLogon";Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp).ToString('yyyy\/MM\/dd HH:mm:ss')}}, 
       Enabled, Office, Company, Department, MemberOf, HomeDirectory 

foreach ($user in $users) { 
    $Record_User."ObjectGUID"  = $User.ObjectGUID 
    $Record_User."SamAccountName" = $User.SamAccountName 
    $Record_User."Name"   = $User.Name 
    $Record_User."Surname"  = $User.Surname 
    $Record_User."GivenName"  = $User.GivenName 
    $Record_User."Created"  = $User.Created 
    $Record_User."Modified"  = $User.Modified 
    $Record_User."LastLogon"  = $User.LastLogon 
    $Record_User."Enabled"  = $User.Enabled 
    $Record_User."Office"   = $User.Office 
    $Record_User."Company"  = $User.Company 
    $Record_User."Department"  = $User.Department 
    $Record_User."MemberOf"  = $User.MemberOf 
    $Record_User."HomeDirectory" = $User.HomeDirectory 

    $objRecord = New-Object PSObject -Property $Record_User 
    $table_User += $objRecord 
} 

J'espère avoir chaque rangée contiennent une MemberOf unique .; par exemple

EXAMPLE OUTPUT

Quelqu'un pourrait me aider à la façon de séparer si chaque groupe unique est sur une ligne distincte lors de l'exportation des groupes MemberOf?

Répondre

3

Utilisez une boucle imbriquée

ForEach ($user in $users) 
{ 
    ForEach ($group in $user.memberOf) 
    { 
     # your code to build a CSV row here 
    } 
} 

NB. $table_User += $objRecord est horriblement lent, il fait des copies de mémoire de l'ensemble du tableau chaque fois que vous ajoutez quelque chose - de sorte qu'il devient plus lent et plus lent et plus lent. Utilisation:

$table_User = foreach (...) {} 

syntaxe, pour rassembler la sortie d'une boucle foreach.

1

pipe votre sélection dans un ForEach-Object et dupliquer les objets pour chaque entrée MemberOf avec une boucle imbriquée tout en remplaçant la propriété MemberOf par un calculated property.

$Users = Get-AdUser -Filter * -Properties * | 
     select ... | 
     ForEach-Object { 
      if ($_.MemberOf) { 
      foreach ($member in $_.MemberOf) { 
       $_ | Select-Object -Property *,@{n='MemberOf';e={$member}} -Exclude MemberOf 
      } 
      } else { 
      $_ # pass object without memberships as-is 
      } 
     }