Интерактивный скрипт, устанавливающий Syslinux

А так же 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 Копия

Скрипт и готовые «пакеты» с Syslinux и модулями

На GitHub

Поскольку, наверняка набыдлокодил, то исправления и дополнения приветствуются.

Удаление кривого активатора ODIN.

Преамбула

Позвали тут в дружественную конторку, где после очередных обновлений перестал работать какой-то очередной русский инновационный криптопровайдер (не Крипто Про, с ним вроде такой беды не случалось). Оказалось, программулина конфликтовала с кривым активатором 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

Репозиторий на GitHub

Большая статья о механизмах активации Windows 7

На Rutracker.org Копия в PDF

Эмуляция восстановления при загрузке Acronis True Image с помощью syslinux/extlinux

Преамбула

Принесли мне тут в починку компьютер с наглухо залитыми эпоксидкой 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, например). Поскольку это софтина проприетарная, пользуйтесь гуглем и торрентами.

Делим диск и ставим Windows

Я все делал на чистом диске, так что мне было просто.
В начале диска создаем основной раздел 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

Копирование необходимых файлов на раздел EXT2/EXT3 целевого компьютера.

Предположим, у нас есть загрузочная флешка с 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

Внимание! Установка 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] написано, как его, если что, удалить.

Настройка MBR

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

На PasteBin

Осталось загрузиться с жесткого диска, создать зону безопасности 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 из Linux-окружения.

Преамбула

Найти загрузчик Windows на разделе жесткого диска, дело не очень сложное:

1. Надо проверить файловую систему раздела, она должна быть FAT32 или NTFS
2. Проверить наличие файла ntldr (Windows XP и ранее) или bootmgr (Windows Vista и позднее) в корне раздела. Windows XP и старше, при установке по умолчанию, записывают файл ntldr в корень системного раздела, а более новые — создают отдельный загрузочный раздел, в корне которого лежит bootmgr.

Для чего? Например, для создания своего скрипта автоматической настройки загрузчика Grub или Syslinux

Поиск разделов NTFS и FAT32

Я недавно писал о том, как узнать файловую систему раздела (диска) в 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, но решил не загромождать скрипт лишней проверкой.

Поиск загрузчика Windows

В функцию 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

Скрипт целиком

На GitHub
На PasteBin

Источники

1. Определение файловой системы раздела диска в Linux Копия
2. Команда find в Linux Копия

Дистрибутивы PXE

Это техническая страничка со списком дистрибутивов нашего 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 (копия) и бонус, разные утилиты для подбора паролей (копия)

System Rescue CD (копия)

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) чтобы запустить установщик винды на целевой машине.
И ТЕЛЕМАРКЕТ!

Образы DOS (копия)

Старые ОС.

Сделано от нехрен делать и шутки для.

— Windows 1.03
— Windows 2.03
— Windows 3.11 with MS Office and other programs
— Windows 98

Некоторые есть здесь (копия)

Делаем аварийный загрузочный образ WinPE на базе Windows 7. (с возможностью установки Win7/8/10)

Преамбула

В прошлых заметках я рассказывал о том, как загрузить WinPE XP по сети и установить из нее Windows XP. Теперь делаю WinPE на базе Windows 7

Необходимые инструменты и утилиты

— Компьютер, с установленной Windows 7 🙂
— Достаточное место на HDD, со всеми потрохами этот процесс сожрал ~50Гб на диске.
— Образ Windows Automated Installation Kit (WAIK)
— WinBuilder — небольшая утилита, позволяющая автоматизировать процесс создания образа. О ней ниже.
Чистый (!) образ установщика какой-нибудь одной версии Windows 7, сборки разной степени колхозности, а так же образы дисков все-в-одном (AIO) не подойдут. Скорее всего WinBuilder прекратит работу с какими-нибудь неудобоваримыми глюками. Поскольку я собрался делать образ x86 (32-разрядный), то и скачал Windows 7 Ultimate x86 с рутрекера.
— Универсальные наборы драйверов для сети, чипсетов и устройств хранения данных. О них ниже.
— Какая-нибудь виртуальная машина для тестирования полученного образа. У WinBuilder в комплекте есть QEMU, но желательно поставить VMWare, в нужный момент WinBuilder ее «подхватит», создаст свою виртуалку и запустит на ней образ
-cdrkit в Linux, для создания ISO-образа.

Далее под катом

Минус — способ требователен к памяти, понадобится хотя бы 1 Гб RAM

Скачать

Плагины и другие мелочи

Скрипт createiso-gfd на PasteBin
Урезанный Far
Плагин для установки Far в сборку
BAT-файл для установки Windows 7
Скрипт для установки файла в сборку
Исправление для плагина Wallpaper
Загрузчик и menu.lst

WinBuilder

WinBuilder SE (чистый, без плагинов)
Полная версия

Готовый образ Win7 PE SE

Образ Win 7 PE SE

Заодно нашел кучу утилит для подбора паролей в Windows.

Утилиты не первой свежести, но запускаются из WinPE (надо положить их в шару, если использовать PXE), некоторые умеют работать с ОС на диске.

Скачать

На некоторые ругаются антивирусы, так что архив запаролен. Пароль:111

Hiren’s Boot CD 15.2 и загрузка его по сети (PXE)

HBCD, как я уже говорил — «очень полезный горшочек», набор утилит для всяческого восстановления, форматирования, установки винды, и т.д.
Последняя версия, несмотря на то, что из нее убрали весь пиратский софт, стала только больше, и весит 700 Мб, хотя я помню версии по 250 Мб. Но можно распотрошить CD и грузить его по частям. Распакуем образ и приступим.

— Mini Windows XP. Аж целая заметка есть по этому поводу (копия).
Готовый образ

— Very Mini Windows XP. Образ по ссылке выше. Хоть этого и не было в оригинале, добавлю.
Готовый образ

— DOS Programs. Как вытащить DOS’овую часть из HBCD. (копия)
Готовый образ

— Все раскладываем по отдельным каталогам.

Parted Magic

Это Linux-окружение для всяких работ с диском (делением на разделы, форматированием и т.д.). Но надо сказать, слегка капризное в отношении загрузки по сети.
Поскольку, программе мало ядра и initrd, лучше создать отдельный ISO-образ с ней. В каталог iso_root надо скопировать каталог pmagic из \Boot образа HBCD. Также нужно добавить загрузчик и составить соответствующие конфиги.
Вот переписанный с конфига HBCD конфиг для isolinux:

