Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Альтернатива Add-Type

Ответить
Настройки темы
PowerShell - Альтернатива Add-Type

Новый участник


Сообщения: 13
Благодарности: 1

Профиль | Отправить PM | Цитировать


Доброго времени суток! Собственно интересует сабж. Можно как-то обойтись без этогодурацкого командлета, который к тому же для компиляции кода создаёт временный файл в папке temp? Есть ли более, скажем так, изящные способы вызова WinAPI?

Отправлено: 08:56, 02-09-2016

 

Ветеран


Microsoft MVP


Сообщения: 1258
Благодарности: 859

Профиль | Отправить PM | Цитировать


Модуль PsReflect - http://www.powershellmagazine.com/20...ons-in-memory/

Последний раз редактировалось Kazun, 02-09-2016 в 09:19.


Отправлено: 09:11, 02-09-2016 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 477
Благодарности: 152

Профиль | Цитировать


Альтернативных способов более, чем достаточно. Начнем с того, что непосредственно Add-Type можно "перегрузить" с помощью прокси-функции, добавив в него поддержку, скажем, Python, который адепты "синего" не жалуют, а между тем с его помощью вызов апишных функций упрощается в разы. Можно посредством рефлексии задействовать сигнатуры апишных функций, определенных в сборках самого фреймворка.
Код: Выделить весь код
$ptr = [Runtime.InteropServices.Marshal]::AllocHGlobal(48)

if ([Regex].Assembly.GetType(
  'Microsoft.Win32.NativeMethods'
).GetMethod(
  'NtQuerySystemInformation'
).Invoke($null, @(3, $ptr, 48, 0)) -eq 0) {
  [TimeSpan]::FromMilliseconds(
    [Runtime.InteropServices.Marshal]::ReadInt64($ptr, 8) -
    [Runtime.InteropServices.Marshal]::ReadInt64($ptr)
  )
}

[Runtime.InteropServices.Marshal]::FreeHGlobal($ptr)
Пример выше вычисляет uptime системы.
Шагаем дальше.
Рефлексия в купе с обобщенными делегатами так же позволяет вызывать апишные функции.
Код: Выделить весь код
$max, $min, $cur = [Byte[]]@(0, 0, 0, 0), [Byte[]]@(0, 0, 0, 0), [Byte[]]@(0, 0, 0, 0)
if ((New-PSDllObject).def(
  'ntdll', 'NtQueryTimerResolution',
  '[Func[[Byte[]], [Byte[]], [Byte[]], Int32]]'
).Invoke($max, $min, $cur) -eq 0) {
  $max, $min, $cur | ForEach-Object { [BitConverter]::ToInt32($_, 0) / 10000 }
}
New-PSDllObject - это набросок модуля $psdll, совмещающий в себе несколько техник вызова winapi. Что же непосредственно кода выше. Следует иметь в виду, что обобщенные делегаты Action и Func не поддерживают параметры с модификаторами ref/out, но это ограничение в некоторых случаях обходится в виде передачи в качестве параметра вызываемой функции массива байт.
В том же $psdll определен метод pin - эквивалент DllImport в C#.
Код: Выделить весь код
$psdll = New-PSDllObject

$e = $psdll.enum('NT_PRODUCT_TYPE', [UInt32], @{
  NtProductWinNt = 1
  NtProductLanManNt = 2
  NtProductServer = 3
})

[UInt32]$product = 0
$p = $psdll.pin('ntdll', 'RtlGetProductType', [Boolean], @([UInt32].MakeByRefType()))
if ($p::RtlGetProductType([ref]$product)) {
  $product -as $e
}
Следует иметь в виду, что $psdll не тестировался всесторонне, хотя и является реинкарнацией другого мого черновика.
Есть и другоие варианты, но перечислять их здесь все слишком утомительно.
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:50, 02-09-2016 | #3


Новый участник


Сообщения: 13
Благодарности: 1

Профиль | Отправить PM | Цитировать


Отличительная черта всех MVP'шников давать ссылку на собрата, причём благо ссылка была стоящая, а то так, барахло плодящее в домене приложений кучу сборок. Не айс.

Цитата greg zakharov:
Альтернативных способов более, чем достаточно...
Весьма познавательно, спасибо. $psdll при беглом осмотре оказался неплохой штуковиной, правда несколько надуманно в ней создание перечислений. На счёт структур совсем непонятно, может исправите или объясните более подробно?

Отправлено: 10:11, 02-09-2016 | #4


Старожил


Сообщения: 477
Благодарности: 152

Профиль | Цитировать


Объясняю. Все это писалось для себя, так как подавляющее большинство использует Add-Type, поэтому вряд ли здесь последует детальное описание. Ко всему прочему вопрос был о WinAPI, а не о сторонних расширениях

Отправлено: 13:33, 04-09-2016 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Альтернатива Add-Type

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Мультимедиа - [add-on] JetAudio 8.x Virtyaluk Наборы обновлений для Windows XP/2003/Windows 7 23 23-03-2014 20:02
Proxy/NAT - Команда route add keysi_ Сетевые технологии 5 27-02-2011 08:55
Add-ons vamone Тест-форум 5 22-03-2010 11:13
Разное - [add-on] MP3 Dancer Master of Magic Наборы обновлений для Windows XP/2003/Windows 7 12 04-06-2007 01:24
(solved) reg add и %1 arial Автоматическая установка Windows 2000/XP/2003 6 21-11-2005 18:17




 
Переход