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
FINLe 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