Заодно нашел кучу утилит для подбора паролей в 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

Запуск Acronis по сети (PXE).

Аварийные диски Acronis (Disk Director и True Image), наверное, самые простые для запуска по сети. Нужен оригинальный ISO, который можно вытащить из дистрибутива, memdisk и не забыть прописать append iso raw.

Примерно как-то так:

LABEL acronisdd
    menu label Acronis Disk Director 12
    kernel modules/memdisk
    initrd distrib/acr/acronisdd/acronisdd.iso
    append iso raw

Для слабых машин подойдет Acronis True Image 2011, там образ маленький ~122 Мб, а для самых слабых можно изготовить образы DOS с DOS-версиями True Image и Disk Director, примерно вот таким способом (копия)

Менюшка Acronis на PasteBin
Менюшка Acronis на Mega.NZ

Образы DOS для PXE

Minimal DOS Image (img, gzip)
Minimal DOS Image (ISO)
DOS Live CD (ISO)
DOS Utilities (для работы, ключик только своим)
— Big DOS Image (не дам)
Образ загрузочной дискеты FreeDOS

PROMPT 0
ui menu.c32
menu title DOS programs and images

LABEL back
    menu label Back to main menu
    kernel modules/menu.c32
    append pxelinux.cfg/default

LABEL dos
    menu label Minimal DOS image
    kernel modules/memdisk
    initrd distrib/dos/min/dos.gz
    append harddisk
    
LABEL doslivecd
    menu label DOS Live CD
    kernel modules/memdisk
    initrd distrib/dos/doslivecd/doslivecd.iso
    append iso

LABEL freedos
    menu label FreeDOS boot disk
    kernel modules/memdisk
    initrd distrib/dos/freedos/freedos.img
    append floppy

LABEL dosutils
    menu label DOS Utilities
    kernel modules/memdisk
    initrd distrib/dos/utils/dosutils.img.gz
    append harddisk

LABEL bigdos
    menu label Big DOS Image
    kernel modules/memdisk
    initrd distrib/dos/big/bigdos.img.gz
    append harddisk

DOS PXE Menu на PasteBin
DOS PXE Menu (Mega.NZ)

Создание файла нужного размера в 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 (ярлык на Рабочем столе)

Консольные Live-дистрибутивы Linux.

Искал тут себе маленькие консольные (чтоб без иксов при старте) дистрибутивы Линукс. Перелопатил весь гугль. Вот меня пока два устроили, старейший, из мне известных System Rescue CD и INX, на основе Ubuntu, но без X-сервера. Он так и называется INX (Is Not X).

А вы что посоветуете?

Запуск 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 (я делал это в винде).

Создание образа HDD с DOS

1. Складываем все инструменты в отдельный каталог в Linux, и создаем в нем «болванку», для образа HDD:
dd if=/dev/zero of=winpe-test.img bs=90M count=1

Если создавать только минимально работающий Mini Windows XP, то хватит и 60 мегабайт (bs=60M), впрочем, можете попробовать поэкспериментировать и еще уменьшить его.

2. Грузимся в QEMU, указывая в качестве загрузочного устройства образ Hiren’s Boot CD, и приаттачиваем «болванку» образа HDD, как первый жесткий диск:
qemu-system-i386 -cdrom hbcd.iso -hda winpe-test.img -boot d

3. Выбираем в меню загрузки Start Hiren’s Boot CD, потом File Managers и Volkov Commander
Загрузившись в VC вводим команду fdisk3. Эта команда запустит родной Fdisk от Microsoft’а.
У нас один жесткий диск, пока не форматированный и не размеченный, так что в появившемся меню нажимаем 1 и ENTER (Create DOS Partition or DOS logical drive), в следующем меню тоже выбираем 1 пункт (Create Primary DOS Partition), далее отвечаем Y (да). Если все сделано верно, Fdisk предложит перезагрузиться, дабы новый раздел стал доступен в DOS. Выходим из Fdisk и закрываем QEMU.

4. Грузимся в QEMU, но на этот раз указываем в качестве CD Minimal DOS Image:

qemu-system-i386 -cdrom dos.iso -hda winpe-test.img -boot d

Наш новый диск имеет букву D:, но недоступен, поскольку не отформатирован.

5. Форматируем его и делаем системным:

format D: /U /S

Подтверждаем операцию, по окончании вводим метку, например, WINPE.

6. Переходим на диск D (в меню Left—>Drive или Right—>Drive, QEMU перехватывает Alt+F1/Alt+F2), копируем с диска C: файлы autoexec.bat, config.sys, himem.sys и каталоги DOS и VC.

7. В оригинальном образе была опечатка в autoexec.bat, ее можно подправить, заменив строчку DOS;VC на C:\DOS;C:\VC

Содержимое AUTOEXEC.BAT и CONFIG.SYS

8. Можно проверить образ, загрузившись с него в том же QEMU:
qemu-system-i386 -hda winpe-test.img -boot c

Должны появиться окошки Volkov Commander.

Монтирование (и размонтирование) образа диска

Для того, чтобы добавить на диск файлы WinPE, необходимо получить к нему доступ из Linux:

0. Создаем точку монтирования
mkdir /mnt/dos

1. Вешаем образ на Loop-устройство:
losetup /dev/loop0 winpe-test.img
Обычно устройство loop0 свободно, но можно посмотреть свободное командой
losetup -f

2. Маппим разделы:
kpartx -av /dev/loop0

Утилита выдаст сообщение, содержащее название обнаруженного раздела (выделено жирным):
add map loop0p1 (251:6): 0 183393 linear /dev/loop0 63

3. Монтируем раздел:
mount -t vfat /dev/mapper/loop0p1 /mnt/dos

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

1. Размонтируем раздел:
umount /mnt/dos

2. Удаляем информацию о разделе:
kpartx -dv /dev/loop0

3. Освобождаем loop-устройство:
losetup -d /dev/loop0

Чтобы было проще, можно написать два маленьких скрипта:

Подключение образа:

#!/bin/bash

IMAGE="winpe-test.img"

echo "Open WinPE"
losetup /dev/loop0 $IMAGE
MSG=`kpartx -av /dev/loop0`
DEV=`echo $MSG | awk '{print $3}'`
echo $DEV
sleep 5
mount -t vfat /dev/mapper/$DEV /mnt/dos
echo "Complete"
sleep 2

На PasteBin

Примечание: паузы нужны, иначе монтирование может случиться раньше, чем блочное устройство (раздел), появится в /dev/mapper и ничего не примонтируется.

Отключение образа:
#!/bin/bash

echo "Close WinPE..."

umount /mnt/dos
kpartx -dv /dev/loop0
losetup -d /dev/loop0

echo "Complete!"

На PasteBin

Минимально работающий Mini Windows XP

Для создания минимально работающего Mini Windows XP, потребуется взять из образа Hiren’s Boot CD все файлы из \HBCD\XP, и положить их в каталог /HBCD/XP в образе жесткого диска.
Также необходимо настроить загрузчик Grub4Dos:
1. В образе Hiren’s Boot CD находим файл GRUB.EXE и копируем его в корень нашего диска.
2. Создаем конфиг MENU.LST также в корне диска. Я просто подправил оригинальный конфиг из Hiren’s Boot CD, удалив оттуда все лишнее. Содержимое конфига на PasteBin

Скачать GRUB.EXE, MENU.LST, AUTOEXEC.BAT, CONFIG.SYS с Mega.Nz

Внимание! Править MENU.LST, AUTOEXEC.BAT, CONFIG.SYS надо редактором, который умеет в DOS/Windows переносы строк (например, Notepad++)

Проверяем.
1. Грузимся из полученного образа (здесь я делал это уже по сети, о настройке конфига для PXE будет ниже):

2. Запускаем GRUB.EXE:

3. Выбираем соответствующий пункт меню, ждем…

ФАНФАРЫ!

На самом деле, Mini Windows XP получился сильно урезанным, без программ из Hiren’s Boot CD, без толковой поддержки сети и прочих полезностей, что ж, будем улучшать

Добавляем важный софт.

Ну он не так, чтоб уж прямо критически важный, но Mini Windows XP подгружает некоторые программы, например, программу настройки сети, автомонтирования дисков, архиватор из \HBCD\Programs, \HBCD\Programs\Files \HBCD\Dos, я посмотрел в код файлов автозагрузки, и все самое важное выделил.

1. В /HBCD/Programs/Files нашего образа, добавим следующие файлы из \HBCD\Programs\Files ISO-образа:
7Zip.7z
AutoMountDrives.7z
DLL.7z
IrfanView.7z
Notepad.7z
TeraCopy.7z
XpFiles.7z

2. В /HBCD/Dos (из \HBCD\Dos):
BiosBoot.7z
MBRUtil.7z
PCI32.7z
SavePart.7z

3. В /HBCD файл HBCDMenu.exe

4. В /HBCD/Programs пока можно скопировать все файлы, которые не *.cmd (из \HBCD\Programs ISO-образа), CMD-файлы, кроме одного (AutoMountDrives.cmd), придется подправлять, так что AutoMountDrives.cmd можно скопировать.

Лирическое отступление, или про то, как залезть во внутренности Mini Windows XP

Все потроха сего дистрибутива лежат в архиве формата WIM, в Windows 7 имеется стандартная утилита для работы с ним.
Копируем из образа HBCD файл XP.wim куда-нибудь в удобный каталог, и смотрим его содержимое (команды выполнять от администратора):

dism /Get-WimInfo /WimFile:XP.wim

Cистема DISM
Версия: 6.1.7600.16385

Сведения об образе : XP.wim

Индекс: 1
Имя : XP
Описание : <не определено>
Размер (байт): 113 236 979

Операция успешно завершена.

Образ можно подмонтировать в какой-нибудь каталог:
mkdir %TMP%\wim
dism /Mount-Wim /WimFile:XP.wim /name:XP /MountDir:%TMP%\wim

Теперь в каталоге %TMP%\wim — содержимое образа, меня оттуда интересуют два файла:
Startup.cmd, который Mini Windows XP запускает при старте, и prep, который в процессе загрузки переименовывается в Startup2.cmd и выполняется. Оттуда и из XpCustomize.cmd и были вытащены все нужные имена файлов.

Закрыть образ без сохранения изменений:

dism /Unmount-Wim /MountDir:%TMP%\wim /discard

С сохранением:

dism /Unmount-Wim /MountDir:%TMP%\wim /commit

openwim.bat closewim.bat savewim.bat

Источник Копия

Настройка шары на сервере

Итак, что же все-таки делать с остальным софтом? Ну у нас же PXE, а значит есть сервер с Samba. В следующем выпуске я таки начну сначала, и расскажу, как настроить PXE на Linux-машине, и Samba в т.ч. Пока ограничусь секцией конфига smb.conf для этой конкретной шары:

[hbcdshare]
        path=/home/pxe/tftp/distrib/windows/winpe
        public=yes
        browsable=yes
        read only=yes
        guest ok=yes

В каталог /home/pxe/tftp/distrib/windows/winpe копируем каталог Files из ISO-образа HBCD, вместе со всем содержимым. Естественно, для шары вы можете указать любой удобный вам путь.

Подключение шары в Mini Windows XP

1. Правим файл /HBCD/XP/XpCustomize.cmd в нашем образе диска, меняем строку
REM start PENetwork на start PENetwork
Эта команда запустит утилиту настройки сети (нужные драйвера уже есть в комплекте в архиве XpDrvLAN.7z и Mini Windows XP их подгружает, если вы не забыли положить в /HBCD/Programs файлы 7z.exe и 7z.dll)

2. Шара не поднимется, пока не будет настроена сеть, поэтому надо «притормозить» выполнение командного файла (обычно хватает полминуты). Для этого добавим в каталог /HBCD/XP утилиту sleep.exe (приложу ее в архиве ниже)

3. Пропишем следующие команды для паузы и поднятия шары. Шара будет подключена, как сетевой диск, например, с буквой W:

REM Add network share with programms
CD \HBCD\XP
sleep 30
Echo Add Files Share...

NET USE W: \\10.10.0.120\hbcdshare

sleep 10

Файл XpCustomize.cmd целиком
Исходник утилиты sleep

Если все сделано правильно, то после загрузки Mini Windows XP мы увидим сетевой диск в «Моем компьютере»:

А если зайдем внутрь, то файлы:

Исправляем CMD-файлы для запуска софта

