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