Форум программистов, компьютерный форум, киберфорум
Наши страницы

PowerShell

Войти
Регистрация
Восстановить пароль
 
K0te1ka
1 / 0 / 0
Регистрация: 11.04.2014
Сообщений: 8
#1

Определить разрядность исполняемых файлов - PowerShell

20.03.2017, 14:00. Просмотров 328. Ответов 5
Метки нет (Все метки)

Всем привет! Подскажите, пожалуйста, как определить с помощью PowerShell разрядность исполняемого файла?
Имеются файлы programma.exe (одна для 64-битных, вторая для 32-битных ОС). Необходимо с помощью PowerShell определить, какая программа перед нами по разрядности. Хэш-суммы и, например, вес файла нельзя использовать т.к. могут быть разные версии.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2017, 14:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить разрядность исполняемых файлов (PowerShell):

Запрет на запуск исполняемых файлов - Администрирование Windows
Подскажите статью как через гпо обычным пользователям (не админам) запретить запуск любых исполняемых файлов кроме папки windows,...

Определить, сколько исполняемых файлов в каталоге /usr/bin - Bash
Помогите написать сценарий на bash. Определить, сколько исполняемых файлов в каталоге /usr/bin. Подсказка:можно предварительно получить...

Каталоги исполняемых файлов - C++
При подключении каталога исполняемых файлов в VS2010, построение даже пустых проектов говорит: 1>InitializeBuildStatus: ...

Исследование исполняемых файлов - Программирование
Пишу программу для анализа исполняемых файлов но возникла проблема. Как узнать файловое смещение таблицы импорта зная ее виртуальный адрес....

Подсчет исполняемых файлов - C Linux
Здарвствуйте. Нужно подсчитать количество исполняемых файлов в текущей папке. Методом гугления смог найти команду, выводящую список...

Копирование исполняемых файлов - CMD/BAT
Скопировать все имеющиеся в каталоге Windows исполняемые файлы в каталог WinEx. Как выбрать именно исполняемые файлы?

5
YuS_2
Любознательный
478 / 416 / 135
Регистрация: 10.03.2016
Сообщений: 912
20.03.2017, 14:46 #2
Вот здесь посмотрите.
1
Убежденный
Ушел с форума
Эксперт С++
15787 / 7224 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
20.03.2017, 16:44 #3
Я на всякий случай добавлю, что разрядность исполняемого файла может не
совпадать с разрядностью процесса.
1
K0te1ka
1 / 0 / 0
Регистрация: 11.04.2014
Сообщений: 8
20.03.2017, 16:47  [ТС] #4
Огромное спасибо! Помогло! Уже встроил эту функцию в свой скрипт)
0
greg zakharov
Покинул форум
1436 / 699 / 174
Регистрация: 07.05.2015
Сообщений: 1,347
Записей в блоге: 40
20.03.2017, 19:52 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от K0te1ka
Огромное спасибо! Помогло! Уже встроил эту функцию в свой скрипт)
Знаете чем плоха функция по приведенной ссылке? Это прежде всего издержки на создание вспомогательной сборки через командлет Add-Type. Конечно же последующие обращения к сборке будут происходить быстрее, но есть как минимум два аргумента не в пользу Add-Type.
1.Прежде, чем создать сборку в памяти, Add-Type "выплюнет" исходный код оной на диск, во временную папку, далее будет проводить синтаксический анализ и если что-то пошло не так (а изменить такой код не составит труда), то выдаст исключение, которое нужно перехватывать. try..catch - также лишние издержки.
2.Лишняя сборка в домене приложений. По этой части, правда, у каждого найдутся свои [контр]аргументы.
Альтернативы? Их достаточно. Например, в PowerShell v2 можно было вызвать GetBinaryType посредством рефлексии.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function Get-BinaryType {
  param(
    [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
    [ValidateNotNullOrEmpty()]
    [ValidateScript({Test-Path $_})]
    [String]$Path
  )
 
  begin {
    ($$ = [PSObject].Assembly.GetType(
      'System.Management.Automation.NativeCommandProcessor'
    )).GetFields([Reflection.BindingFlags]40) |
    Where-Object {$_.Name -cmatch '\ASCS_'} |
    ForEach-Object {$bt = @{}}{
      $bt[$_.GetValue($null)] = $_.Name
    }
    
    $GetBinaryType = $$.GetMethod(
      'GetBinaryTypeA', [Reflection.BindingFlags]40
    )
 
    $Path = Convert-Path $Path
    [Int32]$bintype = 0
  }
  process {
    if (0 -eq $GetBinaryType.Invoke($null, (
      $par = [Object[]]@($Path, $bintype)
    ))) {
      throw ((New-Object ComponentModel.Win32Exception(
        [Runtime.InteropServices.Marshal]::GetLastWin32Error()
      )).Message -replace '%1', $Path)
    }
    $bt[$par[1]]
  }
  end {}
}
В итоге:
PowerShell
1
2
PS E:\sandbox> Get-BinaryType .\app.exe
SCS_64BIT_BINARY
В более поздних версиях не проверял, не до того было.
Что касается универсального способа... по-моему, если производительность играет немаловажную роль, проще читать определенные поля PE файла по известным для оного формата смещениям.
1
Smitis
1627 / 336 / 39
Регистрация: 15.10.2012
Сообщений: 529
01.05.2017, 17:40 #6
По мотивам скрипта, взятом с просторов интернета, путём чтения структуры PE
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function Get-Bitness( $FilePath )
{
    $result = "Unknown"
 
    [int32]$MACHINE_OFFSET = 4
    [int32]$PE_POINTER_OFFSET = 60
 
    if (Test-Path -LiteralPath $FilePath -PathType Leaf)
    {
        [byte[]]$data = New-Object -TypeName System.Byte[] -ArgumentList 4096
        $stream = New-Object -TypeName System.IO.FileStream -ArgumentList ($FilePath, 'Open', 'Read')
        $stream.Read($data, 0, 4096) | Out-Null
        $stream.Close()
 
        [int32]$PE_HEADER_ADDR = [System.BitConverter]::ToInt32($data, $PE_POINTER_OFFSET)
        [int32]$machineUint = [System.BitConverter]::ToUInt16($data, $PE_HEADER_ADDR + $MACHINE_OFFSET)
 
        switch ($machineUint)
        {
            0      { $result = 'Native' }
            0x014c { $result = 'x86' }
            0x0200 { $result = 'Itanium' }
            0x8664 { $result = 'x64' }
        }
    }
    return $result
}
то же в компактном однострочном виде, для удобства вставки в другие скипты
PowerShell
1
function Get-Bitness($FilePath){$result="Unknown";[int32]$MACHINE_OFFSET=4;[int32]$PE_POINTER_OFFSET=60;if(Test-Path -LiteralPath $FilePath -PathType Leaf){[byte[]]$data=New-Object System.Byte[] 4096;$stream=New-Object System.IO.FileStream $FilePath,'Open','Read';$stream.Read($data,0,4096)|Out-Null;$stream.Close();[int32]$PE_HEADER_ADDR=[System.BitConverter]::ToInt32($data,$PE_POINTER_OFFSET);[int32]$machineUint=[System.BitConverter]::ToUInt16($data,$PE_HEADER_ADDR+$MACHINE_OFFSET);switch($machineUint){0{$result='Native'}0x014c{$result='x86'}0x0200{$result='Itanium'}0x8664{$result='x64'}}}return $result}
0
01.05.2017, 17:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2017, 17:40
Привет! Вот еще темы с ответами:

Поиск исполняемых файлов - C Linux
У меня такая задача: найти в заданном каталоге и всех его подкаталогах все исполняемые файлы. Диапазон (мин. мах.) размеров файлов -...

Проблема с загрузкой исполняемых файлов - Windows Vista
При попытке загрузить файл с расширением .ехе или даже если просто набрать ехе в поисковике и нажать энтер компьютер перезагружается. Я уже...

Добавление в проект исполняемых файлов - C#
Как добавить в проект файлы чтобы их можно было потом извлечь? Например добавить prog.exe и извлечь его по надобность из проекта?

Чтение бинарных исполняемых файлов - C++ WinAPI
Пишу программу для загрузки Linux-приложений. Для этого собираюсь отлавливать все вызовы Linux-процедур и подменять их виндовскими. Сам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.