«
»
Récupérer les attributs d’un exécutable

Récupérer les attributs d’un exécutable

Le WLangage contient quelques fonctions pour trouver les caractéristiques d’un fichier : fTaille(), fAttribut(), fDateHeure(),…  La fenêtre des propriétés d’un exécutable, dans l’explorateur de fichiers de Windows, contient une multitude d’autres valeurs. Comment les récupérer ?

En se basant sur la classe cConsole, et en exécutant 2 commandes powershell, il est donc possible de récupérer ces attributs, dont ceux qui concernent la signature du fichier (voir Certifier une application WinDev en 6 étapes).

Le résultat est mis, ici, sous forme de structure pour faciliter son accès.

STFileProperty est une Structure
	sInternalName						est une chaîne
	sOriginalFileName					est une chaîne
	nFileBuildPart						est un entier
	nFileMajorPart						est un entier
	nFileMinorPart						est un entier
	nFilePrivatePart					est un entier
	nProductBuildPart					est un entier
	nProductMajorPart					est un entier
	nProductMinorPart					est un entier
	nProductPrivatePart					est un entier
	sFileVersion						est une chaîne
	sFileDescription					est une chaîne
	sProduct						est une chaîne
	sProductVersion						est une chaîne
	sSpecialBuild						est une chaîne
	bDebug							est un booléen
	bPatch							est un booléen
	bPreRelease						est un booléen
	bSpecialBuild						est un booléen
	bPrivateBuild						est un booléen
	sPrivateBuild						est une chaîne
	sLanguage						est une chaîne
	sComments						est une chaîne
	sCompanyName						est une chaîne
	sProductName						est une chaîne
	sLegalCopyright						est une chaîne
	sLegalTrademarks					est une chaîne
	sCertificateSignerSubject				est une chaîne
	sCertificateSignerIssuer				est une chaîne
	sCertificateSignerSerialNumber				est une chaîne
	dhCertificateSignerNotBefore				est une DateHeure
	dhCertificateSignerNotAfter				est une DateHeure
	sCertificateSignerThumbprint				est une chaîne
	sCertificateTimeStamperSubject				est une chaîne
	sCertificateTimeStamperIssuer				est une chaîne
	sCertificateTimeStamperSerialNumber			est une chaîne
	dhCertificateTimeStamperNotBefore			est une DateHeure
	dhCertificateTimeStamperNotAfter			est une DateHeure
	sCertificateTimeStamperThumbprint			est une chaîne
	sCertificateStatus					est une chaîne
	sCertificateStatusMessage				est une chaîne