1. Извлекаем из ISO-образа все CMD-файлы из \HBCD\Programs в отдельный каталог.
Во всех них, где есть (кроме файла AutoMountDrives.cmd) нужно заменить строчку Files\имя_файла на W:\Files\имя_файла (W: — сетевой диск, куда подключена шара)
2. Специально для этого дела я написал за 15 минут на коленке утилиту на C# — HBCDCmdFix

Пользоваться просто — выбираете каталог с *.cmd файлами и нажимаете Fix. Программа делает резервные копии в *.bak файлы перед изменением.

3. Кладем измененные файлы в /HBCD/Programs, отмонтируем образ нашего HDD, загружаемся с него и пробуем запустить какую-нибудь программу (из меню в системном трее). Если все сделано правильно, то программа запустится

Наводим красивости

Все готово, осталось только навести красоту в загрузочных меню.

Делаем в CONFIG.SYS загрузочное меню DOS (оставим возможность выйти в DOS или перезагрузить компьютер):

Измененный CONFIG.SYS и AUTOEXEC.BAT

Почитать про создание загрузочного меню в MS DOS Копия

Измененный MENU.LST Grub4Dos (добавлена возможность перезагрузиться или выключить компьютер).

А симпатичную надпись в DOS’овом меню, я сделал, подправив в HEX-редакторе IO.SYS. Но как — догадайся мол сама 🙂

Готово!

Осталось только сжать готовые образы 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

Отложенная автозагрузка.

Или автозагрузка нужных программ с подключаемых дисков, внешних носителей и сетевых шар.

Возникла тут производственная задача. Некоторые программы, необходимые для работы, находятся на сетевых шарах (либо подключаемых/шифрованных контейнерах), однако, после загрузки рабочей ОС, они должны автоматически запускаться у пользователя. Для примера, на работе это была программа управления станком.

Решая задачу, перелопатил гору литературы, но ничего готового не нашел. В результате написал свой «Менеджер отложенной автозагрузки».

Принцип работы простой, пользователь в этом самом «Менеджере» указывает путь до нужной программы, лежащей, например, на сетевом диске. «Менеджер» установлен на разделе с ОС, и запускается при ее загрузке. При запуске он проверяет через заданный интервал времени, появился ли нужный «экзешник». Если появился — запускает.

По умолчанию программа работает в портативном режиме (т.е. все настройки и список запускаемых программ, хранятся в директории с программой). Запуск без параметров открывает окно настройки, где можно добавить нужные для запуска задачи, а также в отдельном меню установить время проверки доступности задач, прочие параметры и добавить сам менеджер в автозагрузку ОС. Понятно, что менеджер должен находиться на разделе жесткого диска, который доступен ОС сразу после загрузки.

В качестве запускаемой задачи можно указать не исполняемый файл (exe, com, bat, cmd), но и документ, тогда он откроется в ассоциированной с ним программе.

Для исполнения задач, необходимо запустить менеджер с параметром командной строки /run

Скриншоты


Основное окно настроек

Опции «Менеджера отложенной автозагрузки»

Окно добавления/редактирования задачи

Cправка по параметрам командной строки

StartupDelayed /help
StartupDelayed [/run] [/d|confdir <путь>]
/help
— эта справка
/run — выполнение задач
/d — запускать в «не-портативном режиме» (конфигурационные файлы в директории %LocalApplicationsData%\StartupDelayed)
/confdir <путь> — указать путь к директории с файлами конфигурации

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

Скачать

Инсталлятор (не портативная версия)
Портативная версия
Исходники на GitHub

DetecTOR v 0.3.0b.

Обновлена утилита DetecTOR, которая определяла, присутствует ли определенный IP в сети Tor.

По многочисленным просьбам зрителей добавлен:

— модуль SxGeoSharp, теперь, даже если IP отсутствует в сети Tor, программа возьмет информацию из базы SxGeo (если вы ее скачаете и подгрузите, она бесплатная), и выдаст вам страну (+город и регион, если есть) для конкретного IP-адреса.
— по умолчанию включен портабельный режим, все настройки программы хранятся в подкаталогах с исполняемым файлом.
— режим пакетной обработки. Если у вас есть огромный лог или просто список IPv4 адресов, (тестировалось на 1000 IP-адресов в специально нагенерированном текстовом файле, где IP были расположены в случайном порядке), то программа найдет все адреса, проверит их по БД SxGeo и БД адресов Tor и выдаст результат в виде файла CSV. Можно включить или отключить выдачу в отчет дополнительных данных Tor.
— добавлены дополнительные аргументы командной строки (см. readme.txt).
— проверено замечание пользователя [info]paperdaemon@ljr. Данная ошибка при работе в Windows 7 и более ранних версиях так и не была выявлена.