isolinux.cfg PasteBin (Mega.nz) — основное меню диска
other.cfg PasteBin (Mega.nz) — дополнительные варианты загрузки, есть утилиты недоступные из основной конфигурации.
Главное, не забыть в каждую конфигурацию загрузки добавить опцию livemedia noeject, без нее не видит файлов из своей ФС.

Готовый ISO-образ

Пункт меню:

LABEL pm
    menu label Parted Magic 
    kernel modules/memdisk
    initrd distrib/hbcd/pm/pm.iso
    append iso

***

Windows Memory Diagnostic, загружается, как обычный образ загрузочного диска. В качестве ядра указываем memdisk, а в качестве initrdwmemtest.gz

LABEL wm
    menu label Windows memory diagnostic
    kernel modules/memdisk
    initrd distrib/hbcd/wmemtest/wmemtest.gz

***

MemTest86+ (настройки те же)

NT/2000/Vista/7 password changer

Грузим, как обычный Linux-дистрибутив.

LABEL ch
    menu label NT/2000/Vista/7 password changer 
    kernel distrib/hbcd/ntpr/chntpw
    initrd distrib/hbcd/ntpr/chntpw.gz

Ядро
chntpw.gz

***

Kon-Boot (Password recovery)
Аналогично образам дискет.

Seagate Disk Wizard

1. Из \Boot HBCD копируются два файла SeagatDW и SeagatDW.gz в отдельный каталог.
2. Переименовываем строчными буквами (т.е. в sgdw и sgdw.gz)
3. Грузим, как обычный Linux-дистрибутив.

LABEL sd
    menu label Seagate Disk Wizard
    kernel distrib/hbcd/seagate/sgdw
    initrd distrib/hbcd/seagate/sgdw.gz
    append rw ramdisk_size=32768 acpi=off quiet noapic mbrcrcs on vga=788

Строчку append копируем из конфига HBCD.

Ядро
initrd

PloP Boot Manager

1. Лишить оригинального расширения .bin, т.е. переименовать в plpbt.
2. Положить в отдельный каталог.
2. Прописать его в параметре kernel

LABEL pl
    menu label Plop boot manager
    kernel distrib/hbcd/plop/plpbt

plpbt (скачать)

***

Smart Boot manager.
Грузится, как сжатый образ с помощью memdisk.

Fix «NTLDR is missing»
Аналогично.

Darik’s Boot and Nuke — Hard Drive Eraser
Аналогично.

Образы DOS-программ предыдущих версий

HBCD 10.1 DOS Image
HBCD 8.7 DOS Image

Загружаются, как ISO-образы.

Меню HBCD

На PasteBin
Mega.NZ

Скачать весь дистрибутив (без старых образов)

В 7Z-архиве

Старые образы:

HBCD 10.1 DOS Image
HBCD 8.7 DOS Image

Создание файла нужного размера в Windows 7 и выше.

В Linux создать файл нужного размера не просто, а чрезвычайно просто. Есть утилита dd и устройство /dev/zero, которое отгрузит вам нужное количество символов с кодом 0.
Например, создадим файл размером 20 Мб:

dd if=/dev/zero of=file.zero bs=20M count=1

В винде (7 и выше) появилась утилита fsutil, способная сделать аналогичную операцию:

fsutil file createnew <filepath> <size>
где:
<filepath> — путь к файлу
<size> — размер файла в байтах

Правда, у этой утилиты есть 2 неудобных момента:
1. Она хочет права администратора, и с этим ничего не поделать штатными средствами, но можно, например поделать моей утилитой wsudo (копия)
2. Надо указывать размер файла в байтах, что не очень удобно. А вот с этим вполне можно бороться, написав батник-обертку, который будет обрабатывать еще один параметр — модификатор единиц измерения (килобайты или мегабайты), вычислять нужное значение в байтах и вызывать fsutil.

1. Проверяем параметры CMD-файла:

@echo off

if "%~1" EQU "" (
	echo No arguments. Use  "%~n0%~x0  <filename> <size> [K|M]"
	exit /b 1
)

символ ~ удаляет кавычки из переменной %1 (первый аргумент командной строки CMD/BAT файла), if сравнивает значение переменной в кавычках с пустыми кавычками. Если первого аргумента нет, выводится соответствующее сообщение и скрипт завершает работу с кодом возврата 1 (exit /b 1)

2. Выводим справку по использованию CMD-файла:

if "%~1" EQU "/?" (
	echo Use  "%~n0%~x0  <filename> <size> [K|M]"
	exit /b 1
)

В переменной %0 хранится путь к самому CMD-файлу, конструкция %~n0 обрезает полный путь до имени файла (без расширения), а %~x0 — оставляет одно расширение (с начальной точкой). Конструкции %~n<номер> и %~x<номер> можно использовать только с аргументами командной строки.

Запуск CMD-файла без параметров:
zerofile.cmd

No arguments. Use "zerofile.cmd <filename> <size> [K|M]"
и с параметром вывода справки:
zerofile.cmd /?

Use "zerofile.cmd <filename> <size> [K|M]"

3. Теперь проверим, указан ли в имени файла путь к нему, если не указан — добавим к имени файла текущий каталог:

if "%~1" EQU "%~n1%~x1" (
	set FILENAME=%CD%\%~1
) else (
	set FILENAME=%~1
)

Если имя файла (первый параметр) равно этому же имени и расширению, значит, путь не указан, в качестве пути добавляем текущий каталог, и записываем его в переменную FILENAME.

4. Установим удобные имена переменных для остальных параметров — размера файла и единицы измерения:

set FILESIZE=%~2
set ED=%~3

5. Теперь надо проверить, является ли размер файла целым положительным числом.

Штатных проверок в языке CMD/BAT файлов не предусмотрено, но можно пойти на хитрость. Известно, что команда set способна делать арифметические действия над числами и переменными (надо установить ключ /a и написать выражение в кавычках). Если в переменной встретится не число, то set автоматически будет считать значение переменной равным 0. Соответственно, в результате получится значение с учетом этого. Значит достаточно сделать с переменной какое-то действие, которое не приведет к изменению значения (например, отнять и прибавить единицу), а потом проверить, получился ли положительный результат.

set /a "RES=FILESIZE+1-1"
if %RES% LEQ 0 (
	echo Can't create file with size %RES%
	exit /b 2
)

6. Проверяем, какая единица измерения установлена в 3 параметре CMD-файла. Если в качестве параметра установлена K(k) — килобайты, M(m) — мегабайты. Что-то еще или ничего — размер файла задается в байтах.

if "%ED%" EQU "K" goto :kb
if "%ED%" EQU "M" goto :mb
if "%ED%" EQU "k" goto :kb
if "%ED%" EQU "m" goto :mb
goto :create

7. Вычисляем размер файла в байтах:

:kb
	set /a "RES=FILESIZE*1024"
	set ST=%FILESIZE% Kb
	goto :create

:mb
	set /a "RES=FILESIZE*1024*1024"
	set ST=%FILESIZE% Mb

8. Выводим summary и создаем файл нужного размера:

:create
	echo Creating file:	%FILENAME%
	if "%ST%" EQU "" (
		echo Size:		%RES% bytes		
	) else (
		echo Size:		%ST% [%RES% bytes]
	)
	
	wsudo fsutil file createnew "%FILENAME%" %RES%

Скачать

CMD-файл целиком (на GitHub)
CMD-файл целиком (на PasteBin)
wsudo (с GitHub)

Источники

1. Фишки батников (Копия в PDF)
2. CMD/BAT — Проверка наличия параметров (Копия в PDF)

Альтернативный способ установки Windows XP по сети (PXE) из Linux-окружения.

Преамбула

Способ довольно странный, а само Linux-окружение для установки несколько кривовато, потому пишу больше чтоб тему закрыть и к установке XP более не возвращаться.

Принцип действия программы основан на возможности установки Windows XP из под DOS. Сначала по сети грузится специальный дистрибутив Linux (ядро и initrd), он настраивает сеть, подключает нужные сетевые шары, запускает предварительное конфигурирование, генерирует файл unattend.txt и разные послеустановочные скрипты, теоретически запускающие установку необходимых программ. На практике вся автоматизация работает криво (возможно, надо править скрипты и конфиги), но доступ к установщику винды, который думает, что запущен из-под DOS, мы в результате получаем.

Установка Linux-окружения

Вот где, кто и когда и откуда эту штуковину взял, я не ведаю. Поэтому вот вам архив прямо с сервера (естественно, без дистрибутива винды внутри).

Скачать

Распаковываем содержимое каталога unatxp (внутри архива) куда-нибудь в отдельный подкаталог в каталоге с дистрибутивами на PXE-сервере.
Пусть будет для примера такой вот путь:
/home/pxe/tftp/distrib/windows/unatwinxp

Настройка шары

Для работы установочному Linux-окружению необходимо расшарить каталог distrxp
Добавляем в smb.conf:

[unatdistr]
        path=/home/pxe/tftp/distrib/windows/unatwinxp/distrxp
        public=yes
        browsable=yes
        read only=yes
        guest ok=yes

Перезапускаем samba.

Подготовка дистрибутива Windows XP

Дистрибутив XP надо скопировать с установочного диска или распаковать из ISO-образа и поместить в подкаталог distrxp/os/winxp, а также установить права на все файлы в подкаталогах в 755.

cd /home/pxe/tftp/distrib/windows/unatwinxp/distrxp/os/winxp
chmod -R 755 *

Загрузка Linux-окружения, загрузочное меню PXE-сервера.

Осталось подправить меню PXE-сервера.

LABEL winxpunatted
    menu label Windows XP Unattended install
    kernel distrib/windows/unatwinxp/bzimage
    initrd distrib/windows/unatwinxp/initrd.gz
    append z_user=guest z_password=guest z_path=\\10.10.1.5\unatdistr

Как видно из кода выше, необходимо передать ядру Linux-окружения имя пользователя и пароль для доступа к шаре, а также ее адрес на сервере. Все данные передаются в соответствующих параметрах ядра.

Подготовка целевой машины

Теперь надо подготовить машину, на которую будем устанавливать XP. На самом деле, Linux-окружение само предложит переделить диск и сделать активный раздел при помощи своих инструментов, но я ему не особо доверяю, потому сделал это с помощью Acronis. Главное, чтоб перед установкой на машине уже был активный раздел, отформатированный в FAT32, иначе Linux-окружение перевет работу где-то на середине, и выбросит в линуксовую консоль, так и не запустив эмулятор DOS.

Запуск Linux-окружения и установка Windows XP

Далее с картинками под катом

Плюсы и минусы

— Довольно кривое Linux-окружение
— Много мелких суетливых движений, как говорил классик. Необходимость отвечать на кучу вопросов.
— Требует раздел FAT32, потом придется переделывать командой convert.

+ Отсутствует возня с сетевыми драйверами и BINL
+ Идет даже на очень слабых машинах, тестировалось на PIII 700

Скачать

Установочное Linux-окружение для Windows XP

Загрузка Windows (7/10/Vista/XP) с жесткого диска загрузчиком GRUB4DOS из ISO-образа.

Преамбула

Как-то давно мы делали загрузку Windows с жесткого диска (копия) с помощью Grub4DOS, запускаемого в DOS-окружении.

Оказывается, на некоторых машинах такая конфигурация может неожиданно сглючить. Загрузчику 7 и 10 Windows почему-то периодически не нравится образ виртуального HDD с DOS. Переделал так, чтобы было без DOS-окружения совсем, а GRUB4DOS стартовал из загрузочного ISO-образа.

Загрузочное меню

Составляем загрузочное меню GRUB4DOS, в принципе, все делается по инструкции, нужен лишь редактор, поддерживающий переносы строк Windows/DOS (CR+LF). И стоит обратить внимание на то, что этот загрузчик GRUB4DOS чувствителен к регистру имен файлов, поэтому файл menu.lst необходимо назвать строчными буквами.

Основное загрузочное меню (menu.lst) на PasteBin
Меню с альтернативными вариантами загрузки (alt.lst) на PasteBin

Загрузочный ISO

Загрузочный ISO я сделал в Linux, с помощью утилиты mkisofs.

1. Создаем где-нибудь в удобном месте каталог iso_root
2. Копируем в каталог файлы menu.lst, alt.lst и загрузчик GRUB4DOS grldr
3. В каталоге уровнем выше iso_root делаем скрипт для создания ISO-образа

Скрипт на PasteBin

4. Запускаем его

./createiso-gfd WINBOOT

5. ФАНФАРЫ

Вот вид загрузочного меню:

Скачать

Готовый ISO-образ с mega.nz (600 Кб)
menu.lst, alt.lst, grldr и скрипт createiso-gfd в одном архиве.

Установка Windows XP из Mini Windows XP по сети (PXE). Без геморроя с загрузчиками и драйверами.

Преамбула

В прошлой заметке Копия мы делали так, чтобы можно было грузить по сети Mini Windows XP из Hiren’s Boot CD 15.2.
Такой способ запуска Mini Windows XP заодно избавляет от необходимости подгружать с помощью BINL необходимые драйвера сетевых карт и ебли с загрузчиками. А значит, можно поставить и «большую» XP. По сети.

Организуем шару

Сделаем на нашем сервере отдельную шару под дистрибутив XP, у меня она уже была, т.к. раньше я тоже использовал немного другой способ установки XP с помощью специального Linux-окружения, но там надо было нажимать больше кнопок и вводить серийный номер. Поэтому в примере будет длинный и странный путь к шаре.

Прописываем в /etc/samba/smb.conf

[unatdistr]
        path=/home/pxe/tftp/distrib/windows/unatwinxp/distrxp
        public=yes
        browsable=yes
        read only=yes
        guest ok=yes

Перезагружаем samba-сервер.

Копируем в шару файлы с дистрибутива XP.

Обратите внимание, чтобы все успешно сработало, права на файлы должны быть установлены в 755.

Готовим файл ответов unattend.txt

unattend.txt

Создаем BAT-файл для запуска установки

Алгоритм работы данного BAT-файла таков:

1. Проверить, есть ли по необходимому пути файл winnt32.exe
2. Если нет, подключить шару.
3. Подождать
4. Выполнить winnt32.exe с необходимыми параметрами.

Пример файла xpinstall.bat:

SET NETADDR=\\192.168.0.20\unatdistr
SET NETDRIVE=Z
SET INSTALLPATH=\os\winxp\
SET UNATTEND=W:\scripts\unattend.txt
SET SYSDRIVE=D

if exist %NETDRIVE%:%INSTALLPATH%i386\winnt32.exe goto INSTALL

net use %NETDRIVE%: %NETADDR%
sleep 5

:INSTALL
%NETDRIVE%:
cd %INSTALLPATH%
i386\winnt32.exe /s:%NETDRIVE%:%INSTALLPATH%i386 /syspart:%SYSDRIVE% /tempdrive:%SYSDRIVE% /unattend:%UNATTEND%
pause

На PasteBin

В принципе, в самом файле нет ничего интересного, но есть момент, на котором стоит остановиться. Это параметры запуска winnt32.exe:

/s:<путь> — путь к файлам дистрибутива, обязательно в конце указывайте каталог <code >i386, иначе не сработает.
/syspart:<буква_диска>— раздел, на который будет установлена ОС.
/tempdrive:<буква_диска> — раздел для временных файлов, он обязательно и под той же буквой должен быть доступен, как из WinPE, так и после перезагрузки. Вообще лучше всего поставить тот же раздел, что и системный. Установщик потом сам потрет все лишнее.
/unattend:<путь> — путь к файлу автоматизации установки (unattend.txt)

После двоеточий пробелы НЕ НУЖНЫ!

Полученный BAT-файл нужно положить в шару hbcdshare, созданную в прошлой статье, например в отдельный каталог scripts вместе с утилитой sleep и файлом unattend.txt, права исполняемым файлам надо установить в 755.

chmod 755 xpinstall.bat
chmod 755 sleep.exe

Минус данного способа. Перед установкой ОС, соответствующий раздел, указанный в параметрах /syspart и /tempdrive должен быть отформатирован и доступен из WinPE, а также этот раздел должен быть активным.

После запуска данного BAT-файла запустится программа установки, которая скопирует содержимое дистрибутива XP на жесткий диск, установит загрузчик, после чего необходимо будет перезагрузиться уже с жесткого диска, и продолжить установку.

Утилита InstallGenerator

Минус в использовании шары и скрипта запуска установщика с нее, в том, что если нужно поменять букву диска для установки, или адрес самой шары, то придется лопатить батник из Linux (шара для безопасности доступна в режиме Read Only).

Чтобы это можно было как-то побороть, наскриптил небольшую утилиту InstallGenerator. При необходимости что-то поменять вживую, можно запустить ее, указать другие пути для сохранения конфигов, адреса шары и других параметров.

Поступить также, положить в отдельный каталог в шаре для WinPE и поставить в каталоге права 755 (или 777).

chmod 755 *

При зппуске InstallGenerator из WinPE появится следующее окно:

Здесь можно будет выбрать нужные опции. Программа сгенерирует BAT-файл, скопирует файлы в указанное расположение, и, при необходимости, запустит скрипт.

Для генерации скрипта, программа берет данные из файла script.txt, так что его можно всегда подправить. Программа лишь заменяет строки между ! и # на соответствующие значения внутренних переменных.

Пример файла script.txt на PasteBin

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

Скриншоты установки Windows XP из образа Mini Windows XP. И некоторые пояснения

Скриншоты с пояснениями

Готово!

Скачать

BAT-файл xpinstall.bat, sleep.exe и unattend.txt
Утилита InstallGenerator
Готовый образ WinPE с утилитой XPInstall (ярлык на Рабочем столе)

Запуск Mini Windows XP (WinPE) из Hiren’s Boot CD 15.2 по сети (PXE).

Преамбула

Mini Windows XP, «очень полезный горшочек», однако с запуском по сети возникают определенные сложности. Если просто загрузить образ Hiren’s Boot CD с помощью memdisk и запустить Mini Windows XP она свалится.

XP, что PE-версии, что инсталлятор, подружить с PXE проблематично. Мало того, что надо поднимать сервер BINL, который выдаст винде нужные драйвера для сетевых карт, так еще и задолбаешься настраивать загрузчик. Чего только не было — и штатный ntdetect.com не подходил, и патченные в упор не видели файлов ответа (winnt.sif), в общем геморроя было масса.
Но интересно, что Mini Windows XP вообще-то драйвера для сети при загрузке не нужны, все файлы на момент запуска уже переданы на целевую машину, и проблема в чем-то другом. Насколько я понял, в том, как memdisk маппит в память ISO-образ, а винда потом с этим делом конфликтует, скорее всего у нее не получается создать виртуальный диск в памяти. А если попробовать грузить не образ ISO, а образ HDD с виндой? Да! Таким макаром все вышло. Об этом и расскажу.

Необходимые инструменты

