Question Script désinstallation office préinstallé

Plus d'informations
il y a 2 ans 11 mois #30703 par witness
Bonjour,
J'utilise un script pour la suppression d'office 365 préinstallé qui empeche la bonne installation d'office 2016 pro sur les postes.
Seulement, j'aimerais que vous m'apportiez deux explications.
Voici le script:
$OfficeUninstallStrings = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where {$_.DisplayName -like "Microsoft 365*"} | Select UninstallString).UninstallString
ForEach ($UninstallString in $OfficeUninstallStrings) {
$UninstallEXE = ($UninstallString -split '"') [1]
$UninstallArg = ($UninstallString -split '"') [2] + " DisplayLevel=False"
Start-Process -FilePath $UninstallEXE -ArgumentList $UninstallArg -Wait
    }

Pourriez-vous m'expliquer le .UninstallString à la fin de la première ligne ainsi que les [1] et [2] dans ForEach

Merci d'avance pour vos lumières. 

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 11 mois #30704 par Laurent Dardenne
Salut,

>>Pourriez-vous m'expliquer le .UninstallString à la fin de la première ligne
C'est une groupe d'instructions renvoyant un objet à partir du quel on récupère le contenu d'une propriété.
Équivaut à :
$Objet=Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where {$_.DisplayName -like "Microsoft 365*"} | Select UninstallString

$Objet.UninstallString
>>ainsi que les [1] et [2] dans ForEach
L'opérateur -Split renvoie un tableau de chaînes de caractère, le [1] précise l'indice 1 ( donc le second élément du tableau) et le [2] le troisième élément.
Cela évite une variable intermédiaire qui permettrait ici d'exécuter une seule fois l'opération...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 11 mois - il y a 2 ans 11 mois #30706 par witness
Salut Laurent,
Merci pour la réponse.

Ici, pour résumer, le bout de code ci-dessous va chercher dans le registre les données de la valeur UninstallString se trouvant dans une clé de registre dont le nom contient Microsoft 365.

$OfficeUninstallStrings = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where {$_.DisplayName -like "Microsoft 365*"} | Select UninstallString).UninstallString

Le .UninstallString à la fin de l'instruction récupère donc les données de la valeur de registre dont le nom est UninstallString.
Les données de la valeur de registre UninstallString sont donc le contenu et la valeur de registre UninstallString est la propriété ?

Ainsi, quand vous dites: C'est un groupe d'instructions renvoyant un objet à partir du quel on récupère le contenu d'une propriété.
L'objet c'est bien la valeur de registre UninstallString ?
Le contenu de la propriété c'est bien les données de la valeur UninstallString ?
Mais la propriété ? Il existerait implicitement une propriété UninstallString pour l'objet qui est la valeur de registre UninstallString ?

Je ne sais pas si je suis très clair, merci d'avance.
Dernière édition: il y a 2 ans 11 mois par witness.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 11 mois #30707 par Laurent Dardenne
>>Je ne sais pas si je suis très clair
Bah pas trop :-)

Sous Powershell un provider permet d'adresser différentes sources de données de manière uniforme.
Les données de la base de registre sont donc transformées en objet par Powershell.

Un exemple :
 #on se place sur le provider de la base de registre
# sur le chemin contenant des infos sur les applis
cd HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\Git_is1

#On récupère une information de la base de registre ( chemin courant )
Get-ItemProperty -path . -Name un*

#le détail de l'objet
Get-ItemProperty -path . -Name un*|Get-member

#   TypeName: System.Management.Automation.PSCustomObject
#
#Name            MemberType   Definition
#----            ----------   ----------
#Equals          Method       bool Equals(System.Object obj)
#...
#UninstallString NoteProperty string UninstallString="C:\Program Files\Git\unins000.exe"
Pour
>>Mais la propriété ? Il existerait implicitement une propriété UninstallString pour l'objet qui est la valeur de registre UninstallString ?
Comme tu le lis la réponse est oui.

>>L'objet c'est bien la valeur de registre UninstallString ?
Oui.
Powershell manipule des objets, il ne sait pas ce qu'est une clé de registre, mais il connait l'origine ( le fournisseur) de l'objet ( ici le provider Registry) :
Get-ItemProperty -path . -Name un*|Get-member

#   TypeName: System.Management.Automation.PSCustomObject
#
#Name            MemberType   Definition
#----            ----------   ----------
#Equals          Method       bool Equals(System.Object obj)
#...
#PSProvider      NoteProperty ProviderInfo PSProvider=Microsoft.PowerShell.Core\Registry
Donc pour faire simple, le système connait la base de registre et Powershell des objets représentant des informations de la base de registre. La notion de provider est entre les deux.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 11 mois - il y a 2 ans 11 mois #30717 par witness
Salut Laurent,
Merci pour l'explication.

J'ai fait un test sur une autre application est voici:
PS C:\Users\toto> $test = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where {$_.DisplayName -like "7-Z*"} | Select UninstallString)

PS C:\Users\toto> $test

UninstallString
---------------
C:\Program Files\7-Zip\Uninstall.exe

PS C:\Users\toto> $test | Get-Member

   TypeName: Selected.System.Management.Automation.PSCustomObject

Name            MemberType   Definition
----            ----------   ----------
Equals          Method       bool Equals(System.Object obj)
GetHashCode     Method       int GetHashCode()
GetType         Method       type GetType()
ToString        Method       string ToString()
UninstallString NoteProperty string UninstallString=C:\Program Files\7-Zip\Uninstall.exe

D'après Get-member, UninstallString est une propriété de type "NoteProperty", peux-tu m'expliquer ?

Et aussi, pourquoi le get-member de cette variable ne renvoie que ces 5 membres ?
Autrement dit, comment le système sait-il qu'il peut proposer tel ou tel propriété ou méthode selon l'objet (ici la variable) ?

Merci beaucoup
 
Dernière édition: il y a 2 ans 11 mois par witness.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 2 ans 11 mois #30719 par Laurent Dardenne
>>D'après Get-member, UninstallString est une propriété de type "NoteProperty",
C'est une propriété ajoutée par le provider (Powershell), elle porte une information issue de la base de registre.

>> pourquoi le get-member de cette variable ne renvoie que ces 5 membres ?
Le cmdlet Select-Object cré un objet personnalisé ( PsCustomObjet) et ajoute la lou les propriétés indiquées en paramètre. Les autres membres sont les méthodes par défaut du type System.Objet (dotNet) .

>>comment le système sait-il qu'il peut proposer tel ou tel propriété ou méthode selon l'objet (ici la variable) ?
A l'aide du mécanisme de reflection de dotNet associé à ETS ( systeme de type de Powershell).
Le détail :
laurent-dardenne.developpez.com/articles...iquesSousPowerShell/

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.092 secondes
Propulsé par Kunena