readme.txt

Основная статья о DetecTOR Копия
Скачать (портативная версия)
Исходники

C#, DataSet, пользовательские типы данных, и хинтик при использовании Dataset Designer.

Известно, что DataSet может хранить пользовательские типы данных в таблицах. Для нетипизированного DataSet, т.е. экземпляра класса DataSet, достаточно, чтобы нужные типы данных были видны из того места кода, в котором будем проводить операции с DataSet. Например, сделаем тестовый enum:

public enum testenum
{
     val0=0,
     val1=1
}

и подключим какое-нибудь дополнительное пространство имен, например:

using System.Diagnostics;

Теперь, в таблицу DataSet можно добавить поля типов testenum и, например, ProcessWindowStyle (из System.Diagnostics)

//...
DataSet dsTest = new DataSet();
//...
dsTest.Tables.Add("Test");
dsTest.Tables["Test"].Columns.Add("Text", typeof(string));
dsTest.Tables["Test"].Columns.Add("Enum", typeof(testenum));
dsTest.Tables["Test"].Columns.Add("Enum2", typeof(ProcessWindowStyle));

Код на PasteBin

Если же делать типизированный DataSet, т.е. добавить в проект DataSet, как отдельный класс (наследник обычного DataSet), и создать нужные таблицы в конструкторе (Dataset Designer), то при попытке просто прописать пользовательский тип DataType в конструкторе, получится ошибка:

На самом деле, имена типов данных нужно вводить полностью, вместе с их пространствами имен. Т.е., при условии, что пространство имен программы, например tmpDataSet, то тип testenum нужно указывать как tmpDataSet.testenum (а тип ProcessWindowStyle, соответственно, как System.Diagnostics.ProcessWindowStyle)


Вещь, вроде бы довольно очевидная, если приглядеться (стандартные типы из списка прописываются точно также):

Но почему-то прямо нигде не озвученная, что странно.

C#, Регулярное выражение для IP-адреса (v4)

Искать айпишники, например, в логах.
Для десятичной (полной) записи:

(25[0-5]|2[0-4]\d|[01]?\d\d?)(\.(25[0-5]|2[0-4]\d|[01]?\d\d?)){3}

Второе, должно поддерживать восьмеричную, шестнадцатеричную, десятичную и смешанную запись:

(0[0-7]{10,11}|0(x|X)[0-9a-fA-F]{8}|(\b4\d{8}[0-5]\b|\b[1-3]?\d{8}\d?\b)|((2[0-5][0-5]|1\d{2}|[1-9]\d?)|(0(x|X)[0-9a-fA-F]{2})|(0[0-7]{3}))(\.((2[0-5][0-5]|1\d{2}|\d\d?)|(0(x|X)[0-9a-fA-F]{2})|(0[0-7]{3}))){3})

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

Протестировать можно здесь
Ну и тесты на C# (от Лехи)

C#, Об анализе exceptions при вызове внешнего процесса.

Или отлавливаем нажатие клавиши «Отмена» в окне запроса UAC.

Вот однажды я писал небольшую утилиту, которая запускает любое приложение или командный файл (bat/cmd) от имени администратора. И мне в комментариях правильно намекнули, что я слишком грубо обрабатываю exceptions, которые могут случиться во время запуска внешнего процесса. Но вообще это хороший пример не только для конкретного случая, но и для подхода к обработке ошибок вообще. Кратко говоря — если вы предполагаете, что где-то может возникнуть ошибка, то есть два метода:
1. Предотвратить и обезвредить. К таким ошибкам, например, относится возможная недоступность файла для чтения/записи, или вообще его отсутствие, когда он нужен. Тогда лучше проверить, например, наличие файла, с помощью File.Exist() перед операцией с файлом.
2. Отловить на этапе времени выполнения. Для этого в C# существуют try/catch.

