Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Win32] Liste des applications installées

4 réponses
Avatar
kiwi
Bonjour,

J'ai beau chercher dans la liste des modules d'ActiveState... je ne
trouve pas ce qui me permettrait d'obtenir la liste des applications
install=E9es sur un poste local au moyen d'un script Perl (ActivePerl
sous Windows XP Pro).

Si quelqu'un a une id=E9e... merci.

4 réponses

Avatar
jl_morel
Dans l'article ,
a dit...

J'ai beau chercher dans la liste des modules d'ActiveState... je ne
trouve pas ce qui me permettrait d'obtenir la liste des applications
installées sur un poste local au moyen d'un script Perl (ActivePerl
sous Windows XP Pro).



Le plus simple, sinon le plus rapide, est d'utiliser WMI (Windows
Management Instrumentation) avec le module Win32::OLE.

Pour les méthodes et les propriétés de la classe Win32_Product voir la doc
Microsoft :
http://msdn2.microsoft.com/en-us/library/aa394378.aspx


#!/usr/bin/perl
use strict;
use warnings;
use Win32::OLE;

my $wmi = Win32::OLE->GetObject("winMgmts:")
or die "Unable to connect $!";

my $prods = $wmi->InstancesOf("Win32_Product");

foreach my $prg ( in $prods ) {
print $prg->{Name},"n";
}

__END__

--
J-L.M.
http://www.bribes.org/perl

Avatar
kiwi
Bonjour,

Merci pour cette piste que j'ai exploitée... et grâce à laquelle j'ai
obtenu une partie de la liste des applications.
"Une partie de la liste"... car toutes les applications installées ne
sont pas présentes. En effet, celles installées à partir d'un fichier
MSI sont présentes... mais hélas, celles qui ont été installées à
partir de fichiers EXE n'apparaissent pas. Je n'ai pas trouvé la
classe ad-hoc dans le lien que vous m'avez indiqué.
Une petite question : my $wmi = Win32::OLE->GetObject("winMgmts:")
Où avez vous trouvé la chaîne "winMgmts:" qui permet d'accéder au
WMI ?
Merci encore.
Avatar
jl_morel
Dans l'article ,
a dit...

Merci pour cette piste que j'ai exploitée... et grâce à laquelle j'ai
obtenu une partie de la liste des applications.
"Une partie de la liste"... car toutes les applications installées ne
sont pas présentes. En effet, celles installées à partir d'un fichier
MSI sont présentes... mais hélas, celles qui ont été installées >à
partir de fichiers EXE n'apparaissent pas. Je n'ai pas trouvé la
classe ad-hoc dans le lien que vous m'avez indiqué.


Ah oui, effectivement une partie seulement des applications est listée :-(
Bon, il va falloir se mettre les mains dans le cambouis ! La fonction
suivante affiche toutes les applications que l'on peut désinstaller, donc
ce sont celles qui sont installées :-)

#!/usr/bin/perl
use strict;
use warnings;
use Win32API::Registry qw( :ALL );

# Retourne la liste de tous les programmes installés sur la machine

sub InstalledProgs {
my ( $key, $index, $subname, @progs );
RegOpenKeyEx( HKEY_LOCAL_MACHINE,
'SOFTWAREMicrosoftWindowsCurrentVersionUninstall',
0, KEY_READ, $key )
or die "Can't open registry key", regLastError(), "n";

while ( RegEnumKeyEx( $key, $index, $subname, 256, [], [], 0, [] ) ) {
my ( $type, $data, $subkey );
RegOpenKeyEx( $key, $subname, 0, KEY_READ, $subkey );
if ( RegQueryValueEx( $subkey, "DisplayName", [], $type, $data, [] ) ) {
push @progs, $data;
}
RegCloseKey($subkey);
$index++;
}
RegCloseKey($key);
return @progs;
}

# test :

$, = "n";
print InstalledProgs();

__END__


Une petite question : my $wmi = Win32::OLE->GetObject("winMgmts:")
Où avez vous trouvé la chaîne "winMgmts:" qui permet d'accéder au
WMI ?


C'est le nom sous lequel est enregistré le moniker associé à WMI.
Voir la doc :

http://msdn2.microsoft.com/en-us/library/aa389763.aspx

(WINMGMTS = Windows Management Service) Vous pouvez mettre son nom en
majuscules ou minuscules. Ce moniker est un type d'objet qui sert
d'intermédiaire "intelligent" entre votre script et WMI.

Vous pouvez ajouter une chaîne après les deux points qui sera passée au
moniker. Par exemple :

my $diskC = Win32::OLE->GetObject("WINMGMTS:Win32_LogicalDisk='C:'");

définit un objet représentant le disque C:

Vous pouvez ensuite obtenir sa taille par $diskC->Size, l'espace libre par
$diskC->FreeSpace...etc

L'idée de WMI c'est de mettre une bonne partie l'API Windows sous forme de
composants COM donc accessible aux langages de scripts. L'ennui c'est que
c'est plus lent qu'un appel direct à l'API : si il existe un module Perl
qui fait le travail il est préférable de l'utiliser plutot que WMI (par ex.
Win32::DirSize, Win32::IPHelper, Win32::SystemInfo ...)

Vous pouvez traduire en Perl tous les exemples donnés en VBScript dans la
doc de Microsoft (voir la doc de WIN32::OLE).

HTH

--
J-L.M.
http://www.bribes.org/perl

Avatar
kiwi
En fait, j'étais arrivé à quelque chose de similaire en utilisant tout
comme vous Win32::TieRegistry (dont j'ai trouvé la traduction sur
votre site), mais sans utiliser les méthodes (en accédant directement
aux hash bénis... après étude des structures à coups de
Data::Dumper) :

use Win32::TieRegistry ;

my $r = $Registry->{"HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows
CurrentVersionUninstall"} ;

foreach my $clef ( keys %$r )
{
foreach my $ssclef ( keys %{$r->{$clef}} )
{
print "$ssclef : " , $r->{$clef}->{$ssclef} ,"n" ;
}
}

Merci pour vos explications... et pour votre site.