FIN
stUneInfo est un STFileProperty
sCheminFichier est une chaîne = //ICI VOTRE FICHIER
SI fFichierExiste(sCheminFichier) ALORS	//gestion par volume
	clMaConsole		est un cConsole
	sSuivant,sLigne		est une chaîne
	bTimeStamper		est un booléen
	sPowerShellCmd		est une chaîne ANSI	= "Powershell.exe -Command "
	sMaCommande		est une chaîne ANSI	= "Get-AuthenticodeSignature '"+sCheminFichier+"' | Format-List"
	clMaConsole.SetCmd(sPowerShellCmd + sMaCommande)
	clMaConsole.ExécuterCmd()
	sRésultat			est une chaîne ANSI = OemVersAnsi(clMaConsole.Sortie())
 
	POUR TOUTE CHAÎNE sLigne DE sRésultat SÉPARÉE PAR RC
		sLigne=SansEspace(sLigne)
		SI sLigne="TimeStamperCertificate : [Subject]" ALORS 
			bTimeStamper=Vrai;sSuivant="sCertificateTimeStamperSubject"
		SINON SI bTimeStamper ALORS
			SELON sLigne
				CAS "[Issuer]"			: sSuivant="sCertificateTimeStamperIssuer"
				CAS "[Serial Number]"		: sSuivant="sCertificateTimeStamperSerialNumber"
				CAS "[Not Before]"		: sSuivant="dhCertificateTimeStamperNotBefore"
				CAS "[Not After]"		: sSuivant="dhCertificateTimeStamperNotAfter"
				CAS "[Thumbprint]"		: sSuivant="sCertificateTimeStamperThumbprint"	
				AUTRE CAS
					SELON SansEspace(ExtraitChaîne(sLigne,1,":"))
						CAS "Status"						: stUneInfo.sCertificateStatus 			= SansEspace(ExtraitChaîne(sLigne,2,":"))
						CAS "StatusMessage"					: stUneInfo.sCertificateStatusMessage 	= SansEspace(ExtraitChaîne(sLigne,2,":"))
						AUTRE CAS
							SI sLigne~="" ALORS 
								sSuivant=""
							SINON SI sSuivant>"" ALORS
								SI sSuivant DANS ("dhCertificateTimeStamperNotBefore","dhCertificateTimeStamperNotAfter") ALORS
									{"stUneInfo."+sSuivant,indVariable}=ChaîneVersDate(Gauche(sLigne,10),"AAAA-MM-JJ")+ChaîneVersHeure(Milieu(sLigne,12,8),"HH:MM:SS")
								SINON
									{"stUneInfo."+sSuivant,indVariable}+=sLigne
								FIN
							FIN
					FIN			
			FIN
		SINON
			SELON sLigne
				CAS "SignerCertificate      : [Subject]"	: sSuivant="sCertificateSignerSubject"
				CAS "[Issuer]"					: sSuivant="sCertificateSignerIssuer"	
				CAS "[Serial Number]"				: sSuivant="sCertificateSignerSerialNumber"
				CAS "[Not Before]"				: sSuivant="dhCertificateSignerNotBefore"
				CAS "[Not After]"				: sSuivant="dhCertificateSignerNotAfter"
				CAS "[Thumbprint]"				: sSuivant="sCertificateSignerThumbprint"
				AUTRE CAS
					SI sLigne~="" ALORS 
						sSuivant=""
					SINON SI sSuivant>"" ALORS
						SI sSuivant DANS ("dhCertificateSignerNotBefore","dhCertificateSignerNotAfter") ALORS
							{"stUneInfo."+sSuivant,indVariable}=ChaîneVersDate(Gauche(sLigne,10),"AAAA-MM-JJ")+ChaîneVersHeure(Milieu(sLigne,12,8),"HH:MM:SS")
						SINON
							{"stUneInfo."+sSuivant,indVariable}+=sLigne
						FIN
					FIN
			FIN
		FIN	
	FIN
 
	sMaCommande		= "Get-childitem '"+sCheminFichier+"' | % {$_.VersionInfo} | Select *"
	clMaConsole.SetCmd(sPowerShellCmd + sMaCommande)
	clMaConsole.ExécuterCmd()
	sRésultat		= OemVersAnsi(clMaConsole.Sortie())
	sSuivant		= ""
	POUR TOUTE CHAÎNE sLigne DE sRésultat SÉPARÉE PAR RC
		sLigne=SansEspace(sLigne)
		SI sLigne[[1]]>"" ALORS
			SELON SansEspace(ExtraitChaîne(sLigne,1,":"))
				CAS "Comments"					: sSuivant="scomments"
				CAS "CompanyName"				: sSuivant="sCompanyName"
				CAS "FileDescription"				: sSuivant="sFileDescription"
				CAS "FileBuildPart"				: sSuivant="nFileBuildPart"
				CAS "FileMajorPart"				: sSuivant="nFileMajorPart"
				CAS "FileMinorPart"				: sSuivant="nFileMajorPart"
				CAS "FilePrivatePart"				: sSuivant="nFilePrivatePart"
				CAS "FileVersion"				: sSuivant="sFileVersion"
				CAS "InternalName"				: sSuivant="sInternalName"
				CAS "IsDebug"					: sSuivant="bDebug"
				CAS "IsPatched"					: sSuivant="bPatch"
				CAS "IsPrivateBuild"				: sSuivant="bPrivateBuild"
				CAS "IsPreRelease"				: sSuivant="bPreRelease"
				CAS "IsSpecialBuild"				: sSuivant="bSpecialBuild"
				CAS "Language"					: sSuivant="sLanguage"
				CAS "LegalCopyright"				: sSuivant="sLegalCopyright"
				CAS "LegalTrademarks"				: sSuivant="sLegalTrademarks"
				CAS "OriginalFilename"				: sSuivant="sOriginalFilename"
				CAS "PrivateBuild"				: sSuivant="sPrivateBuild"
				CAS "ProductBuildPart"				: sSuivant="nProductBuildPart"
				CAS "ProductMajorPart"				: sSuivant="nProductMajorPart"
				CAS "ProductMinorPart"				: sSuivant="nProductMinorPart"
				CAS "ProductName"				: sSuivant="sProductName"
				CAS "ProductPrivatePart"			: sSuivant="nProductPrivatePart"
				CAS "ProductVersion"				: sSuivant="sProductVersion"
				CAS "SpecialBuild"				: sSuivant="sSpecialBuild"
				AUTRES CAS					: sSuivant=""
			FIN
			SI PAS sLigne~="" _ET_ sSuivant>"" ALORS	
				{"stUneInfo."+sSuivant,indVariable}+=(sSuivant[[1]]="b" ? SansEspace(ExtraitChaîne(sLigne,2,":"))="True" SINON SansEspace(ExtraitChaîne(sLigne,2,":")))
			SINON
				sSuivant=""
			FIN
		FIN
	FIN
