IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

manipulation de variable [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2011
    Messages : 23
    Par défaut manipulation de variable
    Bonjour,

    je m'excuse tout d'abord si ma question paraît simple mais je ne trouve pas les réponses à mes questions.

    je stocke dans une variable tous les utilisateurs ayant une licence Office spécifique.
    Il me sort donc des UPN.

    Ensuite, je vais récupérer dans l'AD des properties.

    Pour faire cela, j'utilise des ForEach et des Get-content mais cela m'oblige à créer et manipuler des fichiers, j'aurai aimé pouvoir agir directement sur la variable.

    voici mon code actuel :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Connect-MsolService
    $UserListE1 = Get-MsolUser -All | Where-Object { ($_.Licenses).AccountSkuId -match "LicenceE1" }
    $UserListE1 | Select-Object UserPrincipalName | Export-Csv -NoTypeInformation -Path "C:\_TEMP\Bin\o365_E1.csv"
     
    $UsersE1 = "C:\_TEMP\Bin\o365_E1.csv"
    (Get-Content $UsersE1) | select -Skip 1 | % { $_ -replace """", "" } | out-file -FilePath C:\_TEMP\Bin\o365_E1.txt -Force
     
    $E1List = "C:\_TEMP\Bin\o365_E1.txt"
     
    Function GetPropertiesE1 {
        ForEach ($UE1 in Get-Content $E1List) {
            Get-ADUser -filter { mail -eq $UE1 } -properties * | select DisplayName, SamAccountName, Title, Country, City, Division, Department, Manager, Enabled | Sort-Object DisplayName
        }
    }
     
    GetPropertiesE1 | Export-Csv "C:\_TEMP\ExtractE1Users.csv" -NoTypeInformation

    j'imagine qu'il y a plus simple que cela...

    j'ai essayé de faire
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    $UserListE1 = Get-MsolUser -All | Where-Object { ($_.Licenses).AccountSkuId -match "bgingenieur:STANDARDPACK" } | Select-Object UserPrincipalName

    si je fais un ForEach ça me ressort bien les résultats de ma variable

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    ForEach ($mail in $UserListE1) {$mail}

    Mais impossible de faire fonctionner si je veux aller faire la même chose qu'avec mes fichiers

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function GetPropertiesE1 {
         ForEach ($mail in $UserListE1) {
         Get-ADUser -filter { mail -eq $mail } -properties * | select DisplayName }
    }

    je me retrouve avec des erreurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Get-ADUser : Invalid type 'System.Management.Automation.PSCustomObject'.
    Parameter name: mail
    At line:3 char:1
    + Get-ADUser -filter { mail -eq $mail } -properties * | select DisplayN ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [Get-ADUser], ArgumentException
        + FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Comm
       ands.GetADUser
    Merci d'avance pour votre aide, j'espère que ce que je veux faire est bien possible

    Gaëtan

  2. #2
    Membre chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 281
    Par défaut
    salut corly

    d'abord les explications :
    powershell est un langage orienté objet, ce qui ne t'aide pas
    quand tu met dans la variable $UserListE1 l'UPN ta variable contient un objet dont une propriété est UserPrincipalName
    d’ailleurs si tu affiche le contenue de la variable, tu vois écris :
    UserPrincipalName
    ---------------------
    nom@domaine.xxx
    nom@domaine.xxx
    nom@domaine.xxx
    ou si tu regarde ton fichier o365_E1.txt :
    #TYPE Selected.System.........
    "UserPrincipalName"
    "nom@domaine.xxx"
    "nom@domaine.xxx"
    "nom@domaine.xxx"
    ce qui indique que ta variable est un objet de type tableau avec une propriété "UserPrincipalName"

    pour lire cette objet directement après ça création tu doit donc indiqué la propriété que tu veux lire "$UserListE1.UserPrincipalName"
    le point indique que tu veux utilisé une propriété ou une méthode de l'objet

    une solution pour ton problème, c'est de lire la propriété dans ta boucle
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        ForEach ($UE1 in $UserListE1) {
            Get-ADUser -filter { mail -eq $UE1.UserPrincipalName } -properties DisplayName, SamAccountName, Title, Country, City, Division, Department, Manager, Enabled | Sort-Object DisplayName
    vois tu le $UE1.UserPrincipalName ?

    une autre solution : ressemble a ton idée :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $UserListE1 = Get-MsolUser -All | Where-Object { ($_.Licenses).AccountSkuId -match "bgingenieur:STANDARDPACK" } | Select-Object -ExpandProperty UserPrincipalName
    .
    .
    .
        ForEach ($UE1 in $UserListE1) {
            Get-ADUser -filter { mail -eq $UE1} -properties  DisplayName, SamAccountName, Title, Country, City, Division, Department, Manager, Enabled | Sort-Object DisplayName
    le Select-Object -ExpandProperty UserPrincipalName demande de renvoie non plus la propriété mais sont contenue, ce qui donne un tableau de string plutot qu'un tableau d'objet qui contient la propriété

    dans les deux cas plus besoin de ça :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $UserListE1 | Select-Object UserPrincipalName | Export-Csv -NoTypeInformation -Path "C:\_TEMP\Bin\o365_E1.csv"
     
    $UsersE1 = "C:\_TEMP\Bin\o365_E1.csv"
    (Get-Content $UsersE1) | select -Skip 1 | % { $_ -replace """", "" } | out-file -FilePath C:\_TEMP\Bin\o365_E1.txt -Force
     
    $E1List = "C:\_TEMP\Bin\o365_E1.txt"


    une info au passage
    ne fais pas de properties * dans tes get-adquelque chose, tu charge inutilement ton serveur AD et tu ralentie fortement ton script
    selectionne directement tes attributs AD dans properties plutot que dans un select
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
            Get-ADUser -filter { mail -eq $UE1 } -properties DisplayName, SamAccountName, Title, Country, City, Division, Department, Manager, Enabled | Sort-Object DisplayName

    une autre encore
    le Sort-Object DisplayName à la fin du get-aduser ne sert a rien puisque qu'il ne envoie qu'un seul utilisateur à chaque appel (chaque UPN est unique dans l'AD et normalement le mail aussi)
    il sera plus efficace avant l'export
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    GetPropertiesE1 | Sort-Object DisplayName | Export-Csv "C:\_TEMP\ExtractE1Users.csv" -NoTypeInformation

    bon je crois avoir fais le tour
    si ta des questions nécessite pas !

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2011
    Messages : 23
    Par défaut
    Salut 6ratgus,

    merci énormément pour tes conseils et infos.
    je me suis formé un petit peu sur le tas et donc je tâtonne.
    je suis donc preneur de tous les conseils que l'on peut me donner afin que mes scripts soient plus performants.

    je vais donc prendre l'habitude de ne plus faire de -properties * et utiliser plus souvent les propriétés avec le point ($UE1.UserPrincipalName)

    Encore merci pour ton aide

    mon pb est donc résolu (et je vais repasser sur mes autres scripts afin de les alléger )

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2011
    Messages : 23
    Par défaut
    Citation Envoyé par 6ratgus Voir le message
    si ta des questions nécessite pas !
    J'en ai une justement..

    j'ai pris l'exemple ici des licences E1, mais je fais cela pour plusieurs type de licences.

    je crée donc des fonctions pour chaque ForEach, est-ce que je peux faire autrement ? (pour l'export en csv)

    est-il possible de créer un csv qui indiquerait en plus le type de licence (au lieu d'avoir un csv par type de licence)

    merci

  5. #5
    Membre chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 281
    Par défaut
    une solution :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function GetPropertiesE1 ($licence) {
        Connect-MsolService
        $UserListE1 = Get-MsolUser -All | Where-Object { ($_.Licenses).AccountSkuId -match $Licence }
     
        ForEach ($UE1 in $UserListE1) {
            Get-ADUser -filter { mail -eq $UE1.UserPrincipalName } -properties DisplayName, SamAccountName, Title, Country, City, Division, Department, Manager, Enabled | select @{l="Licence";e={$licence}}, *
            }
        }
     
    GetPropertiesLicence "LicenceE1" | Sort-Object DisplayName | Export-Csv "C:\_TEMP\ExtractE1Users.csv" -NoTypeInformation
    GetPropertiesLicence "LicenceE2" | Sort-Object DisplayName | Export-Csv "C:\_TEMP\ExtractE1Users.csv" -NoTypeInformation -Append

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Manipuler des variables/valeurs
    Par ttone dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2008, 17h13
  2. [Bash] Question sur la manipulation de variables
    Par sliderman dans le forum Linux
    Réponses: 6
    Dernier message: 03/08/2007, 08h36
  3. Manipulation de variable
    Par mejrs dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/08/2007, 07h37
  4. Manipulation des variables.
    Par fred61 dans le forum C
    Réponses: 12
    Dernier message: 22/04/2007, 19h35
  5. [Tableaux] manipulation de variable
    Par mectouzen dans le forum Langage
    Réponses: 12
    Dernier message: 02/02/2006, 11h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo