|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Альтернатива Add-Type |
|
PowerShell - Альтернатива Add-Type
|
Забанен Сообщения: 27 |
Доброго времени суток! Собственно интересует сабж. Можно как-то обойтись без этогодурацкого командлета, который к тому же для компиляции кода создаёт временный файл в папке temp? Есть ли более, скажем так, изящные способы вызова WinAPI?
|
|
Отправлено: 08:56, 02-09-2016 |
Ветеран Сообщения: 1259
|
Профиль | Отправить PM | Цитировать |
Последний раз редактировалось Kazun, 02-09-2016 в 09:19. Отправлено: 09:11, 02-09-2016 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Забанен Сообщения: 793
|
Альтернативных способов более, чем достаточно. Начнем с того, что непосредственно 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) Шагаем дальше. Рефлексия в купе с обобщенными делегатами так же позволяет вызывать апишные функции. $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 } } В том же $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 } Есть и другоие варианты, но перечислять их здесь все слишком утомительно. |
Отправлено: 09:50, 02-09-2016 | #3 |
Забанен Сообщения: 27
|
Цитата Kazun:
Цитата greg zakharov:
|
||
Отправлено: 10:11, 02-09-2016 | #4 |
Забанен Сообщения: 793
|
Объясняю. Все это писалось для себя, так как подавляющее большинство использует Add-Type, поэтому вряд ли здесь последует детальное описание. Ко всему прочему вопрос был о WinAPI, а не о сторонних расширениях
![]() |
|
Отправлено: 13:33, 04-09-2016 | #5 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Мультимедиа - [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 |
|