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).
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
Dans l'article <1171964037.614855.190200@t69g2000cwt.googlegroups.com>,
romain.lionel@gmail.com 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";
}
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.
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.
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.
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.
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";
(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).
Dans l'article <1172143467.896884.187170@h3g2000cwc.googlegroups.com>,
romain.lionel@gmail.com 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";
(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).
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";
(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).
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"} ;
Merci pour vos explications... et pour votre site.
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_MACHINE\SOFTWARE\Microsoft\Windows
CurrentVersion\Uninstall"} ;
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"} ;