IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Récupérer la température


Sujet :

Windows

  1. #1
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut Récupérer la température
    Bonjour,
    Voici un simple code pouvant normalement permettre de récupérer la température du proc:
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #define _WIN32_DCOM
    #include <iostream>
    using namespace std;
    #include <comdef.h>
    #include <Wbemidl.h>
    
    # pragma comment(lib, "wbemuuid.lib")
    
    int main(void) {
    
    	CoInitialize(NULL);
    	if (CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
    	RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK)
    		return 1;
    
    	IWbemLocator* pIWbemLocator = NULL;
    	IWbemServices* pWbemServices = NULL;
    	IEnumWbemClassObject* pEnumObject = NULL;
    
    	BSTR bstrNamespace = (L"root\\WMI");
    
    	if (CoCreateInstance (
    	CLSID_WbemAdministrativeLocator,
    	NULL ,
    	CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER ,
    	IID_IUnknown ,
    	( void ** ) & pIWbemLocator) != S_OK)
    	return 1;
    
    	if (pIWbemLocator->ConnectServer(bstrNamespace, NULL, NULL, NULL, 0,
    	NULL, NULL,&pWbemServices) != S_OK)
    	return 1;
    
    	HRESULT hRes;
    	BSTR strQuery = (L"Select * from MSAcpi_ThermalZoneTemperature");
    	BSTR strQL = (L"WQL");
    	hRes = pWbemServices->ExecQuery(strQL, strQuery,
    	WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumObject);
    	if (hRes != S_OK)
    	{
    		cout << "Could not execute Query";
    		return 1;
    	}
    
    	hRes = pEnumObject->Reset();
    	if (hRes != S_OK)
    	{
    		cout << "Could not Enumerate (1)";
    		return 1;
    	}
    
    	ULONG uCount = 1, uReturned;
    	IWbemClassObject* pClassObject = NULL;
    	hRes = pEnumObject->Next(WBEM_INFINITE,uCount, &pClassObject, &uReturned);
    	if(hRes != S_OK)
    	{
    		cout << "Could not Enumerate (2): ";
    		return 1;
    	}
    
    	VARIANT v;
    	BSTR strClassProp = SysAllocString(L"CurrentTemperature");
    	hRes = pClassObject->Get(strClassProp, 0, &v, 0, 0);
    	if (hRes != S_OK)
    	{
    		cout << "Could not Get Value";
    		return 1;
    	}
    
    	SysFreeString(strClassProp);
    	_bstr_t bstrPath = &v; //Just to convert BSTR to ANSI
    	char* strPath=(char*)bstrPath;
    
    	if (SUCCEEDED(hRes))
    		cout << strPath;
    	else
    		cout << "Error in getting object";
    
    	VariantClear(&v);
    	pIWbemLocator->Release();
    	pWbemServices->Release();
    	pEnumObject->Release();
    	pClassObject->Release();
    	CoUninitialize();
    	
    
    	return 0;
    }
    et voici toujours l'erreur à la sortie:
    cout << "Could not Enumerate (2)"
    Je ne comprends pas, j'ai beau cherché.
    Mon PC peut être pas compatible?

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Après avoir fait le "pEnumObject->Next", ce serait mieux de vérifier que le résultat n'est pas WBEM_S_FALSE : si c'est le cas, tu as atteint la fin de l'énumération, donc si tu n'en as trouvé aucune, c'est que tu n'as pas d'instances de cette classe sur ta machine (énumération vide).

    En plus clair : le driver de ta carte mère, même si elle possède une fonction de monitoring de la température, n'expose pas ce qu'il faut à WMI pour renseigner la classe MSAcpi_ThermalZoneTemperature. Ton PC ne supporte donc pas cette fonction, du moins via WMI. Il est possible qu'il sache le faire en tapant directement dans le matériel, mais là, ce n'est plus portable.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Après avoir fait le "pEnumObject->Next", ce serait mieux de vérifier que le résultat n'est pas WBEM_S_FALSE
    En testant:
    après le "pEnumObject->Next", il renvoit false.
    Donc apparemment, ce n'est pas du à une fin d'énumération.
    hRes vaut -2147217405.

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par ZouBi Voir le message
    hRes vaut -2147217405.
    Mouais, c'est guère mieux : cette constante, c'est WBEM_E_ACCESS_DENIED (cf. cette page MSDN)...

    Tu as bien lancé ça avec un compte ayant les droits d'administration ? Ou alors, c'est ton appel à CoInitializeSecurity qui a de mauvais paramètres...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Bonjour, et merci pour ta réponse.
    Je débute dans cet API de Windows, j'ai récupéré des bouts de codes par ci par là pour refaire ce code.
    En effet, il semble qu'en exécutant en tant qu'administrateur, une valeur de température s'affiche (=3192... je crois que mon proc surchauffe vraiment )
    Mais j'ai cherché, et il fait appliquer ce calcul ci dessus :
    (Maintenant j'ai plus qu'à chercher comment convertir un Variant en Float, pour pouvoir appliquer ce calcul.)

    Voici mon initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CoInitialize(NULL);
    	if (CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT,
    	RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK)
    		return 1;
    Y a t'il moyen d'avoir automatiquement les droits d'utilisateurs?

    Et par la suite, j'aimerai pouvoir récupérer cette valeur dans un code ActiveX/Javascript, y a t'il un moyen?

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par ZouBi Voir le message
    Mais j'ai cherché, et il fait appliquer ce calcul ci dessus :
    Oui, il te renvoie la température en dixièmes de Kelvins... Pas trop gênant, tant que tu le sais. Tu dois d'abord la convertir en entier, puis effectuer la conversion vers du flottant.
    Va voir cette page pour quelques exemples / explications. Cela doit sûrement être un VT_UINT.

    Citation Envoyé par ZouBi Voir le message
    Y a t'il moyen d'avoir automatiquement les droits d'utilisateurs?
    Normalement, oui, mais je ne suis pas spécialiste de ce point précis, et tu peux avoir des subtilités si tu utilises Vista ou Seven.
    Ceci étant dit, il faut normalement virer ton premier paramètre NULL et construire un SECURITY_DESCRIPTOR valide, correspondant à un compte d'administration. Tu peux en construire un via SetSecurityDescriptorOwner (et les fonctions associées, lis bien la doc) et LookupAccountName.
    Au pire, cela veut dire qu'il faudra initialiser ton programme / DLL / service avec les paramètres adéquats (nom du compte d'administration au minimum), ou te connecter au moins une fois avec un compte d'admin, de façon à valider tout ça. M'enfin, je te dis ça, mais j'ai juste regardé MSDN et les fonctions associées, je n'ai jamais eu réellement besoin de les utiliser, donc je ne peux rien te confirmer strictement. Faut essayer...

    Si tu obtiens un service / programme autonome, tu peux également te diriger vers la commande RUNAS, qui possède la propriété de savoir mémoriser une authentification. Tu n'auras donc à entrer login/MdP qu'une seule fois, à "l'installation" du logiciel.

    Citation Envoyé par ZouBi Voir le message
    Et par la suite, j'aimerai pouvoir récupérer cette valeur dans un code ActiveX/Javascript, y a t'il un moyen?
    ActiveX, oui, sans trop de problèmes : c'est une DLL, après tout, donc tu peux appeler ce que tu veux dedans, ou presque. Au pire, à cause des droits, tu devras faire une étape de plus (faire un processus / service qui récupère l'information, et qui la publie sans demander le moindre droit), mais il n'y a aucun problème technique réel.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Je te remercie du temps que tu prends pour me répondre.
    Bon pour la valeur, c'est simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float temp = (float)(v.intVal/(float)10.0);
    Concernant l'ActiveX, je pensais faire une dll avec comme simple fonction ce code qui retourne la température, ça irait?

    Maintenant je vais me renseigner sur cette histoire d'administrateur...

    EDIT:
    J'ai cherché, fouillé pour pas à n'avoir passer par l'administrateur et j'ai vraiment du mal. Pourquoi il autorise la lecture des autres propriétés sans droits, et celui là non?

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par ZouBi Voir le message
    Concernant l'ActiveX, je pensais faire une dll avec comme simple fonction ce code qui retourne la température, ça irait?
    A priori, oui, le seul problème est l'élévation des droits, en fait, si jamais le processus hôte a été "bridé" pour ne PAS avoir le droit de le faire... D'où le fait que je te parlais de faire, si besoin, un processus / service indépendant qui ne serait pas soumis à ce problème.

    Citation Envoyé par ZouBi Voir le message
    J'ai cherché, fouillé pour pas à n'avoir passer par l'administrateur et j'ai vraiment du mal. Pourquoi il autorise la lecture des autres propriétés sans droits, et celui là non?
    Sûrement un verrou au niveau du driver, mais lequel, va savoir... A titre purement consultatif, effectivement, je ne vois pas de raisons de limiter ça aux seuls administrateurs... Sauf s'il y a possibilité de modifier, via la même interface, les réglages d'alertes de température et/ou de vitesse des ventilateurs, donc potentiellement endommager la machine en la faisant surchauffer. Dans ce cas, effectivement, il faudrait avoir les droits d'administration.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre éclairé
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    Détails du profil
    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Points : 812
    Points
    812
    Par défaut
    Du coup, si j'ai bien compris, ce même code sur d'autres machines fonctionneraient correctement sans droits administrateur?
    Ceci dépend des drivers, et machines?

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par ZouBi Voir le message
    Du coup, si j'ai bien compris, ce même code sur d'autres machines fonctionneraient correctement sans droits administrateur?
    Ceci dépend des drivers, et machines?
    C'est possible, mais ce n'est pas dit non plus que toutes les machines aient cette interface WMI... Ou qu'elle n'est pas systématiquement en mode "Admin". Bref, je pense que tu n'as rien de garanti, il faudra quand même à un moment ou l'autre gérer correctement les élévations.

    Après, il semble aussi qu'un autre moyen d'obtenir cette température est d'utiliser la classe WMI "Win32_TemperatureProbe.CurrentReading", mais ça ne semble pas supporté partout...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. [Développement] récupérer la température du (des) processeur(s)
    Par d'Oursse dans le forum Apple
    Réponses: 1
    Dernier message: 20/05/2011, 08h46
  2. Récupérer la température du processeur en C
    Par swingNJava dans le forum Windows
    Réponses: 1
    Dernier message: 09/10/2008, 17h04
  3. Réponses: 7
    Dernier message: 10/03/2008, 09h29
  4. Réponses: 11
    Dernier message: 09/06/2006, 15h10
  5. Récupérer la température du processeur (CPU)
    Par cyber_N dans le forum MFC
    Réponses: 4
    Dernier message: 05/09/2005, 18h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo