|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум 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 | |
|