67 votes

Outil en ligne de commande pour récupérer la version DLL de Windows ?

J'ai besoin d'un outil en ligne de commande pour récupérer les informations de version de la DLL standard de Windows afin de pouvoir les traiter au moyen d'un script bash script (Cygwin).

En tant que développeur Java, je ne suis pas très habitué aux outils de développement Microsoft (bien que j'aie un peu d'expérience avec Microsoft Visual Embedded C++ 4.0 et Microsoft Visual Basic 6.0).

L'outil approprié semble être mt.exe comme déclaré sur le SO . Cependant, la seule possibilité que j'ai trouvée pour obtenir cette petite application est de télécharger un ISO de 1,29 Go de l'application. SDK Windows pour Windows Server 2008 et .NET Framework . Je n'arrive pas à croire que c'est la seule façon de faire.

J'ai également trouvé sur Internet une petite application appelée PEView mais il affiche trop d'informations (inutiles dans mon cas) et ce n'est pas une application en ligne de commande.

Standard objdump intégré à Cygwin peut également fournir des informations sur les fichiers DLL, mais je ne vois pas l'option permettant de fournir la version de la DLL. Notez que MajorImageVersion, MinorImageVersion et d'autres champs vidés par cet outil (avec l'option -p) ne sont pas liés à la version de la DLL.

Des alternatives sur ce qu'il faut faire ? Peut-être ai-je manqué une option importante d'objdump ? Est-ce que mt.exe est mon seul choix ? Si c'est le cas, est-il possible de l'obtenir séparément du SDK Windows ?

121voto

Graham Ambrose Points 586

Vous pouvez utiliser PowerShell pour obtenir les informations que vous souhaitez.

(Get-Item C:\Path\To\MyFile.dll).VersionInfo

Par défaut, il affiche ProductVersion et FileVersion. Mais la version complète VERSIONINFO est disponible. C'est-à-dire renvoyer les commentaires

(Get-Item C:\Path\To\MyFile.dll).VersionInfo.Comments

8 votes

Cela devrait être la réponse. C'est la seule réponse qui ne repose pas sur des outils prêts à l'emploi.

11 votes

Pipe to fl * pour obtenir toutes les propriétés de VersionInfo : PS C:\> (Get-Item C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe ).VersionInfo | fl *

0 votes

En utilisant cette méthode, j'ai obtenu 0 pour le numéro de version et false pour toutes les propriétés Is*.

61voto

uvts_cvs Points 4163

Utilisez Microsoft Sysinternals Sigcheck . Cet exemple ne produit que la version :

sigcheck -q -n foo.dll

Le fichier sigcheck.exe déballé ne fait que 228 Ko.

8 votes

349 KB cinq ans plus tard... ça vaut toujours la peine ? ;)

1 votes

811 KB x86 et 1121 KB pour les versions x64 en 2021. Je me demande quand il atteindra 10 Mo :)

47voto

Patrick Cuff Points 13362

Vous pouvez écrire un VBScript script pour obtenir les informations sur la version du fichier :

VersionInfo.vbs

set args = WScript.Arguments
Set fso = CreateObject("Scripting.FileSystemObject")
WScript.Echo fso.GetFileVersion(args(0))
Wscript.Quit

Vous pouvez l'appeler depuis la ligne de commande comme ceci :

cscript //nologo VersionInfo.vbs C:\Path\To\MyFile.dll

12voto

bdimych Points 81
C:\>wmic datafile where name="C:\\Windows\\System32\\kernel32.dll" get version
Version
6.1.7601.18229

1 votes

Et vous devez faire partie du groupe des administrateurs pour l'exécuter.

10voto

gbjbaanb Points 31045

Ou vous pouvez en construire un vous-même. Ouvrez VS, créez une nouvelle application console. Créez un projet simple sans support ATL ou MFC, laissez l'option stdafx cochée mais ne cochez pas 'projet vide' et appelez-le VersionInfo.

Vous obtiendrez un projet simple avec 2 fichiers : VersionInfo.cpp et VersionInfo.h

Ouvrez le fichier cpp et collez-y ce qui suit, puis compilez. Vous pourrez l'exécuter, le premier argument est le nom complet du fichier, il s'affichera comme suit "Produit : 5.6.7.8 Fichier : 1.2.3.4" sur la base du bloc de ressources Version. S'il n'y a pas de ressource version, il retournera -1, sinon 0.

Compile en un binaire de 8k en utilisant la dll CRT, 60k avec tout ce qui est lié statiquement (dans les options C++, changez "Code Generation page, Runtime options" en "/MT")

HTH.

PS. Si vous ne voulez pas utiliser Visual Studio, il compilera toujours avec n'importe quel compilateur c++ (croisons les doigts), mais vous devrez certainement changer le #pragma - spécifiez simplement cette librairie dans les paramètres du linker à la place, le pragma est juste un raccourci pour lier automatiquement avec cette librairie.


// VersionInfo.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>

#pragma comment(lib, "version.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD handle = 0;
    DWORD size = GetFileVersionInfoSize(argv[1], &handle);
    BYTE* versionInfo = new BYTE[size];
    if (!GetFileVersionInfo(argv[1], handle, size, versionInfo))
    {
        delete[] versionInfo;
        return -1;
    }
    // we have version information
    UINT    len = 0;
    VS_FIXEDFILEINFO*   vsfi = NULL;
    VerQueryValue(versionInfo, L"\\", (void**)&vsfi, &len);

    WORD fVersion[4], pVersion[4];
    fVersion[0] = HIWORD(vsfi->dwFileVersionMS);
    fVersion[1] = LOWORD(vsfi->dwFileVersionMS);
    fVersion[2] = HIWORD(vsfi->dwFileVersionLS);
    fVersion[3] = LOWORD(vsfi->dwFileVersionLS);
    pVersion[0] = HIWORD(vsfi->dwProductVersionMS);
    pVersion[1] = LOWORD(vsfi->dwProductVersionMS);
    pVersion[2] = HIWORD(vsfi->dwProductVersionLS);
    pVersion[3] = LOWORD(vsfi->dwProductVersionLS);

    printf("Product: %d.%d.%d.%d File: %d.%d.%d.%d\n", 
        pVersion[0], pVersion[1], 
        pVersion[2], pVersion[3], 
        fVersion[0], fVersion[1], 
        fVersion[2], fVersion[3]);
    delete[] versionInfo;

    return 0;
}

0 votes

Ce n'est pas exactement ce que je recherchais, mais c'est quand même intéressant de développer un petit programme pour le faire. Merci.

1 votes

Non ? Quelle information sur la version vouliez-vous ? A priori, Windows n'a que des informations de version stockées dans les blocs de ressources - c'est ce que vous voyez lorsque vous ouvrez les propriétés dans l'explorateur.

1 votes

Bravo ! J'aime aussi développer des roues :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X