J'essaie d'utiliser PowerShell pour cracher un fichier csv avec les colonnes suivantes: nom, nom d'utilisateur, nom de groupe, activé

J'y suis presque, la seule étape qui me manque est de savoir comment marquer les utilisateurs comme activés ou non. Par exemple, cela fonctionne bien:

Import-Module ActiveDirectory

$Groups = (Get-AdGroup -filter * | Where {$_.name -like "**"} | select name -ExpandProperty name)

$Table = @()

$Record = @{
  "Group Name" = ""
  "Name" = ""
  "Username" = ""
}


Foreach ($Group in $Groups) {

  $Arrayofmembers = Get-ADGroupMember -identity $Group -recursive | select name,samaccountname

  foreach ($Member in $Arrayofmembers) {
    $Record."Group Name" = $Group
    $Record."Name" = $Member.name
    $Record."UserName" = $Member.samaccountname
    $objRecord = New-Object PSObject -property $Record
    $Table += $objrecord

  }
}

$Table | export-csv "C:\temp\SecurityGroups.csv" -NoTypeInformation

Si j'essaie d'ajouter une recherche supplémentaire (assez peu pratique certes) par boucle pour gifler le statut "Enabled" des utilisateurs, cette colonne reste juste vide:

Import-Module ActiveDirectory

$Groups = (Get-AdGroup -filter * | Where {$_.name -like "**"} | select name -ExpandProperty name)

$Table = @()

$Record = @{
  "Group Name" = ""
  "Name" = ""
  "Username" = ""
  "Enabled" = ""
}


Foreach ($Group in $Groups) {

  $Arrayofmembers = Get-ADGroupMember -identity $Group -recursive | select name,samaccountname

  foreach ($Member in $Arrayofmembers) {
    $Temprecord = Get-ADUser -Filter 'samaccountname -like "$Member.samaccountname"'
    $Record."Enabled" = $Temprecord.Enabled
    $Record."Group Name" = $Group
    $Record."Name" = $Member.name
    $Record."UserName" = $Member.samaccountname
    $objRecord = New-Object PSObject -property $Record
    $Table += $objrecord

  }
}

$Table | export-csv "C:\temp\SecurityGroups.csv" -NoTypeInformation

Si je devais deviner, c'est un problème avec la ligne:

$Temprecord = Get-ADUser -Filter 'samaccountname -like "$Member.samaccountname"'

Cela doit être faux, mais je ne sais pas comment le résoudre.

1
Andrew 4 avril 2017 à 08:26

2 réponses

Meilleure réponse
$Temprecord = Get-ADUser -Filter "samaccountname -like ""$($Member.samaccountname)"""

Voir par exemple Scripter du week-end: Comprendre les guillemets dans PowerShell et Échappez les caractères, les délimiteurs et les guillemets pour obtenir des explications.

Exemple :

PS D:\PShell> $x = 1,2,3
PS D:\PShell> $x.Count
3
PS D:\PShell> ### Single quotation marks define a literal string
PS D:\PShell> '$x.Count'
$x.Count
PS D:\PShell> ### Double quotation marks define more dynamic parsing string
PS D:\PShell> "$x.Count"
1 2 3.Count
PS D:\PShell> ### OOPS!
PS D:\PShell> "$($x.Count)"
3
PS D:\PShell> "array count $($x.Count)"
array count 3
PS D:\PShell> ### Finally, escape double quotes within double quoted string
PS D:\PShell> "array count as string ""$($x.Count)"""
array count as string "3"
PS D:\PShell>
1
JosefZ 4 avril 2017 à 06:15

Pipeline Pipeline Pipeline, pas besoin de la construction de boucles et de tableau et de table de hachage et de stockage de toute la sortie, puis de la sortie.

Dirigez les groupes dans ADGroupMember et transmettez également l'objet de groupe, dirigez le groupe et les membres vers Select, sélectionnez les quatre colonnes souhaitées et exportez-les au format CSV.

Import-Module ActiveDirectory

Get-AdGroup -Filter "Name -like '*e*'" -PipelineVariable Group |
    Get-ADGroupMember -Recursive | 
        Select-Object @{Label='Group Name'; Expression={$Group.Name}}, 
                      Name, 
                      SamAccountName, 
                      @{Label='Enabled'; Expression={(Get-AdUser -Identity $_.SamAccountName).Enabled}} |
            Export-Csv -Path 'C:\temp\SecurityGroups.csv' -NoTypeInformation
1
TessellatingHeckler 4 avril 2017 à 06:09