2016-12-19 6 views
4

для Windows EXE-файлы имеют некоторые метаданные, как CompanyName, FileVersion, InternalName, ProductName, OriginalFileName, ProductVersion и т.д.Извлечение внутренних EXE информация

Как извлечь такие метаданные с помощью PHP?

+0

, что информация обычно хранится в DLL-файл еха пытается искать для этого – happymacarts

+0

Нет, it' s хранится внутри exe-файла, и я могу извлечь эту информацию с C# и C++. Мой вопрос заключается в том, как читать эту информацию с PHP. – danielfcand

+0

не уверен, может быть, проверить [этот пост] (http://stackoverflow.com/questions/2479402/calling-cc-library-function-from-php) – happymacarts

ответ

4

мне было любопытно, поэтому я решил написать эту функцию:

function getFileVersionInfo($filename,$encoding='UTF-8'){ 
    $dat = file_get_contents($filename); 
    if($pos=strpos($dat,mb_convert_encoding('VS_VERSION_INFO','UTF-16LE'))){ 
     $pos-= 6; 
     $six = unpack('v*',substr($dat,$pos,6)); 
     $dat = substr($dat,$pos,$six[1]); 
     if($pos=strpos($dat,mb_convert_encoding('StringFileInfo','UTF-16LE'))){ 
      $pos+= 54; 
      $res = []; 
      $six = unpack('v*',substr($dat,$pos,6)); 
      while($six[2]){ 
       $nul = strpos($dat,"\0\0\0",$pos+6)+1; 
       $key = mb_convert_encoding(substr($dat,$pos+6,$nul-$pos-6),$encoding,'UTF-16LE'); 
       $val = mb_convert_encoding(substr($dat,ceil(($nul+2)/4)*4,$six[2]*2-2),$encoding,'UTF-16LE'); 
       $res[$key] = $val; 
       $pos+= ceil($six[1]/4)*4; 
       $six = unpack('v*',substr($dat,$pos,6)); 
      } 
      return $res; 
     } 
    } 
} 

Он работает с 32-битной и 64-битной ехе. Пример использования:

echo "<pre>".print_r(getFileVersionInfo('notepad.exe'),1)."</pre>"; 
echo "<pre>".print_r(getFileVersionInfo('php.exe'),1)."</pre>"; 
echo "<pre>".print_r(getFileVersionInfo('jre-7u9-windows-x64.exe'),1)."</pre>"; 

notepad.exe (32-битный):

Array 
(
    [CompanyName] => Microsoft Corporation 
    [FileDescription] => Notepad 
    [FileVersion] => 6.1.7600.16385 (win7_rtm.090713-1255) 
    [InternalName] => Notepad 
    [LegalCopyright] => © Microsoft Corporation. All rights reserved. 
    [OriginalFilename] => NOTEPAD.EXE 
    [ProductName] => Microsoft® Windows® Operating System 
    [ProductVersion] => 6.1.7600.16385 
) 

php.exe (32-битный):

Array 
(
    [Comments] => Thanks to Edin Kadribasic, Marcus Boerger, Johannes Schlueter, Moriyoshi Koizumi, Xinchen Hui 
    [CompanyName] => The PHP Group 
    [FileDescription] => CLI 
    [FileVersion] => 7.0.12 
    [InternalName] => CLI SAPI 
    [LegalCopyright] => Copyright © 1997-2016 The PHP Group 
    [LegalTrademarks] => PHP 
    [OriginalFilename] => php.exe 
    [ProductName] => PHP 
    [ProductVersion] => 7.0.12 
    [URL] => http://www.php.net 
) 

JRE-7u9-Windows-64. exe (64-bit):

Array 
(
    [CompanyName] => Oracle Corporation 
    [FileDescription] => Java(TM) Platform SE binary 
    [FileVersion] => 7.0.90.5 
    [Full Version] => 1.7.0_09-b05 
    [InternalName] => Setup Launcher 
    [LegalCopyright] => Copyright © 2012 
    [OriginalFilename] => jinstall.exe 
    [ProductName] => Java(TM) Platform SE 7 U9 
    [ProductVersion] => 7.0.90.5 
) 

Что-то интересное о php.exe: Comments и URL не отображаются на вкладке «Сведения». По крайней мере, на моем компьютере.

Наслаждайтесь.

Обновление 1: Я забыл проверить ошибку. Теперь он возвращает null, если информация о версии не существует.

Обновление 2: Огромное спасибо @Abela за то, что привлекли к моей проблеме кодирование.

Я добавил необязательный второй параметр, который по умолчанию соответствует UTF-8, который должен работать для большинства целей. Если вам нужен вывод однобайтных символов, используйте ISO-8859-1 вместо этого, как это:

getFileVersionInfo('php.exe','ISO-8859-1'); 
+1

@ ray-rardin - хороший помощник по работе, я могу [подтвердить] (https://i.stag.imgur.com/NCNev.png), что он работает на моем конце * (Windows 2012 64-битный сервер) * – Abela

+1

@ Абела Спасибо за подтверждение и скриншот. Я заметил символ авторского права. Я, вероятно, должен изменить ISO-8859-1 на UTF-8. – Rei

+1

Да, я действительно заметил, что * после * взял и загрузил скриншот.Я сразу переключил код на использование 'UTF-8', и он разрешил его, мне просто не хотелось загружать новое изображение. Теперь просто посмотрим, примет ли @danielfcand это как ответ;) – Abela

 Смежные вопросы

  • Нет связанных вопросов^_^