Нам нужен именно способ #2, поскольку мы не знаем и проверить заранее никак не можем, нажмет пользователь «Отмену» в окне запроса, или нет.

Изначально было сделано так, т.е. тут мы полагались на какой-то внутренний флаг, и от его состояния принимали решение, реагировать на ошибку или нет.

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

Немного теории об exceptions при запуске внешних процессов.

Как известно, в .NET ошибки времени выполнения распределены по классам. Есть общий класс — Exception, в который попадают все ошибки времени выполнения, и есть конкретные классы для обработки определенных ошибок. Иерархия обработки следующая: «от конкретных к общему». Т.е. сначала (если мы хотим их обработать), указываются конкретные ошибки, а потом можно, но не обязательно указать общий обработчик.
Конкретно при запуске внешних процессов могут возникнуть следующие виды ошибок:
ArgumentNullException
ObjectDisposedException
FileNotFoundException
(на самом деле в зависимости от OS но может не сработать, сработает следующий)
Win32Exception
он нам и нужен
PlatformNotSupportedException

На самом деле, практически всегда срабатывает класс ошибок Win32Exception, остальные или очень редки, или их можно охарактеризовать одним словом — случился ой, дальше работать не будем.

Анализ Win32Exception

Для начала подключим нужный namespace:
using System.ComponentModel;

А теперь примемся за анализ. На самом деле, у каждой Win32-ошибки имеется внутренний код. В C#-exceptions он сохраняется в переменной NativeErrorCode. Т.е для решения нашей задачи, нам в конструкции try/catch достаточно отловить конкретный код ошибки. Для нажатия клавиши «Отмена» в окне UAC, это будет код 1223, «Операция отменена пользователем».

Исправление.

1. Сначала надо отловить ошибку типа Win32Exception и проанализировать значение NativeErrorCode.
2. Если NativeErrorCode == 1223, то не предпринимаем никаких действий.
3. Если NativeErrorCode другой, оповещаем пользователя об ошибке.
4. Если сработало исключение другого типа (не Win32Exception), то аналогично предыдущему пункту — оповещаем пользователя об ошибке.

//...

try
{
    Process.Start(psi);
}
catch (Win32Exception wex)
{
    if (wex.NativeErrorCode == 1223) //нажали "Отмену" в окне UAC
    {
        return true;
    }
    else //какой-то другой Win32 Error
    {
        ErrorMessage = wex.NativeErrorCode.ToString() + " " + wex.Message;
        return false;
    }
}
catch (Exception ex) //какой-то другой Exception
{
    ErrorMessage = ex.Message;
    return false;
}

//...

Код полностью здесь

Источники

1. Коды ошибок Win32 (Краткое пояснение и полный список кодов, англ., MSDN)
2. Нужный код ошибки (Отменено пользователем)

Утилита wsudo

1. Репозиторий на GitHub
2. Скачать
3. Заметка об утилите Копия

Психоделические графики (DOS, Turbo Pascal)

Наконец нашел дико красивые графики, которые наш товарищ рисовал в Turbo Pascal под DOS. Ни я, ни товарищ алгоритма не помним, помним только то, что в качестве входных данных была матрица 3×3. Писалось это в качестве какого-то зачета. Но товарищ, тот еще креатвищик, усовершенствовал формулу и задание, в результате программа рисовала четырехмерные графики. Поскольку четырехмерного монитора у нас не было (хотя была мысль собрать, но что б мы делали со своими трехмерными глазами), четвертое измерение отображалось цветом.
С этими графиками связана забавная история, которая, минимум до 2010 г. будоражила универ. Дело в том, что условное задание «нарисовать в паскале графики», давалось всем. Но по внутриуневеровской сети до сих пор ходит, или ходил, легендарный исходник моего товарища. И его периодически некоторые долбозавры брали, и пытались сдать преподу Б. А препод Б. спрашивал, «объясните, как написали, и что оно делает». И это был провал. Сдающего.

Вообще хочу это соптимизировать и сделать из оригинала заставку, на Юнити, например.

https://youtu.be/qutWWmHYjYc

В оригинале звука не было, и работало оно гораздо медленнее, но может в этом виноват эмулятор DOS, я ускорил видео в 20 раз примерно.

Один из исходников, вроде последняя версия, на PasteBin и пример файла данных к нему
Весь архив с проектом

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