[POWERSHELL] Les Variables

L’utilisation des variables dans PowerShell permet de stocker des objets.
Vous pouvez choisir son nom.
J’ai pris l’habitude de les mettre en MAJUSCULE.
Pour créer une variable, il suffit juste de mettre “$” devant son nom :

$UTILISATEURS

Nous venons de créer une variable, mais vide, sans valeur.
Pour l’associer à une valeur, voici comment faire :

$UTILISATEURS = Get-LocalUser

Cette commande ne renvoie pas de résultat car tout est envoyé à la variable.
Si vous souhaitez voir la valeur d’une variable, écrivez la et validez.

PowerShell nous permet également de manipuler les variables.
Les créer, modifier, enregistrer, supprimer…

Get-Command -Noun Variable

Petit plus, nous pouvons aussi utiliser les variables système :

Get-ChildItem env:

[POWERSHELL] L’instruction SWITCH

L’instruction Switch avec PowerShell peut remplacer toute une série de If, ElseIf et Else. Pour rappel, IF vers la condition vers 2 blocs de codes (vrai / faux).
Switch renvoi, lui, vers plusieurs blocs de codes distincts en une seule expression.
Voici un exemple et comparatif :

### SWITCH ###

$Nombre = Read-Host ’Choisissez un nombre compris entre 1 et 5......SUSPENS ’ 
 
Switch($Nombre) 
{ 
   1 { ’Vous avez choisi le nombre 1 ’} 
   2 { ’Vous avez choisi le nombre 2 ’} 
   3 { ’Vous avez choisi le nombre 3 ’} 
   4 { ’Vous avez choisi le nombre 4 ’} 
   5 { ’Vous avez choisi le nombre 5 ’} 
   default {"Vous n'avez pas choisi ces chiffres là"}
}

### IF ###

$Nombre = Read-Host ’Choisissez un nombre compris entre 1 et 5......SUSPENS ’ 

if ($Nombre -eq 1) {’Vous avez saisi le nombre 1 ’}
elseif ($Nombre -eq 2) {’Vous avez choisi le nombre 2 ’}
elseif ($Nombre -eq 3) {’Vous avez choisi le nombre 3 ’}
elseif ($Nombre -eq 4) {’Vous avez choisi le nombre 4 ’}
elseif ($Nombre -eq 5) {’Vous avez choisi le nombre 5 ’}

Le résultat est le même, mais est beaucoup moins lourd avec SWITCH :

Et voilà le travail, rien de folichon mais cette instruction permet d’avoir un script plus lisible et surtout, plus facile à lire.

[POWERSHELL] Comparer le contenu de 2 fichiers

Hello à vous !

Nous allons voir comment comparer 2 fichiers avec PowerShell.
Nous pouvons être amené à faire cette comparaison plusieurs fois par mois.
Par exemple, vérifier que les Ordinateurs présents dans GLPI soit également présents dans notre AD ou comparer les ordinateurs en PROD d’un mois à l’autre.

Je vous laisse faire un export nécessaire.
Ici, nous avons 2 fichiers csv. Pas besoin que ces 2 fichiers aient la même mise en page, il faut juste qu’il y ait un contenu commun.
Exemple de fichier :

Mes fichiers ont cette forme

Je dois maintenant comparer 2 fichiers pour savoir quels postes sont sortis de mon parc.
Je vous laisse le script :

#Définition de nos 2 variables
##Nous travaillons avec 2 exports : 1 AD et 1 GLPI
$092019 = import-csv -Path "C:\TEMP\Compare\092019ComputersAD.csv" -Delimiter "," 
$102019 = import-csv -Path "C:\TEMP\Compare\102019ComputersAD.csv" -Delimiter "," 

#Nous cherchons les comptes Ordinateurs présents dans le fichier 092019ComputersAD.csv
foreach ($Moisencours in $102019)
{
#Par defaut, la variable $flagtrouvé est = à KO
$flagtrouvé="KO"

    foreach ($Moisdernier in $092019)
    {
        if ($Moisencours.Nom -eq $Moisdernier.Nom)
        {
#Si un nom est identique dans les 2 fichiers,  le flag passe à OK
        $flagtrouvé="OK"
        }
    }
if ($flagtrouvé -eq "KO")
    {
#Nous exportons le résultat dans un fichier texte des flags KO
Write-Output $Moisencours.Nom "n'est pas présent dans 092019" >> C:\TEMP\Coherence.txt
    }
}

Voici ce que j’obtiens :

Visuel du fichier txt généré

Je vois maintenant clairement quel poste est manquant.

[POWERSHELL] Désinstaller un logiciel .MSI