FIN

Le résultat est mis ici sous forme de structure pour faciliter son accès.

STFileProperty est une Structure
	sInternalName						est une chaîne
	sOriginalFileName					est une chaîne
	nFileBuildPart						est un entier
	nFileMajorPart						est un entier
	nFileMinorPart						est un entier
	nFilePrivatePart					est un entier
	nProductBuildPart					est un entier
	nProductMajorPart					est un entier
	nProductMinorPart					est un entier
	nProductPrivatePart					est un entier
	sFileVersion						est une chaîne
	sFileDescription					est une chaîne
	sProduct						est une chaîne
	sProductVersion						est une chaîne
	sSpecialBuild						est une chaîne
	bDebug							est un booléen
	bPatch							est un booléen
	bPreRelease						est un booléen
	bSpecialBuild						est un booléen
	bPrivateBuild						est un booléen
	sPrivateBuild						est une chaîne
	sLanguage						est une chaîne
	sComments						est une chaîne
	sCompanyName						est une chaîne
	sProductName						est une chaîne
	sLegalCopyright						est une chaîne
	sLegalTrademarks					est une chaîne
	sCertificateSignerSubject				est une chaîne
	sCertificateSignerIssuer				est une chaîne
	sCertificateSignerSerialNumber				est une chaîne
	dhCertificateSignerNotBefore				est une DateHeure
	dhCertificateSignerNotAfter				est une DateHeure
	sCertificateSignerThumbprint				est une chaîne
	sCertificateTimeStamperSubject				est une chaîne
	sCertificateTimeStamperIssuer				est une chaîne
	sCertificateTimeStamperSerialNumber			est une chaîne
	dhCertificateTimeStamperNotBefore			est une DateHeure
	dhCertificateTimeStamperNotAfter			est une DateHeure
	sCertificateTimeStamperThumbprint			est une chaîne
	sCertificateStatus					est une chaîne
	sCertificateStatusMessage				est une chaîne
