Последняя поддерживающая Windows XP версия OpenVPN это 2.3.18.
— Версия x86 (32-разрядная)
— Версия x64 (64-разрядная)
Последняя поддерживающая Windows XP версия OpenVPN это 2.3.18.
— Версия x86 (32-разрядная)
— Версия x64 (64-разрядная)
Чтоб не пролюбилось, мало ли с официального сайта пропадет, а понадобится:
Продолжаем разговор о своем окне, всплывающем возле области уведомлений, там где NotifyIcon
. Как в тех же мессенджерах при появлении нового сообщения.
На самом деле все оказывается довольно просто, и даже Ктулху вызывать пользоваться WinAPI не надо.
На первом этапе моделируем будущую всплывающую форму. Я, например, создал форму без границ (FormBorderStyle = none
), поместил на нее TextBox
, который будет отображать сообщение и PictureBox
, который будет работать в качестве кнопки закрытия формы.
На форму добавляем необходимые компоненты, которые отвечают за отображение информации и таймер (tmrAni
), который будет отвечать за анимацию всплытия формы.
1. Заводим переменные, сохраняющие позиции формы:
private int StartPosX; private int StartPosY;
Ну я еще добавил переменную для сообщения и экспортировал функцию WinAPI, прячущую текстовый курсор:
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool HideCaret(IntPtr hWnd);
public string MessageText = "";
Плюс настроил в инициализации формы некоторые ее параметры:
public frmPopup() { InitializeComponent(); //Настройка формы this.TopMost = false; this.ShowInTaskbar = false; }
TopMost = false
нужен, чтоб форма всплывала из-за области уведомлений, а не загораживала ее собой.
2. Переопределяем обработчик события Load
и в нем прячем форму за экран:
protected override void OnLoad(EventArgs e) { //Прячем форму за экран StartPosX = Screen.PrimaryScreen.WorkingArea.Width - this.Width; StartPosY = Screen.PrimaryScreen.WorkingArea.Height; SetDesktopLocation(StartPosX, StartPosY); base.OnLoad(e); //запуск анимации всплытия tmrAni.Interval = 50; tmrAni.Start(); }
Туда же можно вставить запуск таймера, который будет анимировать всплытие формы (после base.OnLoad(e)
).
Если просто вставить этот код в обработчик события Load
, то форма на секунду появится на экране, и будет некрасиво.
3. Далее в обработчиках событий Load
и Shown
настраиваем нашу форму, например, присваиваем TextBox
нужный текст и т.д.
private void frmPopup_Load(object sender, EventArgs e) { //настраиваем TextBox с сообщением txtMessage.Height = this.Height - txtMessage.Location.Y - 3; txtMessage.Width = this.Width - txtMessage.Location.X - 3; txtMessage.BorderStyle = BorderStyle.None; txtMessage.BackColor = this.BackColor; txtMessage.Text = MessageText; txtMessage.ReadOnly = true; txtMessage.SelectionStart = 0; //и кнопку закрытия int CloseX = this.Width - pbClose.Width - 3; int CloseY = 3; pbClose.Location = new Point(CloseX, CloseY); } private void frmPopup_Shown(object sender, EventArgs e) { HideCaret(txtMessage.Handle); }
3. При каждом срабатывании таймера поднимаем форму на 5 пикселей, а когда форма покажется полностью, то останавливаем таймер и делаем ее «поверх всех окон» (TopMost = true;
):
private void tmrAni_Tick(object sender, EventArgs e) { //поднимаем форму на 5 пикселей StartPosY -= 5; //Если окно видно полностью - останавливаем таймер if (StartPosY < Screen.PrimaryScreen.WorkingArea.Height - Height) { tmrAni.Stop(); this.TopMost = true; } else { SetDesktopLocation(StartPosX, StartPosY); } }
Вот, что получилось:
Спрашивают, как можно сделать всплывающую форму над областью уведомлений, там где «часики» и иконки запущенных в фоне программ. Ну типа как это делается в мессенджерах при получении нового сообщения.
Вот, нашел вам готовый код. Выглядит вполне симпатично.
Можно поиграть с разными опциями, типа эффекта появления и звука при всплытии. Минус — сильно длинный текст отобразить без допиливания не получится.
Потом расскажу, как самому сделать что-то подобное, пусть и не такое симпатичное.
Принесли тут в починку (причем уже второй) такой вот недобук. Убил полдня на него, пришлось делать отдельный дистрибутив XP, из которого было выкинуто почти все лишнее, чтоб влез.
А вот архив для него с родными дровами, софтом и всем прочим. На всякий случай, мало ли кому надо будет.
Заметка от склероза, как обычно.
1. Качаем PHP и распаковываем архив в нужный каталог. Пусть для примера будет D:\Software\php
2. Копируем свой php.ini
в этот каталог, или php.ini-development
переименовываем в php.ini
3. Находим в секции [PHP]
параметр extension_dir
и меняем его значение на D:\Software\php\ext
4. Создаем в подкаталоге php
каталог tmp
, для временных файлов PHP
5. В секции [PHP]
находим параметр sys_temp_dir
и меняем значение на D:\Software\php\tmp
extension_dir = "D:\Software\php\ext"
sys_temp_dir = "D:\Software\php\tmp"
PHP для Windows слэши в путях (прямой или обратный) не важны, правильно переваривается и тот и тот:
extension_dir = "D:/Software/php/ext"
sys_temp_dir = "D:/Software/php/tmp"
6. Раскомментируем нужные расширения, например:
extension=bz2
extension=fileinfo
extension=gd2
extension=gettext
7. Если в проекте планируется использовать cURL, то добавляем в переменную окружения PATH
каталоги с php.ini
(D:\Software\php
) экзешником curl.exe
и библиотекой php_curl.dll
1. Установка Apache 2.4VC14 + PHP 7 на Windows 7 - 10
2. Настройка curl php на Windows
По многочисленным просьбам зрителей, сделал римейк собственных недавних скриптов (копия копия), только теперь для Windows.
Написал небольшую программулину на C#, которая делает то же самое, что и вышеописанные скрипты.
— для распаковки ZIP-архивов использовал библиотеку DotNetZip, она же Ionic.Zip (копия)
— а для распознавания пароля на картинке, не мудрствуя лукаво, вызвал tesseract
, естественно, версию под Windows.
Она в архиве с готовыми бинарниками самой программы, единственное, что может потребоваться, это поставить VCRedist для Visual C++ 2015
— Программу
— Библиотеки для работы tesseract:
— Visual C++ Redistributable for Visual Studio 2015 (c сайта Microsoft)
— vc_redist.x86.exe
— vc_redist.x64.exe
Он же папка профиля пользователя, т.е., C:\Users\<имя пользователя>
, например C:\Users\Tolik
для пользователя Tolik
.
Проще всего посмотреть в переменную окружения USERPROFILE
:
Environment.GetEnvironmentVariable("USERPROFILE");
Для .NET Framework 4 и выше, путь к каталогу профиля пользователя добавлен в перечисление Environment.SpecialFolder
под именем UserProfile
. Таким образом, получить папку пользователя можно вот так:
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
static void Main() { string UserProfile = Environment.GetEnvironmentVariable("USERPROFILE"); MessageBox.Show(UserProfile, "User profile folder path", MessageBoxButtons.OK, MessageBoxIcon.Information); }
Одна из частых задач при создании инсталлятора — определить версию и архитектуру ОС, например, чтобы в зависимости от этого подкладывать нужную версию экзешника, или устанавливать нужный драйвер.
Для отображения версии Windows можно воспользоваться готовым кодом из NSIS wiki. На выбор предоставлены два скрипта: только для клиентских ОС и для клиентских и серверных. Для своих целей я пользовался вторым, правда в нем есть небольшой баг — клиентская Windows XP x64 определяется как Windows Server 2003:
Создаем отдельный пустой NSIS-скрипт, копируем туда код из wiki, и сохраняем в тот же каталог, где находится основной скрипт инсталлятора под любым удобным названием, например gvv.nsi
.
В основном скрипте подключаем этот файл:
!include gvv.nsi
Далее вызываем GetWindowsVersion
, записываем результат в переменную (например, в предопределенную $R0
) и выводим результат:
${GetWindowsVersion} $R0
DetailPrint "Windows Version: $R0"
Так сказать, «точное» определение версии. Применяется, когда надо выполнить определенные действия, например, в XP и только в XP, или в семерке и только в семерке.
Для этого в комплекте есть модуль WinVer.nsh
, сначала подключим его:
!include WinVer.nsh
Далее используем if
и один из макросов IsWin?
, например IsWinXP
, IsWin7
, IsWin10
:
${If} ${IsWinXP} DetailPrint "Is Windows XP" ${EndIf}
Применяется, когда нужно выполнять код, если версия ОС выше нужной или нужная.
В WinVer.nsh
есть другой комплект макросов — AtLeastWin?
(AtLeastWin7
, AtLeastWin8
, AtLeastWin10
) которые также нужно использовать вместе с if
. Например, следующий код сработает на «семерке» и всех последующих версиях Windows. В деталях установки отобразится соответствующее сообщение:
${If} ${AtLeastWin7} DetailPrint "Is Windows 7 or higher" ${EndIf}
Для определения архитектуры ОС необходимо подключить модуль x64.nsh
(также поставляется вместе с компилятором NSIS):
!include x64.nsh
Поддерживается определение архитектуры x86 (IsNativeIA32
), PC (AMD) x64 (IsNativeAMD64
) и ARM64 (IsNativeARM64
) пример кода есть в самом файле x64.nsh
🙂 Мне ARM была не нужна, поэтому пример кода на три строки короче:
${If} ${IsNativeAMD64} DetailPrint "System Architecture: x64" ${ElseIf} ${IsNativeIA32} DetailPrint "System Architecture: x86" ${Else} DetailPrint "Unsupported CPU architecture!" ${EndIf}
1. Get Windows version
2. Stackoverflow
Изучение любого языка начинается с Hello, world, вот и я не буду отступать от этой традиции. Напишем простой инсталлятор, который даже не инсталлятор, потому что ничего не устанавливает, а просто пишет сообщение пользователю.
Name "HelloWorld" OutFile "helloworld.exe" ShowInstDetails show RequestExecutionLevel User Section DetailPrint "Hello, world!" SectionEnd
Сначала пишем обязательную конструкцию Name
и придумываем имя установщика, тут, естественно, "HelloWorld"
. Имя может содержать пробелы, оно будет отображаться в заголовках окон и окнах инсталлятора, а также попадет в список программ в «Программы и компоненты», в случае реального установщика.
Далее идет обязательная конструкция OutFile
— файл установщика. Если его не прописать, то компилятор не будет знать под каким именем собрать программу установки и пошлет нас.
Следующим шагом (ShowInstDetails show
) развернем окно с логом установки, как это было описано в предыдущей копия заметке.
Теперь запрашиваем запуск из под пользователя с ограниченными правами (RequestExecutionLevel User
). Инсталляторы обычно запускаются с правами администратора, но в данном случае мы ничего не устанавливаем, и нажимать лишний раз кнопку в окошке UAC не нужно.
Далее необходимо завести хотя бы одну секцию. Если в скрипте не будет хотя бы одной секции — компилятор прервет работу. Организуем единственную секцию без названия.
Section [ТУТ БУДЕТ КОД] SectionEnd
На самом деле секции нужны для того, чтобы сделать возможным выбор компонентов устанавливаемой программы, полную или выборочную установку. Но об этом как-нибудь в другой раз.
Внутри секции пишем сообщение, выводящее заданный текст в окошко с логом (деталями установки):
DetailPrint "Hello, world!"
На самом деле выбора не так, чтобы много, но какой-никакой есть. На официальном сайте предлагают пользоваться Eclipse и плагином к нему, но у меня на Клипсу, wim и TeX стойкая аллергия еще со студенческих времен.
Есть плагин для Visual Studio, но написан он китайцами для китайцев, так что нафиг. Впрочем, может есть и нормальные плагины, но я не нашел. Сам пользуюсь пожилой средой Venis IX, там есть мастер для генерации простых установщиков, которого вполне хватает, чтоб постоянно не писать одно и то же, создавая новый инсталлятор.
Если ничего не делать, детали установки по умолчанию скрыты:
Чтобы лог установки сразу был виден пользователю, необходимо применить один из следующих методов:
1. В коде скрипта, до секций прописываем команду:
ShowInstDetails show
Окошко с логом (деталями установки) будет открыто
2. Прописать внутри секции команду:
SetDetailsView show
Это может быть полезно, например, если вы хотите, чтобы детали показывались и при удалении. В таком случае, вышеуказанная команда добавляется в начало секции, описывающей анинсталлер:
Section Uninstall SetDetailsView show [..] [..] SectionEnd
Делал, чтоб клиенту меньше ручками работать. Теперь не надо самому определять версию винды, и вытаскивать нужный devcon из архива соответственно.
Предыдущий я сделал на Inno Setup, но Inno Setup оказался той еще заразой, нихрена он версию Винды толком определить не мог, и тихой сапой подкладывал во все винды один и тот же devcon, который подходит для Windows 7 и выше. От чего у клиента с виндой XP x64 произошел адский баттхерт, так, что забрызгало пол-Петербурга, аж до моей деревни брызги долетели. Видимо, клиент меня проклял, потому что мне на ногу упал топор (слава Ктулху обухом), у меня упали форточки, точнее форточка, но стеклянная и на пол, ко мне какого-то черта приперлась лесная охрана и стала [РОСКОМНАДЗОР], и я после этого [РОСКОМНАДЗОР] в результате, теперь страдаю [МИНЗДРАВ].
Новый сделал на NSIS, но как оказалось — NSIS тоже [РОСКОМНАДЗОР], точнее, не сам NSIS, он мне как раз понравился, за исключением одного странного недокументированного глюка, о котором как-нибудь расскажу, и скрипт-язык, вполне себе такая помесь Бейсика с Башем. А вот документация, это, товарищи, лютый [РОСКОМНАДЗОР] в последней стадии.
Русский мануал к популярному инсталл-мэйкеру писали сто лет назад какие-то [ДАННЫЕ УДАЛЕНЫ] с OSZone.net, еще и назвали свое творение «справочником», хотя что-что а справочники так не делают. Просто плохо структурированные статьи, которые на [РОСКОМНАДЗОР] запихнули в chm-файл. [РОСКОМНАДЗОРКА], поучитесь у того же Исзелиона с wasm.ru, как нужно делать справочники и мануалы. На туториале Исзелиона сотня-другая студентов если не аспирантами стали, так свой зачет по ассемблеру точно получили. Аффтар еще и жалуется на форуме, типа, «ну на[РОСКОМНАДЗОР] обновлять мануал, если его никто не читает, и очевидные вопросы задает». Так [РОСКОМНАДЗОРКА], [РОСКОМНАДЗОРКА], ты так написал этот мануал, что кошка [РОСКОМНАДЗОРОМ] по клавиатуре лучше напишет. Но ладно, я много захотел, русского мануала. Да, согласен. Но теперь «поговорим о влажности в номере», точнее об оригинальной вики от разработчиков.
Оригинальная вики тоже [РОСКОМНАДЗОРНЫЙ], [РОСКОМНАДЗОР] твою мать, [РОСКОМНАДЗОР]. Причем, я вполне себе уверен, что там есть все описания функций языка NSIS, вот только отдельной категории для списка функций нет. Функции потом ищутся гуглем, который выводит на страницу-сироту с вполне нормальным описанием, но [РОСКОМНАДЗОР] знает, почему на эту страницу нельзя попасть из самой вики. В навигации [РОСКОМНАДЗОР] не валялся, в общем без стакана не разобраться. А еще пишут, что «хорошо документированный продукт». Документирован он может и хорошо, но найти в документации что-то конкретное, это как в ГОРФ пойти к чиновнику: «вы мне справку ЕПРСТ-1488 принесли, а надо было ЖПЧШЦ-666», и [РОСКОМНАДЗОР] знает где это написано.
Даже есть мысль как-нибудь выкачать эту вики себе на комп, сделать нормально, попытаться перевести и выпустить в виде справочника.
Впрочем, инсталлер сделал:
Скачать с Mega.nz
С GitHub
Исходник (файлы devcon_all.nsi и gvv.nsi)
При установке Windows 7 на компьютер с USB 3.0 можно столкнуться с ошибкой «Не найден необходимый драйвер для дисковода оптических дисков.«, на самом деле, дисковод оптических дисков тут не при чем, особенно, если установка производится с загрузочной флэшки с дистрибутивом «семерки». В Windows 7 и его установочном окружении просто нет драйверов для контроллеров USB 3.0.
Самый простой вариант, когда в BIOS/UEFI удается переключить USB-контроллер в legacy-режим. Но на многих системах это самое legacy реализовано весьма коряво. Например, live-дистрибутивы Linux могут в таком режиме видеть и контроллер, и подключенные накопители, а вот установщик Windows 7 (и сама винда) нет.
На днях попался такой ноутбук, в котором примерно так и получалось, и вот, хочу рассказать об интересном способе это побороть.
Конечно, можно поступить стандартно — создать отдельный дистрибутив для такого компьютера, внедрив нужные драйвера, или же скачать какую-нибудь «колхозную» сборку. Но есть и другой способ — воспользоваться установочным окружением от Windows 8/8.1 в котором драйвера для USB 3.0 есть.
Минус способа — в установленной Windows 7 драйвера для USB 3.0 будут отсутствовать, как, наверняка, и драйвера от сетевой карты, и возникнет проблема, как их туда затолкать.
В источнике есть способ сделать это с помощью консоли восстановления с получившейся флэшки, у меня же получилось еще проще. Кривое ноутбучное legacy поддерживалось Linux’ом с System Rescue CD, так что на этом моменте я останавливаться не буду.
1. Образ установщика Windows 7
2. Образ установщика Windows 8/8.1
3. Флэшка 🙂
1. Закатываем на флэшку дистрибутив Windows 8/8.1, например, с помощью программы Rufus, особых подробностей я рассказывать не буду, но я сначала переключил UEFI ноута в режим Legacy BIOS (хоть он работал нормально и, главное, был), снес б-гмерзкое GPT, а потом установил в Rufus «Схема раздела и тип системного интерфейса» в значение «MBR для компьютеров с BIOS или UEFI«.
2. Итак, у нас получилась флэшка с Windows 8/8.1, переходим на нее, заходим в каталог sources
и удаляем оттуда файлы install.wim
и/или install.esd
.
3. Теперь из образа Windows 7 вытаскиваем файл install.wim
(он тоже лежит в подкаталоге sources
образа). Если у вас образ AIO, т.е. «все в одном», образ, из которого можно установить сразу несколько версий Windows, например, Starter, Home и Professional, то необходимо из образа Windows 7 вытащить файлы sources/*.clg
, например, install_Windows 7 Home Basic x64.clg
, install_Windows 7 Home Premium x64.clg
и т.д. Также можно попробовать скопировать папку $OEM$
, но не везде срабатывает, т.е. иногда конкретный дистрибутив может ее проигнорировать.
4. Теперь копируем все, что вытащили из дистрибутива Windows 7 в каталог sources на флэшке.
5. ФАНФАРЫ!
Загрузчик установщика Windows современных версий сначала загружает файл boot.wim
, который представляет из себя хитрый архив (виртуальный диск, наподобие initrd
в Linux), содержащий необходимые для процесса установки драйвера, основные файлы и саму программу-установщик. Далее окружение предустановки ищет дополнительные компоненты на диске с boot.wim
, в частности install.wim
, виртуальный диск с файлами операционной системы, которая должна быть установлена. Тут мы просто оставили предустановочное окружение, подсунув ему ОС другой версии.
Когда-то давно в этом блоге упоминалось про замечательную консольную утилиту devcon
от Microsoft, это консольный аналог «Диспетчера устройств», причем бесплатный и с открытым исходным кодом.
В прошлый раз мы находили и включали/отключали конкретную сетевую карту. В этот раз будем искать все сетевые устройства, а также массово включать и отключать всю сетевую активность на локальной машине.
devcon.exe findall =net
Команда найдет и выведет на экран все сетевые устройства, включая виртуальные адаптеры, например, TUN/TAP от Openvpn или виртуальные адаптеры VMWare, а также те устройства, которые в данный момент не активны (отключены, или у них нет драйверов).
devcon.exe find =net
Выводятся только активные устройства.
Пример вывода devcon.exe findall =net
:
Отключение всей сетевой активности
devcon.exe disable =net
devcon.exe enable =net
Внимание! devcon
необходимо запускать с админскими правами!
devcon’ы входят в разные пакеты SDK, отличающиеся гигантским размером. Я тут подобрал разные версии devcon’ов для разных ОС в одном архиве, ну и плюс батники для включения/отключения сети.
Содержимое архива:
batchfiles — пакетные файлы для включения и отключения сетевой активности
с помощью devcon, а также для получения списка сетевых устройств.
x64 — devcon для Windows7-10 для 64-разрядных версий Windows.
x86 — devcon для Windows7-10 для 32-разрядных версий Windows.
XP\x64 — devcon для Windows XP 64-разрядной, работает только в WinXP x64.
XP\x86 — devcon для Windows XP 32-разрядной, работает в WinXP x32 и,
возможно, в Win Vista x32.
Скачать с Mega.nz (ZIP)
Автоматический установщик
Вот уж не думал, что данная задача будет достойна заметки, но оказалось, что нормально определить версию (а главное, удобоваримое название и архитектуру) просто так не получится.
Класс VersionDetect.cs
Весь пример целиком
Win32_OperatingSystem class
Тема на Киберфоруме
Вопрос на stackowerflow
А так же ISO-образ Acronis True Image и Puppy Slacko.
Попросили превратить мою заметку про то, как можно пользоваться Acronis True Image без его акронисовского «восстановления при загрузке», превратить в интерактивный скрипт, который делает все то, что описано в заметке, но сам, задавая пользователю наводящие вопросы.
Сделал, чо. Правда, скрипт, наверняка, дичайший быдлокод, но работает без ошибок. Единственное что, предварительно надо создать основной раздел ext2/ext3 на жестком диске, и он должен идти первым. Потом установить винды, сделать линуксовый раздел активным, а потом уже запускать скрипт со всеми потрохами.
Скрипт дико большой, и отдельно его описывать мне откровенно влом, впрочем, в виде отдельных заметок, все самое основное я в этом блоге уже обсуждал.
Эмуляция восстановления при загрузке Acronis True Image с помощью syslinux/extlinux Копия
1. Создание списков (из файлов в каталоге) Копия
2. Простой интерактив в bash-скриптах (запрос Y/N и запрос строки) Копия
3. Простой интерактив в bash-скриптах (меню, списки) Копия
4. Проверка, установлен ли флаг раздела «активный» Копия
5. Определение файловой системы раздела диска в Linux Копия
6. Поиск загрузчика Windows Копия
7. Получение MBR ID и номера раздела, для передачи управления другому загрузчику Копия
8. Число или строка в переменной BASH Копия
Поскольку, наверняка набыдлокодил, то исправления и дополнения приветствуются.
Позвали тут в дружественную конторку, где после очередных обновлений перестал работать какой-то очередной русский инновационный криптопровайдер (не Крипто Про, с ним вроде такой беды не случалось). Оказалось, программулина конфликтовала с кривым активатором ODIN, да-да, винда почему-то тоже оказалась нелицензионной, несмотря на государственный статус этой самой конторки. Пришлось удалять.
А активатор кривой тому ще подсовывает в винду патченное ядро, дабы установить драйвер без цифровой подписи, нужный для эмуляции таблицы SLIC.
На рутрекере, кстати, в хорошей и обстоятельной теме про активацию семерки, предлагали просто создать BAT-файл со следующим содержимым, и запустить его с правами администратора, после чего перезагрузиться:
del "%windir%\system32\drivers\oem-drv64.sys"
del "%windir%\system32\xNtKrnl.exe"
del "%windir%\system32\xOsLoad.exe"
del "%windir%\System32\ru-RU\xOsLoad.exe.mui"
del "%windir%\System32\en-US\xOsLoad.exe.mui"
%windir%\system32\bcdedit.exe /set {current} path \Windows\system32\winload.exe
%windir%\system32\bcdedit.exe /deletevalue {current} kernel
%windir%\system32\bcdedit.exe /deletevalue {current} nointegritychecks
%windir%\system32\bcdedit.exe /deletevalue {current} custom:26000027
reg delete HKLM\SYSTEM\CurrentControlSet\services\oem-drv64 /va /f
Кому-то может и поможет, но мне не повезло, файлы активатора не удалились, reg delete не сработал, потому я просто нашел в дистрибутиве их виды «автоматический установщик» активатора, и просто провернул последовательность действий в обратном порядке.
Получился такой вот CMD-файл
В каталоге с этим батником должен быть подкаталог data, со следующим содержимым:
1. Утилита SetACL.exe, которая будет менять права доступа к ключам Реестра, и восстанавливать их после редактирования. Утилиту взял из того же дистрибутива.
2. Утилитка sleep, но это так, для красоты, моя прихоть.
3. Файлы Реестра (*.reg) для x86 и x64 ОС, в которых прописано, какие ключи удалять anti-oem-drv64.reg anti-oem-drv86.reg
Далее я сделал RAR-SFX с таким сценарием:
;Расположенный ниже комментарий содержит команды SFX-сценария
Setup=Deactivator.cmd
TempMode="Удалить активатор?","Деактиватор"
Silent=1
Overwrite=1
И поставил галочку в дополнительных параметрах SFX, на запрос административного доступа.
После перезагрузки можно удалить файлы активатора, таким вот CMD-файлом.
@ rem echo Этот файл должен быть запущен с правами администратора и после выполнения Deactivator'а
@ rem echo Чтобы окончательно удалить следы активатора нажмите любую клавишу, иначе CTRL+C!
@ rem pause
DEL "%windir%\system32\drivers\oem-drv64.sys"
DEL "%windir%\system32\xNtKrnl.exe"
DEL "%windir%\system32\xOsLoad.exe"
DEL "%windir%\System32\ru-RU\xOsLoad.exe.mui"
DEL "%windir%\System32\en-US\xOsLoad.exe.mui"
DEL "%windir%\system32\drivers\oem-drv86.sys"
@echo "Clean complete."
@pause
И SFX-сценарий к нему:
;Расположенный ниже комментарий содержит команды SFX-сценария
Setup=Cleaner.cmd
TempMode="Выполняйте только после исполнения Deactivator'а, если хотите окончательно удалить следы активации","Окончательная очистка"
Silent=1
Overwrite=1
1. Deactivator.exe
2. Cleaner.exe
Принесли мне тут в починку компьютер с наглухо залитыми эпоксидкой USB портами (безопасность же) и поставили задачу переустановить винды, в связи с заменой сгоревшего HDD на новый. По счастью сетевой порт был, так что единственным доступным способом доставить туда винды, был PXE. Но, в данном случае, речь пойдет не о PXE.
Зная клиента, который, несмотря на солидность, периодически «придет, и молча уронит все», я подумал, что так дело не пойдет. Надо предусмотреть возможность восстановить если что, ОС прямо с компьютера. Чтоб клиент не бегал вокруг меня, если уронит винду из-за кривого ПО/рук.
Всем хорош образ загрузочного диска Acronis True Image, и копию ОС сделать может, и восстановить может, и Зону Безопасности (скрытый раздел для хранения бэкапов) создать может. Не может лишь одного — установить свой загрузчик, чтобы можно было сделать «Восстановление при загрузке».
В десктопной платной версии такая функция есть, а в Recovery CD буржуи ее вырезали. Но мы не дворяне, справимся.
Внимание! Все нижеследующее работает для компьютеров с BIOS (или в Legacy-режиме) с MBR-дисками.
— Загрузчик syslinux
. Можно взять здесь. Я пользовался версией 4.02, которая мне уже была знакома по настройке PXE-сервера. Из архива нам понадобятся только некоторые файлы, но я уже собрал готовый пакет, ссылка на который будет в конце заметки. Вместо syslinux
можно использовать какой-нибудь другой загрузчик, который умеет грузить ISO-образы (например grub2
или grub4dos
), но далее все будет про syslinux
.
Примечание: Вообще syslinux
, это набор загрузчиков на разные случаи жизни. Он включает в себя pxelinux
(для загрузки из сети), isolinux
(для создания загрузочных ISO) и extlinux
, для установки загрузчика на жесткий диск. Но, с 4 версии постановили extlinux
и syslinux
считать одним и тем же [1], так чтоб никого не путать, далее буду называть все syslinux
‘ом
— Какой-нибудь маленький live-дистрибьютив Linux. Я использовал уже довольно пожилой Puppy Slacko 5.5 Rus, немного модифицированный когда-то давно под работу с tcplay
— Собственно сам образ Acronis True Image Recovery CD. Использовал старый, от Acronis True Image 2011, потому что он довольно небольшой (122 Мб против 522 от Acronis True Image 2015, например). Поскольку это софтина проприетарная, пользуйтесь гуглем и торрентами.
Я все делал на чистом диске, так что мне было просто.
В начале диска создаем основной раздел EXT2 или EXT3, в котором будет установлен загрузчик, лежать образ Acronis True Image, а у меня еще и дистрибьютив Puppy Slacko, чтоб чуть что можно было загрузиться в обход основной ОС. Делаем с помощью любимого менеджера дисков (я пользовался Acronis Disk Director).
Структура разделов должна выглядеть как-то так:
Желательно сделать раздел для нашего будущего загрузчика в начале диска, чтоб потом не было эксцессов. Когда экспериментировал с этим делом первый раз, Acronis, при создании Зоны безопасности, нагло передвинул раздел, и все пошло прахом.
Syslinux, на самом деле, можно ставить и в логические разделы, только это сопряжено с большими телодвижениями (см. в источниках в конце заметки).
Установим Windows на свободное место. Установщик Windows 7 и выше сам создаст необходимые разделы под свой загрузчик (bootmgr
и настройки) и основной раздел с ОС. После установки Windows структура диска должна выглядеть так:
Сборка пакета для установки загрузчика
Просьба линуксоидам камнями не кидаться, «пакет», в данном случае, не совсем то, что подразумевается под пакетом в терминах Linux-систем. В данном случае, это набор файлов, который необходим для установки syslinux
на целевой машине. Я делал это на «большом» Линуксе, но можно делать это и на том же самом Puppy (и даже в Windows, хотя на практике я не проверял). Ленивые могут пропустить этот шаг, готовый пакет будет в конце заметки.
1. Создаем в удобном месте подкаталог, например slinstall
, там будет готовый набор файлов для целевой машины.
2. В другой подкаталог распаковываем архив с syslinux
(например, syslinux-4.02.tar.gz
), в нашем примере подкаталог будет называться sysl-distr
3. Копируем в каталог slinstall
файл extlinux
из каталога sysl-distr/extlinux
— это установщик загрузчика.
4. Создаем в каталоге slinstall
подкаталог mbr
и копируем туда файлы sysl-distr/mbr/mbr.bin
и distr/mbr/altmbr.bin
5. Создаем в каталоге slinstall
подкаталог modules
и копируем туда модули загрузчика.
Syslinux, на самом деле, не просто загрузчик, а, можно сказать, целая маленькая операционная система. Функции загрузчика расширяются модулями — файлами специального формата, которые загрузчик может выполнять, примерно как ОС исполняемые файлы. Файлы эти имеют расширение c32
(*.c32
). Минимальный набор модулей для нашей задачи — модуль отображения меню menu.c32
и модуль chain.c32
— он передает загрузку другим (не-Linux) операционным системам, загрузчикам, или просто в нужный раздел диска. Но можно скопировать и другие модули, если захочется расширить функционал начальной загрузки. Необходимо найти нужные файлы (через поиск mc
в Linux или любым удобным способом) в каталоге sysl-distr
и скопировать их в slinstall/modules
В Линукс это можно сделать из командной строки так (находясь в каталоге sysl-distr
):
find ./ -name "*.c32"|xargs -I {} cp '{}' /home/user/slinstall/modules
где /home/user/slinstall/modules
— полный путь к подкаталогу slinstall/modules
6. В slinstall/modules
необходимо также скопировать специальный модуль memdisk
, предназначенный для загрузки ISO-образов. Обычно расположен по пути memdisk/memdisk
в каталоге с распакованным syslinux
(тут sysl-distr
).
7. Пакет готов, теперь можно запаковать его в архив, и приступать к установке загрузчика.
В Linux можно выполнить (выйдя из каталога slinstall
на уровень выше)
tar -czvf syslinux-install.tar.gz ./slinstall
Предположим, у нас есть загрузочная флешка с Puppy Linux (или другим Linux на ваш вкус), копируем на нее образ Acronis True Image, выше созданный пакет с загрузчиком, и архив с дистрибутивом самого Puppy (см. ниже, в разделе «Скачать»).
В графическом интерфейсе все можно делать мышью, я приведу ниже консольные команды. В данном примере флешка — sdb1
, а созданный ранее раздел — sda1
Внимание! Не ошибитесь в том, как именованы разделов на конкретной машине!
1. Создаем точки монтирования (пропустить шаг, если запущен графический интерфейс Puppy. Просто щелкнуть мышью по нужной иконке диска на desktop’е)
mkdir /mnt/sda1
mkdir /mnt/sdb1
2. Монтируем диски (пропускается из графического интерфейса):
mount -t ext3 /dev/sda1 /mnt/sda1
mount -t vfat /dev/sdb1 /mnt/sdb1
Может быть нужным заменить ext3
на ext2
и/или vfat
на ntfs
в зависимости от используемых файловых систем.
3. Создаем директорию для образа Acronis True Image Recovery CD на разделе sda1
и копируем образ.
mkdir /mnt/sda1/acronis
cp /mnt/sdb1/loader.iso /mnt/sda1/acronis/
4. Копируем и распаковываем дистрибутив Puppy (если он нужен)
cp /mnt/sdb1/puppy-slacko-rus-5.5-hexmod.tar.gz /mnt/sda1/
cd /mnt/sda1
tar -xvf puppy-slacko-rus-5.5-hexmod.tar.gz
rm puppy-slacko-rus-5.5-hexmod.tar.gz
5. Копируем и распаковываем пакет установки syslinux
:
cp /mnt/sdb1/ syslinux-install.tar.gz /mnt/sda1/
cd /mnt/sda1
tar -xvf syslinux-install.tar.gz
rm syslinux-install.tar.gz
syslinux
производится не на устройство, а на заранее смонтированный раздел. Загрузчик нельзя устанавливать в корень диска, необходимо создать для него каталог, например /boot/syslinux
. Не перепутайте разделы диска, куда устанавливаете загрузчик! Раздел с загрузчиком должен иметь файловую систему FAT, ext2, ext3, ext4 или Btrfs
1. В любимом менеджере дисков делаем раздел EXT2/EXT3 активным.
2. Загружаемся, если еще не, в live-дистрибьютив Linux.
3. Создаем точку монтирования и монтируем раздел (если еще не сделано)
mkdir /mnt/sda1
mount -t ext3 /dev/sda1 /mnt/sda1
4. Создаем каталог для загрузчика:
mkdir -p /mnt/sda1/boot/syslinux
ключ -p
указывает команде mkdir
, что нужно создавать путь со всеми подкаталогами.
5. Создаем каталог для модулей и копируем их:
mkdir -p /mnt/sda1/boot/syslinux/modules
cp /mnt/sda1/slinstall/modules/* /mnt/sda1/boot/syslinux/modules
6. Переходим в каталог slinstall
и устанавливаем загрузчик:
cd /mnt/sda1/slinstall
./extlinux --install /mnt/sda1/boot/syslinux
Если все сделано верно, последняя команда выдаст сообщение:
/mnt/sda1/boot/syslinux is device /dev/sda1
В каталоге /mnt/sda1/boot/syslinux
должен находиться файл ldlinux.sys
, кстати, неудаляемый. В [1] написано, как его, если что, удалить.
Syslinux, внезапно, сам не умеет прописываться в MBR диска, да и в загрузочный сектор раздела. Так что если перезагрузиться сейчас, то получим при загрузке сообщение Boot error
и глухое зависание. MBR, к сожалению, придется править вручную, с помощью команды dd
.
Внимание! Команду dd
не зря называют Disk Destroyer, будьте с ней очень осторожны! При ошибке легко можно похерить не только MBR, но и таблицу разделов, и данные на диске!
MBR находится в первых 440 байтах на диске.
1. Переходим в каталог slinstall
:
cd /mnt/sda1/slinstall
(естественно, точка монтирования должна быть создана, а раздел примонтирован).
1. Создаем копию текущей MBR:
dd if=/dev/sda of=old.mbr bs=440 count=1
В текущем каталоге должен появиться файл old.mbr
размером 440 байт. Можно, и даже желательно, указать и какой-нибудь другой путь к файлу old.mbr
, сохранив его, например, на флешке:
dd if=/dev/sda of=/mnt/sdb1/old.mbr bs=440 count=1
2. Устанавливаем MBR syslinux
:
dd bs=440 count=1 conv=notrunc if=mbr/mbr.bin of=/dev/sda
Примечания:
Краткое пояснение по команде dd
:
bs=<число>
— сколько байт необходимо прочитать.
count=<число>
— число уазывает на то, сколько раз будет прочитано количество байт, указанное в параметре bs=
if=<путь к устройству или файлу>
— откуда будут прочитаны данные
of=<путь к устройству или файлу>
— куда будут записаны данные
Осталось сделать загрузочное меню.
Вот пример загрузочного меню, главное, правильно установить раздел с загрузчиком винды — в syslinux отсчет разделов ведется с единицы (0 — MBR жесткого диска), отсчет дисков с ноля, и надо помнить, что единица таймера загрузки syslinux равна 0.1 секунде.
ui modules/menu.c32 PROMPT 0 menu title Local boot LABEL windows menu label Microsoft Windows 7 kernel modules/chain.c32 append hd0 2 timeout 1000 TEXT HELP Loading Windows 7 ENDTEXT LABEL recovery menu label System recovery kernel modules/memdisk initrd ../../acronis/loader.iso append iso raw LABEL slacko menu label Puppy Linux Slacko 5.5 kernel ../../slacko/vmlinuz initrd ../../slacko/initrd.gz
Осталось загрузиться с жесткого диска, создать зону безопасности Acronis и сделать бэкап первых трех разделов в нее
1.Syslinux (Русский)
2. Comboot/chain.c32
3. Syslinux wiki
puppy-slacko-rus-5.5-hexmod.tar.gz
syslinux-install.tar.gz
syslinux-mini.tar.gz
Найти загрузчик Windows на разделе жесткого диска, дело не очень сложное:
1. Надо проверить файловую систему раздела, она должна быть FAT32 или NTFS
2. Проверить наличие файла ntldr
(Windows XP и ранее) или bootmgr
(Windows Vista и позднее) в корне раздела. Windows XP и старше, при установке по умолчанию, записывают файл ntldr
в корень системного раздела, а более новые — создают отдельный загрузочный раздел, в корне которого лежит bootmgr
.
Для чего? Например, для создания своего скрипта автоматической настройки загрузчика Grub или Syslinux
Я недавно писал о том, как узнать файловую систему раздела (диска) в Linux Копия. В данном случае действовать будем примерно также.
Обработать вывод команды blkid
(вывод данных о блочных устройствах) можно в цикле for
:
echo "Find Windows loaders..."
IFS=$'\n'
for DEVDATA in $(blkid); do
...
done
Перед циклом необходимо установить значение переменной IFS
, как \n
(перенос строки)
IFS
— переменная, задающая разделители полей при работе со строками в shell, по умолчанию разделители это табуляция, перенос строки и пробел, если не установить ее значение, как «только перенос строки», то строка с описанием каждого раздела (например, /dev/sda1: UUID="68DF-FF87" TYPE="vfat" PARTUUID="00003214-01"
) распадется на части, что поломает алгоритм.
В цикле for
:
1. Вытаскиваем в переменную VOL
нужные данные — путь к устройству и файловую систему:
VOL=`echo "$DEVDATA" |sed -n 's/\(.*:\).* TYPE=\"\([^\"]*\)\".*/\1\2/p'`
Для вышеуказанного /dev/sda1
получится строка /dev/sda1:vfat
2. Получаем путь к устройству и тип файловой системы отдельно в переменные, соответственно, VOLNAME
и VOLFS
.
VOLNAME=`echo "$VOL"|awk -F ":" '{print $1}'`
VOLFS=`echo "$VOL"|awk -F ":" '{print $2}'`
Параметр -F ":"
устанавливает двоеточие в качестве разделителя полей awk
.
3. Далее, проверяем, не пуста ли строка в переменной VOLFS
, и проверяем ее значение. Если VOLFS
равна ntfs
или vfat
, то запускаем функцию find_loader()
, проверяющую наличие загрузчика в корне соответствующего раздела. Если файловая система раздела другая — выводится сообщение, что это не Windows-раздел.
if [ -n "$VOLFS" ]; then if [[ "$VOLFS" == "ntfs" || "$VOLFS" == "vfat" ]];then find_loader $VOLNAME $VOLFS else echo "$VOLNAME not windows volume" fi fi
Можно было бы еще исключать разделы FAT16, но решил не загромождать скрипт лишней проверкой.
В функцию find_loader()
передаются два параметра: путь к устройству (разделу) и его файловая система.
1. Заведем переменную-флаг, указывающую, был ли раздел временно смонтирован
TMPMOUNT=0
2. Получаем выхлоп команды mount
. grep
‘ом фильтруем вывод по соответствующему разделу, с помощью awk
вытаскиваем точку монтирования.
MOUNTPOINT=`mount|grep -w "$1"|awk '{print $3}'`
3. Если переменная MOUNTPOINT
пустая, раздел не смонтирован. Создаем временную точку монтирования, пытаемся смонитровать раздел, если получилось — устанавливаем TMPMOUNT=1
, в переменную MOUNTPOINT
записываем временную точку монтирования и приступаем к поиску загрузчика, если не получилось — выходим из функции:
if [ -z "$MOUNTPOINT" ]; then mkdir -p "/tmp/tmpmount" mount -t "$2" "$1" "/tmp/tmpmount" if [ $? -ne 0 ]; then echo "$1 not mounted" return fi MOUNTPOINT="/tmp/tmpmount" TMPMOUNT=1 fi
Примечание: ключ -p
команды mkdir
позволяет создать путь вместе со всеми подкаталогами, а если путь уже создан, то команда mkdir
не выдаст ошибки, что путь уже существует.
Надо обратить внимание на то, что Windows нечувствительна к регистру имен файлов, так что загрузчик может быть и bootmgr
и BOOTMGR
, и даже BoOtMgR
(аналогично и ntldr
). Поэтому придется воспользоваться командой find
.
find <path> -maxdepth 1 -iname <filename>
где:
<path>
— путь к каталогу, с которого начинать поиск
-maxdepth
— глубина поиска в подкаталогах (начиная с указанного в <path>
, 1
— только каталог <path>
без подкаталогов).
-iname
— игнорировать регистр имени файла
<filename>
— имя файла (или маска), который будем искать.
В данном случае надо обязательно установить -maxdepth 1
, иначе будут большие тормоза, а при отмонтировании возможны глюки.
4. Ищем загрузчик Vista и выше и сохраняем выхлоп в переменную FOUND
:
FOUND=`find "$MOUNTPOINT" -maxdepth 1 -iname "bootmgr"`
5. Если нашли (переменная FOUND
не пустая), выводим соответствующее сообщение, если нет — ищем загрузчик Windows XP, и выводим сообщение в зависимости от того, нашли или нет:
if [ -n "$FOUND" ];then echo "$1: found bootmgr (Windows Vista and newer)" else #ntldr - Win XP and older FOUND=`find "$MOUNTPOINT" -maxdepth 1 -iname "ntldr"` if [ -n "$FOUND" ];then echo "$1: found ntldr (Windows XP and older)" else echo "$1: Windows loader not found" fi fi
6. Проверяем флаг TMPMOUNT
, если он был установлен в 1
, отмонтируем временно смонтированный раздел:
if [ $TMPMOUNT -eq 1 ]; then sleep 1 umount "/tmp/tmpmount" fi
Запуск на тестовой машине с разделами FAT32/NTFS, но без установленной Windows:
Запуск на машине с установленной Windows 7:
Запуск на машине с установленной Windows XP
1. Определение файловой системы раздела диска в Linux Копия
2. Команда find в Linux Копия
Это техническая страничка со списком дистрибутивов нашего PXE-сервера и ссылками на описание конкретных дистрибутивов. Страничка пополняется в зависимости от производственной необходимости, наличия оборудования, для которого понадобился тот или иной дистрибутив и времени.
Acronis utilities
— Acronis True Image 2011
— Acronis True Image 2015
— Acronis Disk Director 12
— Acronis Disk Director 10 (small DOS version)
— Acronis True Image Enterprise 8 (small DOS version)
Подробности об установке на сервер и меню PXELINUX (копия)
Hiren’s Boot CD 15.2 (копия) и бонус, разные утилиты для подбора паролей (копия)
Linux
— Puppy Slacko 5.5:
* Описание и скрипт для подготовки дистрибутива копия (запускать из Puppy, загрузившись с оригинального диска или на виртуальной машине)
* Оригинальный ISO.
* Мой мод оригинального ISO (добавлен mc,
tcplay
и скрипт в каталоге netboot
)
* Готовый архив для PXE (добавлен mc,
tcplay
и скрипт в каталоге netboot
)
* Пункт меню PXE сервера
— INX 1.1 (Is Not X) (копия)
— Меню для всего раздела Linux: Mega.nz PasteBin
Примечание: Как в Puppy выйти из иксов, если они глючат (копия)
Windows
— Windows XP PE (копия) с возможностью установки из нее Windows XP
— Windows XP PE Very Small (быстро загрузиться и посмотреть/подправить что-нибудь на жестком диске, можно скачать по ссылке выше)
— Windows XP Unattended install (копия). Альтернативный способ установки Windows XP из специализированного Linux-окружения.
— Windows 7 PE (копия). С возможностью установки из нее Windows 7 и выше.
— Boot Windows from HDD (копия) — специальный ISO-образ с Grub4Dos для загрузки Windows XP/Vista/7/8/10 с жесткого диска
— Boot Windows from HDD (DOS method) (копия) — альтернатива предыдущему пункту, только загрузчик вызывается из DOS-окружения.
— Меню всего раздела на Mega.nz PasteBin
Примечание: Альтернативный способ установки Windows 7/Vista/8/10.
Если не загрузилась Windows 7 PE или в ней что-то не работает.
1. Грузимся в какой-нибудь Linux, который видит сеть и умеет в Samba или FTP (FTP, естественно, надо поднять предварительно на сервере и скопировать в каталог, доступный через FTP, дистрибутив винды).
2. Делим диск и копируем винду на целевую машину, как это описано здесь (копия). Понятно, что вместо флешек с виндами используем FTP, Samba и возможности PXE-сервера.
3. Пользуемся Boot Windows from HDD или Boot Windows from HDD (DOS method) чтобы запустить установщик винды на целевой машине.
И ТЕЛЕМАРКЕТ!
Старые ОС.
Сделано от нехрен делать и шутки для.
— Windows 1.03
— Windows 2.03
— Windows 3.11 with MS Office and other programs
— Windows 98