Hello à tous !
Nous pouvons être amener à désinstaller des logiciels.
Prenons un cas concret, Microsoft PowerBI, qui a une mise à jour tous les mois.
Partons sur une commande WMI :

Get-WmiObject -class win32_product 

Cette commande nous donne tous les logiciels installés sur le poste :

Liste des logiciels présents sur le poste

Content !……Non, il est vrai que cela nous donne beaucoup d’information.
Essayons de filtrer ca. Ajoutons un”|” après notre dernière commande (ce qui nous permettra de travailler avec le résultat situé devant le “|”. Trouvons notre fameux Power BI :

Get-WmiObject -class win32_product | Where-Object { $_.Name -like "*Power BI*"} 

Là, nous cherchons dans notre fameuse liste les logiciels qui contiennent “Power BI”. Les “*” signalent juste qu’il peut y avoir du texte avant et après le texte recherché. Regardons ce que ca donne :

Nous récupérons uniquement les logiciels où Power BI est présent.

Nous nous approchons mais ce n’est pas encore cela.
Il nous reste à le désinstaller.
Ajoutons encore un “|” suivi de la dernière commande :

Get-WmiObject -class win32_product | Where-Object { $_.Name -like "*Power BI*"} | ForEach-Object {$_.Uninstall()}

Que nous dit ce dernier morceau ?
Il nous dit que pour chaque objet ayant dans son nom “Power BI”, nous le désinstallons.

Et ca, c’est formidable !

Bien sûr avec l’IdentifyingNumber, nous pouvons faire un msiexec /X {IdentifyingNumber} pour désinstaller notre .MSI.

[POWERSHELL] La boucle FOREACH

Hello à tous !
Voici une instruction de Powershell qui sert énormément.

Aujourd’hui, notre exemple est le suivant :
Nous devons récupérez les logs d’une vingtaine de poste.

Pour ce faire, nous allons récupérer nos postes et les mettre dans un fichier txt. Notez les uns sous les autres.

$PCS = Get-Content "C:\OneDrive\Script\list.txt"

Ici, nous définissons notre variable $PCS avec le cmdlet Get-Content.
La valeur de notre variable  est égale au contenu de notre fichier “C:\OneDrive\Script\list.txt”.
Maintenant, réfléchissons à la manière de récupérer les logs désirés.
Voici le script :

Copy-Item -filter *.log "\\$PC\c$\program Files\NPortAdminSuite\bin\" "C:\OneDrive\Script\$PC\" -Recurse

Le cmdlet Copy-Item nous permet de copier des fichiers.
L’option -filter *.log permet de prendre uniquement les fichiers avec l’extension .log
Le 1er chemin correspond à la source.
Le 2nd correspond à la destination.

Maintenant, nous devons faire en sorte que chaque ligne de notre fichier texte, où sont inscrit les postes, soit traitée pour que nous puissions récupérer nos logs.

foreach ($PC in $PCS) {}

Nous utiliserons la boucle foreach.
Entre (), nous déclarons une nouvelle variable $PC.
Elle correspond à chaque ligne de notre fichier texte.

Maintenant, mettons tout cela en ordre :

$PCS = Get-Content "C:\OneDrive\Script\list.txt"
foreach ($PC in $PCS) {
Copy-Item -filter *.log "\\$PC\c$\program Files\NPortAdminSuite\bin\" "C:\OneDrive\Script\$PC\" -Recurse
}

Tous les PC présents dans notre fichier texte seront traités.
Ainsi, nous récupérerons tous les fichiers logs en un clic !

C’est merveilleux !

[POWERSHELL] Récupérer les KB installés sur un poste

Hello à vous,
Je pense que nous avons tous confronter au problème suivants :
“Heuuu……Cette application ne fonctionne pas sur certains postes…Vérifions leurs KB.

Donc, au lieu de se connecter sur chaque machine et de les chercher à la main, voici juste à bout de script qui permet de les récupérer et de les mettre dans un fichier CVS.

#####Lister les KB installés sur un poste (à exécuter sur le poste)

$Session = New-Object -ComObject Microsoft.Update.Session
$Searcher = $Session.CreateUpdateSearcher()
$HistoryCount = $Searcher.GetTotalHistoryCount()
$Searcher.QueryHistory(1,$HistoryCount) |
Select-Object Date, Title, Description | Export-Csv C:\TEMP\KBS.csv

Bien sûr, c’est en fonction du besoin, mais ca m’a bien aidé.

[POWERSHELL] Compter le nombre d’objet

Hello à tous !
Il peut arrivé que l’on vous demande le nombre d’objet présent dans un groupe de sécurité (ou de distribution).
Plusieurs solutions possibles :

  • Compter tous les objets 1 par 1 (peut être très fatiguant 🙂 et peut comporter des erreurs)
  • Faire une extraction Excel et sélectionner ce que l’on souhaite
  • Compter avec PowerShell. Nous allons plutôt utiliser cette méthode.

Nous allons utiliser les fonctions “Measure” et “Count”.
Nous allons compter les membres présents dans le groupe SHINPOGroupeTEST
Voici le script :

#####Définissons notre variable
$USERS = Get-ADGroupMember -Identity SHINPOGroupeTEST | Select-Object Name | measure
#####Commande qui permet d'afficher le nombre d'objet trouvé
Write-Host $USERS.Count

Get-ADGroupMember : Permet de voir le contenu d’un groupe
Identity : Permet de cibler le groupe voulu
Select-Object : Permet de récupérer la valeur voulue
measure : Indique que nous souhaitons compter
Write-Host : Permet d’afficher le résultat

#####Vérifions cela "en ajoutant une ligne en plus à notre script" :
Get-ADGroupMember -Identity SHINPOGroupeTEST | Select-Object Name
Nous pouvons voir ici que le compte est bon.

Notre cher ami PowerShell a bien compté les membres présents dans notre groupe.

[POWERSHELL] Récupérer la date

Powershell a de base cette cmdlet qui permet d’avoir la date et l’heure de la machine.

Cela peut être très utilise pour dater des logs, ou nommer certains fichiers.
La commande est la suivant :


Get-Date

Ce qui donne le résultat suivant :


Nous avons récupéré la date au format DATE et HEURE

Nous pouvons utiliser la fonction -Format pour récupérer une date plus simple :


ATTENTION, bien mettre MM (pour le mois) et non mm (qui sera pour les minutes)

Si nous souhaitons avoir la date en lettre et chiffre ou uniquement l’heure, nous utiliserons la fonction -DisplayHint :

Et voilà, rien de compliqué, mais il faut juste le savoir.

[POWERSHELL] La condition IF

Les conditions ! Un INDISPENSABLE de PowerShell.
Qui n’a jamais eu besoin d’exécuter un script suivant une condition ?
Huuuummmm……Personne.
Et cette condition est là pour nous aider.
Voici un petit script pour l’imager :


#####Définition de la variable $process.
$process = "chrome"

#####Définition de la variable $pstatut.
$pstatut = Get-Process

#####1ere Condition --> Si Chrome est présent dans les processus, la variable se met à 1, sinon, elle passe à 0.
if ($pstatut.ProcessName -eq $process )
{    $petat = "1" } else
{    $petat = "0" }

#####2eme Condition --> Si $petat est égal à 1, le texte suivant s'affiche : "Google Chrome est lancé sur le poste"
 if ($petat -eq 1)
 { Write-Host "Google Chrome est lancé sur le poste" } else
 { Write-Host "Google Chrome n'est pas lancé sur le poste" }

Ici, nous voulons juste savoir si Chrome est lancé sur le poste.
Si oui, nous affichons le message :
Google Chrome est lancé sur le poste
Si non :
Google Chrome n’est pas lancé sur le poste


if ($pstatut.ProcessName -eq $process )
{    $petat = "1" } else
{    $petat = "0" }

Ici, nous disons :
Si le nom du processus ($pstatut.ProcessName) est égal (-eq) chrome ($process),
alors notre variable ($petat) prend la valeur 1 sinon (else), elle prend 0.


 if ($petat -eq 1)
 { Write-Host "Google Chrome est lancé sur le poste" } else
 { Write-Host "Google Chrome n'est pas lancé sur le poste" }

Maintenant la suite !
Nous disons que :
Si la variable est égal à 1, alors nous faisons apparaître la phrase (Write-Host) suivante :
Google Chrome est lancé sur le poste
sinon, la phrase suivante sera affichée :
Google Chrome n’est pas lancé sur le poste

Voici le résultat !

[POWERSHELL] Retrouver un cmdlet

Hello à tous,

A force de tripoter notre outil préféré et de tester plusieurs cmdlet, nous pouvons nous y perdre.

Exemple :

Je dois retrouver un cmdlet et pas moyen de le retrouver.

Mais comment faire !?

Il existe un cmdlet pour ça aussi (Powershell sait tout faire !)


Get-command

Disons que nous devons trouver un cmdlet pour chercher tous nos enregistrements DNS.


Get-Command -Name '*dns*'

Maintenant, nous avons toutes les commandes disponibles de Powershell concernant DNS.

Il nous reste juste à chercher la bonne, c’est fou non ?