FIN
stUneInfo est un STFileProperty
sCheminFichier est une chaîne = //ICI VOTRE FICHIER
SI fFichierExiste(sCheminFichier) ALORS	//gestion par volume
	clMaConsole		est un cConsole
	sSuivant,sLigne		est une chaîne
	bTimeStamper		est un booléen
	sPowerShellCmd		est une chaîne ANSI	= "Powershell.exe -Command "
	sMaCommande		est une chaîne ANSI	= "Get-AuthenticodeSignature '"+sCheminFichier+"' | Format-List"
	clMaConsole.SetCmd(sPowerShellCmd + sMaCommande)
	clMaConsole.ExécuterCmd()
	sRésultat			est une chaîne ANSI = OemVersAnsi(clMaConsole.Sortie())
 
	POUR TOUTE CHAÎNE sLigne DE sRésultat SÉPARÉE PAR RC
		sLigne=SansEspace(sLigne)
		SI sLigne="TimeStamperCertificate : [Subject]" ALORS 
			bTimeStamper=Vrai;sSuivant="sCertificateTimeStamperSubject"
		SINON SI bTimeStamper ALORS
			SELON sLigne
				CAS "[Issuer]"			: sSuivant="sCertificateTimeStamperIssuer"
				CAS "[Serial Number]"		: sSuivant="sCertificateTimeStamperSerialNumber"
				CAS "[Not Before]"		: sSuivant="dhCertificateTimeStamperNotBefore"
				CAS "[Not After]"		: sSuivant="dhCertificateTimeStamperNotAfter"
				CAS "[Thumbprint]"		: sSuivant="sCertificateTimeStamperThumbprint"	
				AUTRE CAS
					SELON SansEspace(ExtraitChaîne(sLigne,1,":"))
						CAS "Status"						: stUneInfo.sCertificateStatus 			= SansEspace(ExtraitChaîne(sLigne,2,":"))
						CAS "StatusMessage"					: stUneInfo.sCertificateStatusMessage 	= SansEspace(ExtraitChaîne(sLigne,2,":"))
						AUTRE CAS
							SI sLigne~="" ALORS 
								sSuivant=""
							SINON SI sSuivant>"" ALORS
								SI sSuivant DANS ("dhCertificateTimeStamperNotBefore","dhCertificateTimeStamperNotAfter") ALORS
									{"stUneInfo."+sSuivant,indVariable}=ChaîneVersDate(Gauche(sLigne,10),"AAAA-MM-JJ")+ChaîneVersHeure(Milieu(sLigne,12,8),"HH:MM:SS")
								SINON
									{"stUneInfo."+sSuivant,indVariable}+=sLigne
								FIN
							FIN
					FIN			
			FIN
		SINON
			SELON sLigne
				CAS "SignerCertificate      : [Subject]"	: sSuivant="sCertificateSignerSubject"
				CAS "[Issuer]"					: sSuivant="sCertificateSignerIssuer"	
				CAS "[Serial Number]"				: sSuivant="sCertificateSignerSerialNumber"
				CAS "[Not Before]"				: sSuivant="dhCertificateSignerNotBefore"
				CAS "[Not After]"				: sSuivant="dhCertificateSignerNotAfter"
				CAS "[Thumbprint]"				: sSuivant="sCertificateSignerThumbprint"
				AUTRE CAS
					SI sLigne~="" ALORS 
						sSuivant=""
					SINON SI sSuivant>"" ALORS
						SI sSuivant DANS ("dhCertificateSignerNotBefore","dhCertificateSignerNotAfter") ALORS
							{"stUneInfo."+sSuivant,indVariable}=ChaîneVersDate(Gauche(sLigne,10),"AAAA-MM-JJ")+ChaîneVersHeure(Milieu(sLigne,12,8),"HH:MM:SS")
						SINON
							{"stUneInfo."+sSuivant,indVariable}+=sLigne
						FIN
					FIN
			FIN
		FIN
 
	FIN
 
	sMaCommande		= "Get-childitem '"+sCheminFichier+"' | % {$_.VersionInfo} | Select *"
	clMaConsole.SetCmd(sPowerShellCmd + sMaCommande)
	clMaConsole.ExécuterCmd()
	sRésultat		= OemVersAnsi(clMaConsole.Sortie())
	sSuivant		= ""
	POUR TOUTE CHAÎNE sLigne DE sRésultat SÉPARÉE PAR RC
		sLigne=SansEspace(sLigne)
		SI sLigne[[1]]>"" ALORS
			SELON SansEspace(ExtraitChaîne(sLigne,1,":"))
				CAS "Comments"					: sSuivant="scomments"
				CAS "CompanyName"				: sSuivant="sCompanyName"
				CAS "FileDescription"				: sSuivant="sFileDescription"
				CAS "FileBuildPart"				: sSuivant="nFileBuildPart"
				CAS "FileMajorPart"				: sSuivant="nFileMajorPart"
				CAS "FileMinorPart"				: sSuivant="nFileMajorPart"
				CAS "FilePrivatePart"				: sSuivant="nFilePrivatePart"
				CAS "FileVersion"				: sSuivant="sFileVersion"
				CAS "InternalName"				: sSuivant="sInternalName"
				CAS "IsDebug"					: sSuivant="bDebug"
				CAS "IsPatched"					: sSuivant="bPatch"
				CAS "IsPrivateBuild"				: sSuivant="bPrivateBuild"
				CAS "IsPreRelease"				: sSuivant="bPreRelease"
				CAS "IsSpecialBuild"				: sSuivant="bSpecialBuild"
				CAS "Language"					: sSuivant="sLanguage"
				CAS "LegalCopyright"				: sSuivant="sLegalCopyright"
				CAS "LegalTrademarks"				: sSuivant="sLegalTrademarks"
				CAS "OriginalFilename"				: sSuivant="sOriginalFilename"
				CAS "PrivateBuild"				: sSuivant="sPrivateBuild"
				CAS "ProductBuildPart"				: sSuivant="nProductBuildPart"
				CAS "ProductMajorPart"				: sSuivant="nProductMajorPart"
				CAS "ProductMinorPart"				: sSuivant="nProductMinorPart"
				CAS "ProductName"				: sSuivant="sProductName"
				CAS "ProductPrivatePart"			: sSuivant="nProductPrivatePart"
				CAS "ProductVersion"				: sSuivant="sProductVersion"
				CAS "SpecialBuild"				: sSuivant="sSpecialBuild"
				AUTRES CAS					: sSuivant=""
			FIN
			SI PAS sLigne~="" _ET_ sSuivant>"" ALORS	
				{"stUneInfo."+sSuivant,indVariable}+=(sSuivant[[1]]="b" ? SansEspace(ExtraitChaîne(sLigne,2,":"))="True" SINON SansEspace(ExtraitChaîne(sLigne,2,":")))
			SINON
				sSuivant=""
			FIN
		FIN
	FIN
 
FIN