— Собственно, ISO-образ Hiren’s Boot CD 15.2
Minimal DOS Image
— Какой-нибудь дистрибутив Linux, в который можно установить виртуальную машину QEMU. Мой пакет для Slackware здесь
— Утилита kpartx, из комплекта multipath-tools. Можно собрать/скачать самостоятельно. На всякий случай, пакет для Slackware
— Windows 7, если захочется провести более глубокую модификацию Mini Windows XP
— Текстовый редактор, поддерживающий переносы строк DOS/Windows (CR+LF), для редактирования конфигов и BAT-файлов DOS, Mini Windows XP и конфига загрузчика Grub4Dos (я делал это в винде).

Далее большой текст с подробностями, картинками, скриптами и файлами для скачивания

Готово!

Осталось только сжать готовые образы gzip‘ом и прописать в меню PXE-сервера:

gzip winpecut.img
gzip winpe.img

LABEL winxppe
    menu label Windows XP PE
    kernel modules/memdisk
    initrd distrib/windows/winpe/winpe.img.gz
    append harddisk

LABEL winxppecut
    menu label Windows XP PE Very Small
    kernel modules/memdisk
    initrd distrib/windows/winpecut/winpecut.img.gz
    append harddisk

Видео загрузки Mini XP по сети

Скачать

Minimal DOS Image
Пакеты:
QEMU
muktipath-tools
Скрипты, утилиты, примеры конфигов из статьи

Образы

Тестовый (минимальный) образ Mini Windows XP
Полный образ Mini Windows XP

C#, программное создание ярлыка (shortcut) Windows

И случайно, самое полное описание WshShortcut.

Преамбула

Почему-то, уж не знаю почему, в .NET Framework (во всяком случае до 4 версии, в 4 вроде появился) не было стандартного способа создать ярлык (файл .LNK) программно. Но способы все-таки есть. Расскажу о них, в порядке уменьшения геморройности.

I. Создать ярлык вручную

Самый геморройный способ, для любителей ассемблера и прочего байтокопательства. Файл ярлыка (*.lnk), это обычный бинарный файл. Почему-то в сети бытует мнение, что формат LNK-файлов закрыт, и чуть ли не засекречен. Однако это не так, спецификация формата вполне себе открыта и лежит на официальном сайте Microsoft. Так что остается осилить 48 страничную спецификацию, и можно приступать. 🙂 Но мы этого делать не будем. Замечу лишь, что в формате файла есть несколько странных моментов. Например, зачем хранить в файле ярлыка серийный номер тома и тип диска (HDD, CD, Floppy) и NetBIOS имя компьютера, я совершенно не понимаю.

II. Обратиться к Windows Script Host через COM-интерфейс

Способ, наиболее часто встречающийся в сети, но почему-то, весьма поверхностно описанный. Windows Script Host — компонент Microsoft Windows, предназначенный для запуска сценариев на скриптовых языках JScript и VBScript, а также и на других дополнительно устанавливаемых языках (например, Perl).

Остановлюсь поподробнее на некоторых моментах. Сначала самое основное.
В References проекта надо добавить соответствующий компонент (щелкнуть по References правой кнопкой мыши, выбрать Add Reference…) В появившемся окне выбираем вкладку COM и находим компонент Windows Script Host Object Model.

Из-за того, что мы используем COM-интерфейс, с нашей программой придется таскать библиотеку для взаимодействия с ним Interop.IWshRuntimeLibrary.dll (ее нам без нашего участия сделает компилятор .NET).
Теперь указываем соответствующую директиву using:

using IWshRuntimeLibrary;

Создаем объект WSH Shell:

WshShell wshShell = new WshShell(); //создаем объект wsh shell
На самом деле у объекта WshShell довольно много интересных возможностей, например выполнять VBS или JS сценарии прямо из кода C#, со всеми возможностями Windows Scripting Host, естественно. Но это так, к слову. Мы же создадим объект для управления ярлыком:

IWshShortcut Shortcut = (IWshShortcut)wshShell.
CreateShortcut(ShortcutPath);

где ShortcutPath — строковая переменная, в которую записан путь к файлу создаваемого ярлыка.

В самом простейшем случае, надо задать имя файла для которого создается ярлык:

Shortcut.TargetPath = @"C:\Windows\notepad.exe"; //путь к целевому файлу

Если дополнительные параметры не заданы, то:
— в качестве иконки ярлыка будет установлена иконка по умолчанию (для EXE — его иконка, для остальных — стандартные системные иконки)
— в качестве рабочего каталога — каталог, в котором расположен целевой файл (тут C:\Windows\).
— размер окна — нормальный.

Теперь нужно сохранить ярлык:
Shortcut.Save();

Пример кода целиком на PasteBin

Теперь о дополнительных параметрах, которым особо никто внимания не уделяет, а там скрыто несколько мелких гадостей и глюков.

Пример кода функции, задающей дополнительные параметры ярлыка на PasteBin

Остальные параметры под катом

Горячая клавиша:
Задается параметром string Shortcut.Hotkey
Внимание! Если переменной попытаться установить значение null, произойдет ошибка нехватки памяти (OutOfMemoryException). Любая строка не подпадающая под формат, вызывает ArgumentException "Значение не попадает в ожидаемый диапазон."

Строка должна быть следующего вида: "Ctrl+Alt+N", т.е. содержать названия клавиш-модификаторов, символьную или функциональную клавишу, названия должны быть разделены знаком + без пробелов. Названия регистронезависимы.
Чтобы хоткей сработал, ярлык надо создавать или в меню Пуск, или на Рабочем столе. Почему-то если создать ярлык где-то еще, а потом скопировать в Пуск или на Рабочий стол, хоткей не работает (хотя, если менять горячую клавишу у уже созданного ярлыка, через свойства ярлыка, то все работает). Установленный хоткей становится глобальным для всей системы, т.е. если "Ctrl+Alt+N" обрабатывается в какой-то программе, то после создания ярлыка, сочетание клавиш будет перехвачено Windows, и запустится то, на что указывает ярлык.
Список возможных клавиш:
Модификаторы: CTRL+ ALT+ SHIFT+ (и еще какой-то EXT+ встречается в [1])
Алфавитно-цифровые, функциональные и прочие:
F1-F12, 0-9, A-Z
ESC, ENTER, TAB, SPACE, PRINT SCREEN
(указывается как SNAPSHOT), BACKSPACE [1] (причем обычным способом через проводник установить их нельзя, и нет, Ctrl+Alt+Del так не перехватить, хотя создать такой хоткей можно).
Полный список клавиш можно посмотреть в WINUSER.H или в [2], имена берутся без VK_, и не получится в качестве третьей клавиши использовать имена модификаторов и мышиных кнопок, ярлык создастся без ошибок, а вот работать не будет.

Забавный баг

Через свойства ярлыка нельзя задать горячую клавишу БЕЗ модификаторов. Windows заботливо будет нам подставлять CTRL+ALT+, а вот с помощью WshShortcut — можно, т.е. если значение Hotkey установить, например в «F1" и создать ярлык на Рабочем столе, то по нажатию F1 будет вызываться, например, Блокнот. На практике это использовать, конечно, никак нельзя, разве что над кем-нибудь подшутить.

Демо и класс-обертка над IWshShortcut на GitHub

III. Создание ярлыка через Windows API.

Вообще, этот способ по геморройности надо было бы ставить на второе место, чего одна статья [3], описывающая все API, стоит. Но авторы статьи, крутые акулы программирования, для нас постарались и таки сделали классы для работы с ярлыками, причем сделали великолепно! С помощью их класса ShellLink можно не только создавать новые ярлыки, но и читать/редактировать существующие.
ShellLink вместе с демо можно скачать с mega.nz или с моего репозитория на GitHub, не знаю, будут ли проблемы с лицензией, но на vbaccelerator.com вроде Creative Commons.
С официального сайта почему-то сей полезный горшочек пропал, хотя статья осталась. Видать авторы забили на проект и что-то протухло.
Повторюсь, класс написан хорошо, ничего не падает и с ошибками не вылетает. Единственное, что криво, это установка хоткея. Ну да и черт с ним, мне особо не нужно было, так что ковыряться и исправлять не стал.
Написано сие дело аж в 2003 г., но прекрасно работает до сих пор, на Windows 7 в т.ч.

Для подключения к своему проекту из оригинального архива понадобятся два класса (файлы ShellLink.cs и FileIcon.cs), далее подключаем соответствующий namespace (using vbAccelerator.Components.Shell;) и можно использовать. Пример кода:

ShellLink shortcut = new ShellLink();
shortcut.ShortCutFile = @"C:\Temp\shortcut\test.lnk";
shortcut.Target = @"C:\Windows\notepad.exe";
shortcut.WorkingDirectory = @"C:\";
shortcut.IconPath = @"C:\Windows\System32\shell32.dll";
shortcut.IconIndex=111;
shortcut.Description = "Тестовый ярлык";
shortcut.Arguments = "file.txt";
shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmMaximized;
shortcut.Save();

Источники

1. WshShortcut.Hotkey Копия
2. Virtual-Key Codes Копия
3. Creating and Modifying Shortcuts (ShellLink, WebArchive) Копия
4. Создание ярлыков с помощью Windows Script Host
5. Спецификация формата файлов LNK Копия

Исходный код

1. ShellLink от vbaccelerator. Скачать с Mega.NZ. На GitHub
2. Демо и класс-обертка над IWshShortcut на GitHub

Отключение стандартных (скрытых) общих ресурсов в Windows 7 (XP, 2000)

А также игры с BAT-файлами.

В Windows 7 (кроме домашней версии), а также и в более ранних (Vista, XP, 2000) версиях присутствуют т.н. стандартные (или скрытые) общие (расшаренные, сетевые) ресурсы, «админские шары». Туда входят локальные диски (имена, например C$, D$, E$), обнаруженные во время установки, «удаленный Admin» (ADMIN$) — каталог операционной системы (например C:\Windows), и специальный ресурс «удаленный IPC» (IPC$). Все эти ресурсы доступны из локальной сети. При обычном просмотре компьютера в локальной сети, например, через «Сетевое окружение» или в проводнике их не видно, но пользователь, обладающий правами администратора, вполне может получить к ним доступ. В Windows XP или 2000 с этим была большая беда и неприятность, особенно в XP, и особенно, если она была установлена с настройками по умолчанию, а безопасности не было уделено должного внимания. Доступ к этим скрытым ресурсам мог получить любой пользователь в локальной сети, знающий логин администратора, если пароль администратора не был установлен. Часто пароль на основную админскую запись — «Администратор» банально забывали установить, даже если создавали отдельного пользователя с админскими правами и паролем.

В Windows 7 с этим вроде бы стало получше: Если на ПК, к которому мы пытаемся подключиться, установлена Windows 7 со включенным контролем учетных записей, подключиться к общим ресурсам можно только используя встроенную учетную запись «администратор». Данная учетка должна быть разблокирована и иметь пароль. Подключение под любым другим пользователем, даже обладающем правами локального админа, не пройдет. [1]

Просмотр расшаренных ресурсов.

Первый вариант. Идем в Пуск —> Все программы —> Администрирование —>Управление компьютером (или нажимаем Win+R и вводим команду compmgmt.msc /s) и выбираем в появившемся окне в левой колонке Общие папки, а потом Общие ресурсы. Должно отобразиться что-то типа этого:

Другой вариант, ввести в консоли команду net share.
Должно получиться что-то типа такого (понятно, что у вас буквы дисков будут другие):

Общее имя   Ресурс                        Заметки

-------------------------------------------------------------------------------
ADMIN$       C:\Windows                      Удаленный Admin                   
C$           C:\                             Стандартный общий ресурс          
D$           D:\                             Стандартный общий ресурс          
F$           F:\                             Стандартный общий ресурс          
IPC$                                         Удаленный IPC                     
L$           L:\                             Стандартный общий ресурс          
N$           N:\                             Стандартный общий ресурс          
Команда выполнена успешно.

Специальный ресурс IPC$

Вот что об этом ресурсе говорит официальная справка:

Общий ресурс IPC$ также известен, как подключение пустых сеансов. С помощью этих сеансов Windows позволяет анонимным пользователям выполнять определенные операции, например получать имена учетных записей домена и список общих сетевых ресурсов.

Общий ресурс IPC$ создается службой Windows Server. Этот особый общий ресурс существует для обеспечения последующих именованных каналов подключения к серверу. Именованные каналы сервера создаются для компонентов, встроенных в операционную систему и приложений или служб, которые установлены в системе. При создании именованного канала процессу задается уровень безопасности, связанный с каналом и затем это гарантирует, что доступ предоставлен только для указанных пользователей или групп. [2] [3]

Проще говоря, если IPC$ удалить, то другой компьютер не сможет посмотреть, есть ли на вашем компьютере расшаренные ресурсы. Так же могут отвалиться некоторые системные сервисы. На практике, у меня отвалился доступ только к 1С «Склад» (7.7), который и был мне не особо нужен, давно хотел откосить от забивания и проверки накладных и от материальной ответственности :). Но не стоит так делать на «сервере» 7.7, где в самом простом случае никакого сервера нет, а просто базы лежат в расшаренной папке — скорее всего, отвалится все к penis canis. 🙂

Внимание! Если просто удалить эти ресурсы через Управление компьютером, то при следующей перезагрузке ресурсы восстанут, и придется опять выливать воду из чайника.

Отключение доступа к стандартным ресурсам через Реестр

На мой взгляд, в XP и ниже это делать надо обязательно, в семерке можно обойтись, но если вы параноик, или, как меня, вас достала какая-нибудь комиссия (да, ФСТЭК и РКН, вдругорядь, не penis canis), то это опять же надо делать.

Необходимо в ключе Реестра
HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
добавить следующие значения:
AutoShareServer и AutoShareWks типа REG_DWORD со значением 0 (Windows XP/2000 Proffessional/2000 Server). Вообще где-то надо один, где-то второй, но если добавить оба — ничего страшного случиться не должно. Для семерки тоже должно работать. [4] [5] [6]
После добавления делаем перезагрузку.

Минусы:
— не отключить доступ к IPC$
— вырубается доступ ко всем скрытым шарам, а иногда такую корову полезно иметь самому, для некоторых дисков, и без установки стороннего ПО.
Плюсы:
+ Вырубается быстро и самое основное.

Отключение доступа через BAT/CMD файл

С одной стороны все довольно просто — можно насовать в файл однотипных команд типа
net share c$ /delete, но так, согласитесь, некрасиво, особенно, если этих самых админских шар десяток, компов сотня, а еще что-то надо кое-где оставить себе любимому. Но на то нам и командные файлы, чтоб сделать «все как ты захочешь».
Покажу на примере самого простого случая — надо удалить все шары, вместе с не удаляемой через Реестр IPC$. Пример простой, но развивая можно улучшить и углУбить под вашу задачу.
Конечно, язык командных файлов Windows жутко беден, по сравнению с огромными возможностями shell Linux, ИМХО, даже с помощью простенькой sh и BisyBox можно сделать то же самое, и даже гораздо больше, намного удобнее. Но это была секунда ворчания — оседлали корову, придется ехать на ней.

Получение и перебор всех значений

Для перебора всех значений (строк) из определенного списка, в BAT/CMD существует оператор (по правилам MS правильнее говорить «внутренняя команда») FOR, которая на самом деле ведет себя как foreach в «больших» языках программирования, т.е. перебирает список/массив данных, пока тот не лопнет кончится.

Общий синтаксис:
FOR %переменная IN (набор) DO команда [параметры] [7]

Чтобы вся магия у нас получилась, перед использованием FOR выполним такую команду:

Setlocal EnableDelayedExpansion

Обычно, в командных файлах команда FOR используется не только для разбора данных, но и их обработки, что требует использования переменных внутри цикла FOR. И здесь возникает проблема — изменения значений переменных не происходит, т.е. их применение внутри скобок невозможно. Подобное явление вызвано не логическими предпосылками, а всего лишь определенными особенностями реализации командного процессора CMD.EXE [7]

Использование Setlocal EnableDelayedExpansion позволяет использование переменных внутри цикла FOR, правда, не совсем. Но об этом далее.

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

FOR /F %переменная IN (набор) DO (
command1 [parameters]
command2
. . .
)

и вместо набор вставить 'команда', где:

'команда' — любая команда Windows, выводящая на консоль некую информацию (не забудьте одинарные кавычки).
/F — указание команде FOR обрабатывать список значений, файлов или вывод команды.

В параметрах команды FOR можно задать разделитель полей. Для этого нужно указать в качестве параметра следующую конструкцию:
delims=xxxнабор разделителей между обрабатываемыми элементами строк. По умолчанию, в качестве разделителей используются пробелы и знаки табуляции. [7]

Если разделитель не задать, то FOR дойдет до первого пробела или табуляции, все остальное выкинет, и перейдет к следующей строке. Т.е. в нашем случае получим:

for /F %%i In ('net share') do (

	echo !ITEM!

)

и вывод:

Общее
-------------------------------------------------------------------------------
ADMIN$
C$ 
D$ 
F$ 
IPC$ 
L$ 
N$ 
Команда

Внезапно, почти то, что нам надо!
А надо нам отключить админские шары, а они выделяются на общем фоне — у них внутри неонка в конце имени $. Надо теперь отделить зерна от плевел.

Ищем подстроку в строке

Итак:
1. создадим переменную при помощи SET, и присвоим ей исходный текст set V1=mother (имена переменных учитывают регистр, имена команд нет).
2. Сделаем следующее:
set V2=%V1:her=%

где her — подстрока, которую надо найти. Если в переменной V1 будет подстрока her, то в переменной V2 окажется подстрока moth (т.е. содержимое переменной V2 без указанной подстроки).

Чтобы проверить, содержит ли строка из переменной V1 подстроку, заданную в пункте 2, надо сравнить результирующие строки. Если они НЕ равны — строка V1 содержит подстроку her.

if NOT %V1%==%V2%

Внезапное НО. Или то, о чем упоминал ранее.

Оказывается, IF внутри FOR не работает, точнее не принимает переменных, не в виде % ITEM%, не в виде %%ITEM%%, не в виде !ITEM!. Как только я не перепробовал (может дурак все-таки я, кто знает — поправьте). Но пока не поправили, пришлось ухищряться.

Подпрограммы

В BAT-файле можно создавать подпрограммы, кривые, косые, но подпрограммы.

Вызываются они так call :метка параметр1 параметр2 ...

После окончания основного файла делается так. Ставится метка подпрограммы, далее идут команды, в конце ставим еще одну метку, например :eof.

В конце основной программы ставим goto :eof

Параметры, переданные этой недоподпрограмме, внутри видятся точно также, как и внешние параметры BAT-файла, т.е. %1, %2. Только в подпрограмме.
После выполнения подпрограммы начинает выполняться следующая команда после call, у нас это новая итерация цикла.

А в подпрограмме мы как раз и производим сравнение, и если нашли символ $ — запускаем команду удаления ресурса:

:check

	set V1=%1
	set V2=%V1:$=%

	if NOT %V1%==%V2% (
		echo %V1%
		net share %V1% /delete
	)

:eof

BAT-файл полностью

@echo off
Setlocal EnableDelayedExpansion

for /F %%i In ('net share') do (

	set ITEM=%%i
	call :check !ITEM!

)

goto :eof

:check

	set V1=%1
	set V2=%V1:$=%

	if NOT %V1%==%V2% (
		echo %V1%
		net share %V1% /delete
	)

:eof

Можно скопировать код с PasteBin [10] или Mega.nz [11]

Автозагрузка BAT-скрипта

С автозагрузкой получается странная штука, на форумах подобный батник советуют просто кинуть в автозапуск и забыть. Может на XP/2000 так и сработает, но на Windows 7 тут кардинальное отличие.

1. Такой батник надо запускать от администратора (пользователя из группы «Администраторы«)
2. Будет заебно заставлять главбуха каждую загрузку подтверждать UAC
3. Сразу дерево почему-то не жужжит, скорее всего, потому что сетевой подсистеме требуется время на запуск, который происходит после входа пользователя в систему. А до этого команда net не работает.

Но тут на помощь пришел опять «Планировщик заданий».
Как в статье про запуск программы без сообщений UAC от имени администратора [12] [13], мы также добавляем наш батник в «Планировщик заданий», но на этот раз, создавая задание, переходим еще и на вкладку «Триггеры«. Добавляем триггер, и откладываем запуск задачи (батника) на 30 секунд. Значение 30 секунд установлено исключительно экспериментально и не на совсем говенной машине, возможно, вам потребуется больше. Ставьте минуту/две.

Источники, литература, дополнительные ссылки и код.

1. Общие ресурсы Windows 7 Копия
2. Общий ресурс IPC$ и поведение пустых сеансов в Windows
3. IPC$ share and null session behavior in Windows
4. Скрытые административные и общие сетевые ресурсы в Windows XP/2000 C$, ADMIN$, FAX$, IPC$, PRINT$
5. https://www.securitylab.ru/forum/forum18/topic15107/
6. Удаление стандартных общих ресурсов C$, ADMIN$, IPC$ Копия
7. Команда FOR КОПИЯ

Обсуждения на форумах:
8. Доступ к сетевым шарам в Windows 7
9. IPC$

Код:
10. Код на PasteBin
11. Код на Mega.NZ

12. Отключение запроса UAC для отдельных приложений
13. Отключение запроса UAC для отдельных приложений

Раритетные рекламные ролики Windows 95

Внезапно, нашел в архиве. Были на лицензионном расширенном диске Windows 95 (2 CD).
Диски за давностью лет потерялись, а ролики остались.

Довольно неказистый от Microsoft

Прямая ссылка
Скачать

Windows в мультипликации Билла Плимптона

Несколько психоделичный ролик, чем-то напоминает советский мультфильм «Контакт».

Прямая ссылка
Скачать

Windows в мультипликации Джоан К. Гратца

Мой любимый добрый ролик, вызывает ностальгию, печаль, пробивает на слезу, а еще в ролике есть котик 🙂

Прямая ссылка
Скачать

Отключение запроса UAC для отдельных приложений

Преамбула

В Windows 7 и выше есть дополнительный механизм безопасности UAC (Контроль учетных записей пользователей). Обычно пользователь заходит в систему под учетной записью с ограниченными правами, а когда приложению для каких-то целей (установка драйверов, изменение файлов в системных папках и т.д.) требуются админские права, то соответствующий запрос появляется на экране у пользователя.

В принципе, можно вообще отключить UAC, но это понизит безопасность системы, т.к. любое приложение (в т.ч. и зловредное) сможет без всякого запроса поднять себе права до уровня администратора, и сделать с системой все, что ему угодно.
А вот для отдельных программ полезно было бы иметь возможность отключить уведомления. Например, у меня в автозагрузке есть несколько служебных программ, которым требуются права администратора, но неудобно каждый раз копытом набирать номер при каждой загрузке системы прихлопывать вылетающие окна с этим запросом 🙂

На самом деле способов есть минимум 3:

— Скачать программку AdmLink и ей воспользоваться (тогда приложение можно будет запускать и пользователю вообще не входящему в группу «Администраторы»)
— Скачать Microsoft Application Compatibility Toolkit, и воспользоваться им.
— И третий, приглянувшийся мне, запускать программу с повышением прав с помощью «Планировщика заданий»

Способ собственно тем и приглянулся, что не надо ничего качать, планировщик заданий есть на любой машине, а вот интернет не везде. Да, способ будет работать только для пользователей, входящих в группу «Администраторы» (для домашнего компьютера, при установке Windows по умолчанию, пользователь обычно в нее входит).

Отключаем запрос UAC с помощью планировщика заданий

Создаем задачу

Для примера создадим ярлык для запуска Редактора реестра (regedit.exe)

1. Запускаем планировщик заданий Пуск —> Все программы —> Стандартные —> Служебные —> Планировщик заданий или в командной строке/через «Выполнить» (Win+R):

taskschd.msc /s

2. Справа в колонке Действие кликаем на Создать задачу:

3. В появившемся окне на вкладке Общие вводим в поле Имя какое-нибудь название, желательно латиницей и без пробелов, чтоб не морочиться потом с кавычками. Например, regedit_adm. Можно также оставить описание (в поле Описание), чтоб не запутаться если что, например, Запуск Regedit с правами администратора.

4. Обязательно ставим галочку Выполнить с наивысшими правами.

5. Переходим на вкладку Действия. и жмем кнопку Создать…
6. В появившемся окне в поле Действие оставляем Запуск программы, а в поле Программа или сценарий прописываем путь к нужной программе или BAT/CMD файлу. При необходимости в соответствующих полях можно указать рабочую папку или необходимые аргументы командной строки.

7. Нажимаем ОК, потом еще раз ОК, таким образом сохраняем задачу.
Задача появится в Библиотеке планировщика заданий, где ее можно при необходимости посмотреть, изменить или удалить, когда станет не нужна.

Закрываем планировщик задач

Создание ярлыка

1. Создаем ярлык на рабочем столе. Клик правой кнопкой и Создать —> Ярлык
2. В появившемся окне прописываем следующее:

C:\Windows\System32\schtasks.exe /run /tn regedit_adm

где regedit_adm — имя созданной вами задачи.

3. Нажимаем Далее, вводим имя ярлыка, например Regedit с правами администратора
4. Можно поменять в свойствах ярлыка значок для красоты. Кстати, внутри Regedit32.exe ВНЕЗАПНО обнаружился прикольный значок в винтажном стиле Windows 3.11

Запускаем ярлык. Окно UAC не появилось

ФАНФАРЫ!

Источник

Статья на oszone.net Копия