[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 ?

[POWERSHELL] Copie de fichier

Nous pouvons dire pleins de choses avec PowerShell.
Revenons au basique avec une simple copie de fichier.


#####Copie UNIQUEMENT LES DOSSIERS, LES FICHIERS NE SONT PAS PRIS EN COMPTES
Copy-Item -Path C:\TEMP\POUBELLE\* -Destination C:\TEMP\APPLICATION
#####PRENDS EN COMPTE LES FICHIERS
Copy-Item -Path C:\TEMP\POUBELLE\* -Destination C:\TEMP\APPLICATION -Recurse

Comme dit plus haut, nous sommes sur du basique.
Mais qui n’a jamais eu besoin d’une copie de fichier….:-)

[POWERSHELL] Création en MASSE d’utilisateurs

Donc oui, créer un utilisateur, c’est bien !
Mais en créer plusieurs d’un clic, c’est mieux !

Car oui, on peut nous demande 10, 20, 50 … comptes pour un projet particulier.
Des comptes de Services pour du SQL, IIS, Accès BDD, etc… et franchement, se les taper à la mano….ca serai fatiguant.

Je vous laisse le script :


#####Définition des variables
$USERS = Import-Csv -path 'C:\TEMP\CreateADUsers\UsersAD.csv' -Delimiter ','
$PATH = "OU=Utilisateurs,OU=HOME,DC=shinpo,DC=fr"

#####Création d'une boucle pour traiter toutes les lignes présentes du fichier
foreach ($USER in $USERS) {
New-ADUser -Name $USER.Name  -GivenName $USER.Prenom -Surname $USER.Nom -SamAccountName $USER.SamAccountName -UserPrincipalName $USER.UPN -Path $PATH -description $USER.description -Enabled $true -AccountPassword (ConvertTo-SecureString "P@ssw0rd" -AsPlainText -force) -passThru
}

Après exécution de ce script, tous les utilisateurs présents dans le fichier CSV seront ajoutés dans notre AD.

Création du fichier CSV.
La 1ere ligne de votre fichier DOIT contenir les en-têtes (vous les choisissez, dès l’instant que vous vous retrouvez. Nous pourrions très bien mettre TATA, TOTO, TUTU et LaRéponseDJeanPierre) :
Nom,Prenom,SamAccountName,Name,UPN,Description
Tout est explicite sauf “Name”, j’aurai pu choisir ‘Nom d’affichage’ mais c’était très long à écrire, bref.

Voici le reste du fichier CSV.
RORONOA,Zoro,Zoro.RORONOA,Zoro RORONOA,Zoro.RORONOA@shinpo.fr,Compte de Pirate
USHIWA,Sasuke,Sasuke.USHIWA,Sasuke USHIWA,Sasuke.USHIWA@shinpo.fr, Survivant des USHIWA
VEGATA,VEGATA,VEGATA,VEGETA,VEGATA@shinpo.fr,Roi de la planete VEGETA
HATATE,Kakashi,Kakashi.HATATE,Kakashi HATATE,Kakashi.HATATE@shinpo.fr,Utilisateur du Sharingan
LIGHT,Yagami,Yagami.LIGHT,Yagami LIGHT,Yagami.LIGHT@shinpo.fr,Possesseur du DeathNote


Nous avons notre contenu (mais nous aurions pu aller plus loin en ajoutant des adresses Mails, postales, numéro de TEL, le service, l’organisation, et encore d’autres attributs à ne plus savoir qu’en faire.

Notre fichier CSV terminé, passons aux explications du script PowerShell.

Commençons par la boucle FOREACH :


foreach ($USER in $USERS)

FOREACH crée une variable pour chaque ligne ($USER) du fichier CSV ($USERS).
Nous utiliserons juste cette nouvelle variable : $USER.”l’option que nous avons besoin”.
Nous pourrons voir que cette option fait référence aux colonnes de notre fichier CSV.
Donc, nous pouvons mettre ce que nous souhaitons dans ce fichier.

Je vous laisse découvrir les autres options, qui ne sont pas essentielles mais bien pratique.
Maintenant, vérifions que nos utilisateurs ont bien été créer avec notre script.
Nous avons 2 méthodes, aller dans l’AD et vérifier la présence de nos utilisateurs.
Ou juste faire une petit ligne de commande pour vérifier cela.


$PATH = "OU=Utilisateurs,OU=HOME,DC=shinpo,DC=fr"
Get-ADUser -SearchBase $PATH -Filter * -Properties * | Select-Object SamAccountName,UserPrincipalName,description

[POWERSHELL] Création de Groupe de Sécurité

Hello à vous,
Oui, la création de groupe de sécurité être très facile graphiquement.
Mais vu que nous pouvons le faire en PowerShell, pourquoi s’en priver ?
La commande est simple.
La voici :


#####Création d'un Groupe de Sécurité
New-ADGroup -SamAccountName "SHINPOGroupeTEST" -DisplayName "[SHINPO] Groupe TEST" -GroupCategory Security -GroupScope Global -Name "[SHINPO] Groupe TEST" -Path "OU=Groupes,OU=HOME,DC=shinpo,DC=fr" -Description "Groupe de TEST"

Si vous ne savez pas quelle option mettre derrière votre cmdlet, vous pouvez regarder dans les attributs d’un groupe existant :

Par partir des attributs, vous avez toutes les options et à quoi elles se réfèrent.
Exécutons notre script et regardons le résultat avec la commande suivant :


Get-ADGroup -SearchBase "OU=Groupes,OU=HOME,DC=shinpo,DC=fr" -Filter * -Properties * | Select-Object Name,SamAccountName,Description
Notre Groupe de Sécurité a bien été créé.