Comment puis-je récupérer une liste des softs installés sur un Pc du réseau. J'y arrive en partie en accédant au registre mais pour les produits Microsoft, j'obtiens un numéro.
Merci de votre aide.
JFLGB.
Comment puis-je récupérer une liste des softs installés sur un Pc du réseau. J'y arrive en partie en accédant au registre mais pour les produits Microsoft, j'obtiens un numéro.
Merci de votre aide.
JFLGB.
Salut,
Je ne comprends pas comment un numéro. Si tu lis la base de registre (HKEY_LOCAL_MACHINE/SOFTWARE je suppose) tu as la liste des logiciels. Pour Microsoft, c'est un niveau plus bas.
Suivant l'OS que tu utilises, ton problème devient donc d'obtenir la liste des sous-clés d'une entrée.
Cordialement
Patrick
Y'a des composants qui font sa tout seul et tres bien comme telechargeable sur ce site
J'interroge une autre clé de la base de registre (UNINSTALL) et je parcourt toute les sous-clés à la recherche d'une valeur DisplayName
Bonjour à vous, j'aimerais également si possible récupérer aussi les logiciels installées sur un poste réseau mais dans ce sujet il n'y pas pas de code pour m'aider, quelqu'un pourrait à mieux comprendre cette solution par la base de registre puisque c'est la méthode utilisée ici, et d'après mes recherches et discussion avec une personne de ce forum, cette personne me diser que l'on ne récuperer que le nom de dossier du programme mais pas le nom du logiciel, est ce vrai ?? (je donne un ex: cette personne m'as dis que pour adobe photoshop ou adobe acrobat reader ... on trouver qu'un dossier adobe dans le registre donc on ne savais pas programme adobe était installé). Merci par avance de vos réponses.
J'envois mon code telque je l'utilise, il faut mettre un peu d'ordre, mais je pense que ca va beaucoup t'aider!
Voici la fonction d'interrogation de la base de registre
Voici le code appelant la fonction pour récupérer les softs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 //Interrogation of Registry //Multi=1 for many occurences other number for 1 occurence //Return ListString empty if unable to connect to Registry or unable to open/find key into Registry TStringList* Network::Info(AnsiString Station, AnsiString RegKey, AnsiString RegValue, int Multi) { int i; AnsiString DataType; //String list containing the names of all subkeys belonging to the current key. TStringList* pkgstrings = new TStringList(); //String list containing desired infos. TStringList* pkg = new TStringList(); TRegistry* reg = new TRegistry; AnsiString RegKeyTemp; if (Station != NULL) //If Station isn't NULL { reg->RootKey = HKEY_LOCAL_MACHINE; //Initialize the RootKey if (!reg->RegistryConnect(Station)) //If can't connect to th Registry of the Station { ShowMessage("ERROR: Unable to connect to remote registry of "+Station+"."); //Message pkg->Clear(); //pkg clear } else { if (!reg->OpenKey(RegKey, false)) //If can't connect the RegKey { ShowMessage("ERROR: Unable to open or find the registry key into "+Station+"."); //Message pkg->Clear(); //pkg clear } else { //Returns a string list containing the names of all subkeys // belonging to the current key. if (Multi!=0) //If more then 1 value to reteive { reg->GetKeyNames(pkgstrings); //Get all subkey of the selected RegKey into pkgstrings for (i=0; i<pkgstrings->Count; i++) //For the count of pkgstrings { reg->CloseKey(); //Close the Key RegKeyTemp=RegKey+pkgstrings->Strings[i]; //Path of the RegKey RegKeyTemp+="\\"; reg->RootKey = HKEY_LOCAL_MACHINE; reg->RegistryConnect(Station); //Connect to the Registry of the Station reg->OpenKey(RegKeyTemp, false); //Open the Key if (reg->ValueExists(RegValue)) //If Key exist { pkg->Add(reg->ReadString(RegValue)); //Add value into pkg } } pkg->Sort(); //pkg Sorted } else //Only one value to retreive { if (reg->ValueExists(RegValue)) //If Key exist { DataType = reg->GetDataType(RegValue); //DataType get the type of the Key if (DataType == 3) //Key is a Integer { pkg->Add(reg->ReadInteger(RegValue)); //Add value into pkg } else //Key is a String { pkg->Add(reg->ReadString(RegValue)); //Add value into pkg } } else { pkg->Add("N/A"); //Add N/A into pkg } } reg->CloseKey(); //Close the Key } } } return pkg; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 //Softs void __fastcall Values::StationSoft(AnsiString Station) { RegKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"; RegValue="DisplayName"; pkgTemp = NetW.Info(Station, RegKey, RegValue, 1); //pkgTemp received vale(s) from interrogation of Registry pkgTemp->Sort(); //pkgTemp sorted if(pkgTemp->Count) //If value(s) into pkgTemp { for(int j = 0; pkgTemp->Count>j;j++) //For count of pkgTemp { Search = DelElemIntoString(pkgTemp->Strings[j], "'"); //Call function to elimination of ' Id = Data.ReturnId("SOFT", "ID", "NAME", Search); //Test if value already exist Test=Data.ValueExist("STATION_SOFT", "STATION_ID", "SOFT_ID", IdStation, Id); if (!Test) { Data.AddToTable("STATION_SOFT", "STATION_ID", "SOFT_ID", IdStation, Id); } } } else { Search = "Diconnected"; } }
Merci beaucoup de ta réponse aussi rapide, tout ton code et à mettre dans le .cpp si j'ai bien suivi ta méthode. J'ai une question qui doit être relativement évident mais je ne vois pas la réponse, comment varaiable récupérer afin d'afficher le résultat de cette recherche dans une ListBox par Exemple ou autre composant visuel sur la forme ??
Merci grandement pour ton aide, je vais tester cela avec ce qu'il sera affiché sur ma forme et ce qui est installé sur le pc.
Merci par avance de ta réponse.
Network::Info te renvoie un TStringList*
Il suffit d'assigner le StringList au listbox...
Ex:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 AnsiString RegKey="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\", RegValue="DisplayName"; TStringList *pkgTemp = NetW.Info(Station, RegKey, RegValue, 1); pkgTemp->Sort(); ListBox1->Items->Assign(pkgTemp);
Bon j'ai bien suivi votre méthode à tous les deux mais même en ajoutant le #include <registry.hpp> il me reste une bonne dizaines d'erreur de compilations, alors que 'en est enlever déjà trois ou quatre. Mais là les autres je ne vois pas d'où elle vienne. Quelqu'un à tester ce code ?? Car je suis sure qu'il fonctionne et que j'ai fait une erreur mais je ne vois pas où. Merci de votre aide.
oui oui je l'ai testé ... ca marche nickel ...
voici comment je l'ai traité :
et voici comment je l'appelle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 //--------------------------------------------------------------------------- #include "Registry.hpp" //--------------------------------------------------------------------------- void ListeLogiciel(TStrings *listeprog,AnsiString Station, AnsiString RegKey,AnsiString RegValue,int Multi) { AnsiString temp; listeprog->Clear(); if (Station!=NULL) { TRegistry* reg=new TRegistry; reg->RootKey=HKEY_LOCAL_MACHINE; if (reg->RegistryConnect(Station)) { if (reg->OpenKey(RegKey, false)) { if (Multi!=0) { TStringList* listeprogtemp=new TStringList(); reg->GetKeyNames(listeprogtemp); for (int i=0;i<listeprogtemp->Count;i++) { reg->CloseKey(); temp=RegKey+listeprogtemp->Strings[i]; temp+="\\"; reg->RootKey = HKEY_LOCAL_MACHINE; reg->RegistryConnect(Station); reg->OpenKey(temp, false); if (reg->ValueExists(RegValue)) listeprog->Add(reg->ReadString(RegValue)); } delete listeprogtemp; } else { if (reg->ValueExists(RegValue)) { if (reg->GetDataType(RegValue)==3) listeprog->Add(reg->ReadInteger(RegValue)); else listeprog->Add(reg->ReadString(RegValue)); } else listeprog->Add("N/A"); } reg->CloseKey(); } } delete reg; } } //---------------------------------------------------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2ListeLogiciel(ListBox1->Items,StrUpper(getenv("LOGONSERVER")),"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\","DisplayName",1);
Moi je voudrais recuperer les softs, mais installés sur la machine qui execute le programme...
Je peux supprimer quoi la dedans ? Passque je comprends pas tant...![]()
Merci de vos réponses !
Freeze je te remercie vraiment beaucoup puisque cela fonctionne très bien, mais par contre il me trouve en gros que la moitié des programmes que l'on trouve en faisant panneau de configuration, ajout/suppression de programme, est ce normal ???
Sinon pour Strem le code de Freeze fonctionne pour la machine sur laquelle est lancée ce code.
Merci par avance de vos réponses.
Wouuuuuh pinaize !
C'est supaaiiiir !
Merci beaucoup Freeze !
oui effectivement cela vient de ce morceau de code :Envoyé par batmat
qui renvoie le nom du pc sous la forme \\NOMPC
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2StrUpper(getenv("LOGONSERVER")),"
OK merci Freeze alors dans ce cas est il possible d'exécuter ce code afin de récupérer les programmes installé sur une machine du réseau local à distante ?? Par exemple en indiquant l'adresse Ip de la machine où l'on cherche les programmes installés, ou alors le nom. Car je viens d'effectuer un test en essayant avec ces paramètres mais cela ne fonctionne, est ce que cela est possible d'accéder à distance à ces informations ??
Je vous remercie encore par avance de toute l'aide utilise que vous nous apportés.
je ne sais pas ... c'est à essayer effectivement ... pourquoi pas ??![]()
tiens moi au courant ...
Ouais, il a pas l'air convaincu...
Je lui ai demandé de regarder la base de registre de 192.168.0.21 (un poste de mon reseau) et.....
...rien.
Dommage !![]()
Par contre, quand tu met 127.0.0.1 ou ton adresse ip, ya pas de pb.
Voila pr les ptites questions![]()
je confirme que ca marche ... j'ai teste avec une autre adresse ... ca marche tres bien ...
pour mon exemple :
il faut remplacer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2ListeLogiciel(ListBox1->Items,StrUpper(getenv("LOGONSERVER")),"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\","DisplayName",1);
parStrUpper(getenv("LOGONSERVER"))
"\\\\AdresseIP"
Ba moi je viens de tester ta méthode freeze et cela ne fonctionne pas. Cela compile mais à l'exécution sa plante, j'ai une erreur de violation ...
Pourquoi ?? Alors je c'est que cette machine et sur le réseau.
A la place deJ'ai misStrUpper(getenv("LOGONSERVER"))
merci de ton aide.StrUpper(getenv("\\\\130.176.1.93"))
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager