Простая настройка ipfw

В Интернете есть много пространных рассказов про то как настроить межсетевые фильтры, экраны, объединить сети и прочие сложности. Я про это писать не буду. Я напишу несколько простых рецептов и примеров, вполне готовых к использованию и рассчитанных на рядового пользователя, которые помогут ему защититься от внешнего вторжения.

Кроме того, здесь я расскажу об одной полезной для web-разработчика (и не только) дополнительной возможности FireWall.

Лично мне понадобился FireWall только когда я стал работать в большой компании в тесном сотрудничестве со многими людьми и мне пришлось открыть ssh-доступ, http-доступ на мою рабочую машину. Кроме того, моя собственная работа привела к тому, что мне пришлось открыть десятки портов, а слушали эти порты приложения, находящиеся в процессе разработки… Одним словом, мне понадобился FireWall, но я не уверен, что он жизненно необходим вам.
Что такое FireWall (коротко)

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

Это всё теория. Главное для нас то, что FireWall — это не программа, а подсистема ядра, что он может блокировать трафик и что его можно гибко настраивать.
Подготовка

Прежде всего, вам надо загрузить модуль FireWall в ядро.

Для тестирования, вы можете сделать это «руками» командой:

kldload ipfw

ВНИМАНИЕ! После того, как вы загрузите FireWall вступят в действие настройки по умолчанию и вы будете полностью изолированны от внешнего мира! Поэтому не торопитесь с выполнением этой команды, не прочитав, как настраивать FireWall, или не сохранив инструкции на своём локальном диске.

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

ipfw_load="YES"

в файл /boot/loader.conf.

Строго говоря, /boot/loader.conf можно и не трогать, модуль подгрузится и если в /etc/rc.conf присутствует firewall_enable=»YES» (см. ниже).
Написание правил

Я не буду здесь пересказывать man 8 ipfw. Он есть в каждой системе, а в сети он есть (хотя и немного устаревший) переведённый на русский язык. Я приведу готовые примеры.

Пример 1: Можно всё

Чтобы разрешить весь трафик, достаточно одного правила

00100 pass all from any to any

Смысл этого правила понятен и без чтения документации: «Пропускай все пакеты от кого угодно к кому угодно». Это правило пригодится вам во время отладки. Неминуемо у вас будут получаться конфигурации в которых вы будете полностью отрезаны от мира. Это правило — идеальное временное решение.

Первое число это номер правила. Каждое правило пронумеровано и проверяются они в порядке возрастания номеров.

Пример 2: Паранойя

Эти правила разрешают только соединения инициированные вами. Снаружи никто даже не может попытаться подключиться. Ваша машина даже не будет «пинговаться», то есть большинство окружающих будут уверены, что она вообще выключена.

Для пользователя эти правила тоже очень жёсткие, они позволяют ему пользоваться далеко не всеми ресурсами сети.

Давайте рассмотрим эти правила по порядку.

00100 allow all from any to any via lo0
00101 deny all from any to 127.0.0.0/8
00102 deny all from 127.0.0.0/8 to any
 
00500 check-state
 
00501 deny all from any to any frag
00502 deny tcp from any to any established
 
00600 allow tcp from any to any  80 out via bge0 setup keep-state
00601 allow tcp from any to any 110 out via bge0 setup keep-state
00602 allow tcp from any to any 143 out via bge0 setup keep-state
00603 allow tcp from any to any  25 out via bge0 setup keep-state
 
00700 allow tcp from any to XX.XX.XX.XX 53 out via bge0 setup keep-state
00701 allow udp from any to XX.XX.XX.XX 53 out via bge0 keep-state
00702 allow tcp from any to YY.YY.YY.YY 53 out via bge0 setup keep-state
00703 allow udp from any to YY.YY.YY.YY 53 out via bge0 keep-state

Правила 100-102 разрешают общение вашего компьютера с самим собой. Может оказаться, что вам эти правила не нужны, но без них могут не заработать некоторые программы.

Правило 500 проверяет виртуальные правила (о них чуть ниже). Если виртуальные правила не сработали, то поиск подходящего правила продолжается.

Правила 501 и 502 запрещают все соединения, которые уже созданы.

Правила 600-603 создают виртуальные правила (keep-state), пропускающие (allow) пакеты для соединений, которые инициированы (setup) вами (out via bge0).

Кстати, имя интерфейса bge0 вам следует изменить на имя вашего интерфейса.

Причём правила 600-603 позволяют вам работать только с WWW (порт 80) и e-mail (порты 25, 110, 143). Если вам нужно работать и по другим протоколам, то добавьте правил по аналогии.

Правила 700-703 аналогичны предыдущим, они позволяют вам работать с DNS, причём только с легальными DNS вашего провайдера. Замените XX.XX.XX.XX и YY.YY.YY.YY на адреса ваших DNS. Добавьте или удалите правила по необходимости.

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

Таким образом мы получили набор правил, который не пропускает входящие пакеты кроме тех, которые пришли в ответ на ваш запрос. Кроме того, вы можете работать только с ограниченным кругом Интернет-сервисов. То есть если у вас заведётся какая-то программа (разве такое возможно под FreeBSD?!), желающая «выйти в интернет» у неё это скорее всего не получится. Кроме того, вы не сможете воспользоваться никакими DNS, кроме тех, которым доверяете. Это сразу резко сужает круг возможных атак.
Пример 3: Разумный компромисс

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

00100 pass all from any to any via lo0
00101 deny all from any to 127.0.0.0/8
00102 deny all from 127.0.0.0/8 to any
00500 check-state
00502 deny all from any to any frag
00501 deny tcp from any to any established
00600 allow tcp from any to any out via bge0 setup keep-state
00601 allow udp from any to any out via bge0 keep-state
# allow in to 80
00700 allow tcp from any to any 80 in via bge0 setup keep-state
# ping
02000 allow icmp from any to any out icmptype 8
02001 allow icmp from any to any in icmptype 0

Здесь разрешён весь трафик инициированный мной (на любые порты).

Правило 700 разрешает всем обращаться к Web-серверу, размещённому на моей машине. Вы можете добавить аналогичные правила для других сервисов. На пример:

00701 allow tcp from AA.AA.AA.AA to any 22 in via bge0 setup keep-state

Это правило разрешит обращаться к вашему sshd с машины с IP-адресом AA.AA.AA.AA.

Наконец, правила 2000 и 2001 разрешают вам «пинговать» других. Вас по-прежнему никто «пинговать» не сможет.

Чтобы ping на вас работал, поправьте эти правила вот так:

02000 allow icmp from any to any icmptype 8
02001 allow icmp from any to any icmptype 0

Или напишите просто:

02000 allow icmp from any to any

Это не опасно.

Строго говоря, грамотный хакер сможет много узнать о вашей системе даже с помощью ping, но в большинстве случаев это все же не опасно.
Загрузка правил

Итак, вы выбрали правило, поправили его под свои конкретные нужды и хотите его загрузить. Для загрузки правил есть программа, которая называется так же, как и модель ядра — ipfw. Существует два способа загрузки.

Первый способ — загрузить правила из файла:

ipfw /полный/путь/к/файлу

Перед загрузкой не забудьте удалить существующие правила:

ipfw -q -f flush

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

#!/bin/sh
ipfw -q -f flush       # чистим
# устанавливаем переменные
oif="bge0"             # мой интерфейс
cmd="ipfw -q add "     # для краткости
ks="keep-state"        # для краткости
# теперь загружаем, используя краткие "макросы"
$cmd 00500 check-state
$cmd 00502 deny all from any to any frag
$cmd 00501 deny tcp from any to any established
$cmd 00600 allow tcp from any to any out via $oif setup $ks
$cmd 00601 allow udp from any to any out via $oif $ks

Чтобы при старте системы всё загружалось автоматически, вам надо дописать в файл /etc/rc.conf строчки:

firewall_enable="YES"
firewall_script="/etc/rc.ipfw"

Упомянутый здесь файл /etc/rc.ipfw может называться и по другому (это имя выбрал я сам). Это просто файл-скрипт, загружающий правила.
Диагностика

Для диагностики есть две команды:

ipfw list

показывает все правила, а

ipfw show

показывает правила и счётчики пакетов, которые совпали с этими правилами. (Имеются полезные дополнительные ключи. Подробнее смотрите документацию.)

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

65535 deny ip from any to any

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

Наконец, ipfw предоставляет возможность, которая никак не связана с безопасностью, но может быть очень полезной при отладке web-приложений. Ipfw может эмитировать торможение сети.

Не вдаваясь в детали (которые всегда можно прочитать в man), приведу сразу пример правил. Загрузить их можно вот такими тремя командами:

ipfw pipe 1 config bw 50Kbit/s queue 20
ipfw queue 1 config pipe 1 weight 50 queue 20
ipfw 00099 add queue 1 tcp from any 9090 to any

Первой командой мы создали трубу (pipe) с скоростью пропускания 50Kbit/s и длиной очереди 20 пакетов. Второй командой мы создали очередь (queue), которая работает с нашей трубой. И третьей командой мы создали правило, которое отправляет в нашу очередь все пакеты, которые идут с порта 9090. То есть даже если вы будете соединяться сами с собой через порт 9090, то ширина канала будет ограничена 50Kbit/s.

Этот механизм позволяет не только ограничивать ширину, но и эмитировать потери пакетов и задержки. Подробнее читайте документацию на ipfw, там всё написано.

Я лишь добавлю, что очерёдность выполнения этих трёх команд не важна. А чтобы удалить трубы и очереди, есть две специальные команды:

ipfw -f pipe flush
ipfw -f queue flush

Не забывайте удалять текущие настройки перед загрузкой новых.

Советы по работе с DNS зонами

Чтобы было наглядней о чем разговор идет, опишу как происходит процесс делегирования. Делегирование — это то каким образом пространство имен в DNS делится на зоны. Зона — это обособленная ветвь пространства DNS имен которая располагается на своих авторитарных DNS серверах. В зону может входить любое количество доменов нижележащего уровня — до тех пор пока они все расположены на одних и тех же авторитарных серверах, зона у них одна и та же.
Делегирование из родительской зоны происходит путем создания NS записей. В дочерней (делегированной) зоне создается полное описание зоны начиная с SOA записи. Вот, например, когда регистрируется домен второго уровня через регистратора nic.ru, то там при регистрации просят указать имена и адреса минимум двух DNS серверов которые будут считаться авторитарными для данной ветви пространства DNS имен. Для проведения делегирования не обязательно иметь под зону именно два DNS сервера — просто у nic.ru такая политика для того чтобы заставить клиентов обеспечить надежность системы. Вот эти два сервера становятся NS записями в домене ru.

Пример. Скажем, нами регистрируется домен второго уровня под названием net.ru. Авторитарными для него будут DNS сервера ns.net.ru (IP 1.2.3.4) и ns2.dnshosting.com (IP 5.6.7.9). В записях DNS серверов отвечающих за зону ru. (которыми управляет организация nic.ru) вносится такая информация:

$TTL 300
ru.   IN   SOA   ns.ripn.net. hostmaster.ripn.net. (
         4014396 ;serial
         7200   ;refresh
         900   ;retry
         2592000   ;expire
         3600   ;neg. ttl
         )
      NS   sunic.sunet.se.
      NS   e.dns.ripn.net.
      NS   ns.ripn.net.
      NS   ns5.msk-ix.net.
 
; это добавили
net.ru.   NS   ns.net.ru.
net.ru.   NS   ns2.dnshosting.com.
ns.net.ru.   A   1.2.3.4

Запись «ns.net.ru. A 1.2.3.4» называют еще «glue record», она нужна в случаях, когда имя NS сервера располагается внутри делегированной зоны. Это вспомогательная запись которую обязательно указывать в таких случаях. Без нее возникла бы ситуация, когда для того чтобы узнать IP сервера ns.net.ru надо обратиться к нему по IP (замкнутый круг). Так как второй NS расположен в чужой зоне, то для него не указываем glue record.

В свою очередь на сервере ns.net.ru который является мастером для зоны net.ru создается полная SOA запись как и полагается:

$TTL 300
net.ru.   IN   SOA   ns.net.ru. hostmaster.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
      MX 10   mail.net.ru.
ns.net.ru.   A   1.2.3.4
 
www.net.ru.   A   9.8.7.6
ftp.net.ru.   A   10.11.12.13
mail.net.ru.   A   11.12.13.14

На slave сервере ns2.dnshosting.com в ручную записи не создаются, но он настраивается так чтобы периодически запрашивать мастер ns.net.ru и перекачивать с него всю информацию о записях в домене, а мастер ns.net.ru настраивается так чтобы отдавать все записи о зоне при запросах с подчиненного.

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

Например случай с делегированием домена третьего уровня. Выглядеть это будет так — в записях зоны net.ru добавляется информация с NS записями о субдомене home.net.ru (допустим, будет только один авторитарный DNS сервер для этого субдомена ns.home.net.ru IP 7.7.7.7)

$TTL 300
net.ru.   IN   SOA   ns.net.ru. hostmaster.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
      MX 10   mail.net.ru.
ns.net.ru.   A   1.2.3.4
 
www.net.ru.   A   9.8.7.6
ftp.net.ru.   A   10.11.12.13
mail.net.ru.   A   11.12.13.14
 
;это добавили
home.net.ru.   NS   ns.home.net.ru.
ns.home.net.ru.   A   7.7.7.7

Ну и соответственно на DNS сервере ns.home.net.ru создается зона с новой SOA записью:

$TTL 300
home.net.ru.   IN   SOA   ns.home.net.ru. adminzoni.mail.ru. (
         2009012501   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.home.net.ru.
ns.home.net.ru.   A   7.7.7.7
 
home.net.ru.      A   7.7.7.8
www.home.net.ru.   A   7.7.7.8
proxy.home.net.ru.   A   7.7.7.9

Был приведен синтаксис зоны как это принято в BIND и NSD. Для djbdns то, что написано выше будет выглядеть так:

Zhome.net.ru:ns.home.net.ru.:adminzoni.mail.ru.: \
2009012501:7200:900:2592000:3600:300
&home.net.ru:7.7.7.7:ns.home.net.ru
+home.net.ru:7.7.7.8:300
+www.home.net.ru:7.7.7.8:300
+proxy.home.net.ru:7.7.7.9:300

До кучи, напишу заодно еще и про реверс зоны и их делегирование.
Система DNS позволяет производить обратные разрешения из IP адресов в DNS имена. Для этого в дереве имен есть специальный служебный домен под именем in-addr.arpa. Этот домен имеет 256 субдоменов, каждый из субдомменов может иметь 256 своих субдоменов, у которых могут быть 256 своих субдоменов, в которых уже будет по 256 имен. Таким образом получается структура вида a.b.c.d.in-addr.arpa. где а,b,c,d это 0-255. На эту часть DNS имен распространяются те же правила, что и на обычные имена, вот только владельцем какого-либо субдомена может стать лишь организация получившая контроль за соответствующим блоком IP адресов — например провайдер, когда покупает для своих нужд у RIPE диапазоны IP адресов. Например, если провайдер купил себе префикс с адресами 123.44.55.0/24 (256 адресов), то он может получить от RIPE (регионального регистратора) и реверс зону в которой начнет создавать PTR записи по просьбе клиентов или для своих нужд:

$TTL 300
55.44.123.in-addr.arpa.   IN   SOA   ns.net.ru. admin.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
 
1.55.44.123.in-addr.arpa.   PTR   hostname.net.ru.
2.55.44.123.in-addr.arpa.   PTR   imja.net.ru.
254.55.44.123.in-addr.arpa.   PTR   esheodnoija.net.ru.

Тут все просто и красиво потому, что в этом примере деление на DNS зону и IP субнет произошло по границе третьего и четвертого байта в IP адресе, а как делегировать половину субнета или только пару IP адресов из него? Скажем, клиент купил себе 8 «белых» IP адресов и захотел получить контроль над назначением реверс имен для них?
В таком случае можно сделать делегирование таким образом — в родительской зоне создаются CNAME записи на подставной домен, а он уже делегируется клиенту:

$TTL 300
55.44.123.in-addr.arpa.   IN   SOA   ns.net.ru. admin.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
 
1.55.44.123.in-addr.arpa.   PTR   hostname.net.ru.
2.55.44.123.in-addr.arpa.   PTR   imja.net.ru.
254.55.44.123.in-addr.arpa.   PTR   esheodnoija.net.ru.
 
;создаем подставные записи
7.55.44.123.in-addr.arpa.   CNAME   7.klient.55.44.123.in-addr.arpa.
8.55.44.123.in-addr.arpa.   CNAME   8.klient.55.44.123.in-addr.arpa.
9.55.44.123.in-addr.arpa.   CNAME   9.klient.55.44.123.in-addr.arpa.
10.55.44.123.in-addr.arpa.   CNAME   10.klient.55.44.123.in-addr.arpa.
11.55.44.123.in-addr.arpa.   CNAME   11.klient.55.44.123.in-addr.arpa.
12.55.44.123.in-addr.arpa.   CNAME   12.klient.55.44.123.in-addr.arpa.
13.55.44.123.in-addr.arpa.   CNAME   13.klient.55.44.123.in-addr.arpa.
14.55.44.123.in-addr.arpa.   CNAME   14.klient.55.44.123.in-addr.arpa.
 
;делегируем клиенту
klient.55.44.123.in-addr.arpa.   NS   ns1.klient.ru.
klient.55.44.123.in-addr.arpa.   NS   ns2.hosting.com.

Клиент принимает у себя:

$TTL 300
klient.55.44.123.in-addr.arpa.   IN   SOA   ns.klient.ru. admin.klient.ru. (
         2009012502   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.klient.ru.
      NS   ns2.hosting.com.
 
7.klient.55.44.123.in-addr.arpa.   PTR   host1.klient.ru.
8.klient.55.44.123.in-addr.arpa.   PTR   host2.klient.ru.
9.klient.55.44.123.in-addr.arpa.   PTR   host3.klient.ru.
10.klient.55.44.123.in-addr.arpa.   PTR   host4.klient.ru.
11.klient.55.44.123.in-addr.arpa.   PTR   host5.klient.ru.
12.klient.55.44.123.in-addr.arpa.   PTR   host6.klient.ru.
13.klient.55.44.123.in-addr.arpa.   PTR   host7.klient.ru.
14.klient.55.44.123.in-addr.arpa.   PTR   host8.klient.ru.
 
...

Да, еще одна штука вспомнилась.
Я когда работал в провайдере, так все хотел приколоться и сделать себе почтовый адрес вида terminus@1.2.3.4.in-addr.arpa, но не успел — все лень было, а потом уволился и сейчас своих реверс зон нет нигде.

Между прочим, нету никакаих объективных причин почему бы такое не работало — DNS должен будет корректно отвечать на запросы о MX записях для домена 1.2.3.4.in-addr.arpa так же как и для обычных доменов. Если есть в наличии SMTP сервер «для поиграться» + желание приколоться, то можно прописать в PTR зоне MX запись, на почтовом сервере на который указывают MX запись прописать домен, и проверить как оно будет (99% что должно работать).

Источник

Ссылки в контекстном меню Windows 7

В ходе этой статьи мы разберем как добавлять ссылки на избранные программы в контекстное меню рабочего стола Windows или «Моего компьютера».

Каскадное меню в Windows 7

Каскадное меню в описании "Моего компьютера"

Инструкция разделена на 2 части:

1. Создание каскадных меню в контекстном и добавление ярлыков.
2. Добавление функциональности ярлыкам путем их регистрации.

Часть 1. Создание контекстных меню и добавление ярлыков

1. Откройте редактор реестра (напишите «regedit» в строке «Выполнить» или строке поиска меню «Пуск» и нажмите Enter).

2. Перейдите в следующую ветку:

HKEY_CLASSES_ROOT\Directory\Background\shell

Если Вы хотите добавить каскадное меню в контекстое меню «Моего компьютера», тогда перейти нужно в эту ветку:

HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell

3. Теперь необходимо создать новый ключ реестра в разделе «Shell». Нажмите правой кнопкой мыши на ключе «Shell» и выберите «Создать -> Раздел». Дайте ему какое-то оригинальное и неподражаемое имя, например «Menu1» (без кавычек).

4. Теперь выберите только что созданный раздел «Menu1». В правой части окна нам необходимо создать 4 строковых параметра:

MUIVerb
SubCommands
Icon
Position

Параметры Icon и Position Вы можете и не создавать (они опциональны), а вот MUIVerb и SubCommands — обязательны.

MUIVerb — это имя каскадного меню, которое будет отображаться в контекстном меню. Вы можете назвать его как угодно, например, «Приложения», «Браузеры» и т.д.

SubCommands содержит список команд, разделенных точкой с запятой (;). Эти команды будут показаны в каскадном меню. Вы не можете напрямую добавить ярлык приложения. Сначала в этом списке Вам нужно дать команде имя, а после этого зарегистрировать ее согласно инструкции во 2 Части статьи.

5. Давайте проясним насчет строкового параметра «SubCommands».

Предположим, что Вы уже создали каскадное меню «Apps» (переводчику неохота самому делать скрины, поэтому он не перевел это слово), как это описано в пункте 3, и теперь Вы хотите добавить в него ярлыки Notepad (блокнота) и Calculator (калькулятора). В таком случае Вам нужно задать такое значение параметру «SubCommands»:

notepad;calc

Вы можете использовать и команды «Блокнот» и «Калькулятор», но в данном случае нужно будет использовать их во 2 части этой инструкции.

6. Параметр Icon используется для отображения иконки. В нашем примере его значение explorer.exe, поэтому у каскадного меню «Browsers» значок так горячо всеми любимого браузера.

Добавление каскадного меню в Windows 7

7. Параметр «Position» используется для определения позиции каскадного меню в контекстном. По умолчанию это середина контекстного меню, но Вы можете выбрать значения Top (сверху) или Bottom (снизу).

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

Часть 2. Добавление функциональности ярлыкам путем их регистрации

Как только Вы добавите ярлыки программ в какскадные меню, Вам необходимо будет их зарегистрировать следующим образом:

1. Перейдите в следующий раздел:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\Shell

2. В этом разделе нам нужно создать новые ключи для каждой из команд, указанных ранее в строковом параметре SubCommands.

В нашем примере мы использовали 2 команды: notepad и calc, поэтому нам нужно создать два ключа в разделе «CommandStore\Shell» с такими же именами.

3. После создания ключа выберите его и в правой части окна редактора реестра задайте параметру Default имя, которые Вы хотите видеть в каскадном меню. Например, введите сюда Notepad или Calculator или любую другую строку.

4. Если Вы также хотите добавить ярлыку иконку, создайте новый строковой параметр с именем icon и установите его значением путь к EXE файлу приложения или любой другой иконке. Например, чтобы показать иконку «блокнота», Вы должны задать параметру Icon значение notepad.exe

5. И теперь последний шаг! В каждом из только что созданных ключей создайте новый ключ и назовите его command.
Выберите его и в правой части окна установите значением Default путь к EXE-файлу необходимой программы. Например, если ярлык должен открывать «блокнот», то для Command должно быть установлено значение notepad.exe

Добавление каскадного меню в Windows 7

PS:

Блокнот является родным Windows-приложением, поэтому Вы можете не указывать полный путь к нему, но если Вы хотите запускать стороннюю программу, то необходимо указать полный путь к ее EXE-файлу.

Автор в оригинальном тексте приводит уже готовые reg-файлы, поэтому можно взять их за основу и сделать это все намного быстрее.

Контекстное меню рабочего стола:

    Windows Registry Editor Version 5.00
 
    [HKEY_CLASSES_ROOT\DesktopBackground\Shell\Menu1]
    «MUIVerb»=«Apps»
    «SubCommands»=«notepad;calc»
    «icon»=«explorer.exe»
 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\notepad]
    @=«Notepad»
    «icon»=«notepad.exe»
 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\notepad\command]
    @=«notepad.exe»
 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\calc]
    @=«Calculator»
    «icon»=«calc.exe»
 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\calc\command]
    @=«calc.exe»

Контекстное меню «Мой компьютер»:

    Windows Registry Editor Version 5.00
 
    [HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Menu1]
    «MUIVerb»=«Apps»
    «SubCommands»=«notepad;calc»
    «icon»=«explorer.exe»
 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\notepad]
    @=«Notepad»
    «icon»=«notepad.exe»
 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\notepad\command]
    @=«notepad.exe»
 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\calc]
    @=«Calculator»
    «icon»=«calc.exe»
 
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\calc\command]
    @=«calc.exe»

Примечание:

Если Вы хотите удалить созданное каскадное меню, просто удалите ключи, созданные в пункте 3 первой части и пункте 2 второй части статьи.

Источник

Получение нового IP от DHCP сервера в Windows

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

1. Перейдите в меню Start и нажмите Run

2. Появится окно вызова. Введите cmd и нажмите OK

3. Откроется командная строка. Введите ipconfig. Вы увидите IP адрес и другую информацию о сетевых интерфейсах вашего компьютера.

4. Введите ipconfig /release для освобождения IP адреса.

5. Наконец введите ipconfig /renew для получения нового адреса.

Найти по MAC адресу IP компьютера

Как-то случайно натыкался на полезные скрипты для определения по мак адресу айпи компьютера:

такой вот коротенький батничек, пингующий группу адресов и записывающий в файлик arp_table.txt

@echo off
if exist arp_table.txt (
if exist arp_table.bak del arp_table.bak
ren arp_table.txt arp_table.bak
)
for /L %%i in (1,1,254) do (
echo 192.168.0.%%i
ping -n 1 192.168.0.%%i>nul
arp -a 192.168.0.%%i>arp_string.tmp
for /F "skip=3 tokens=*" %%j in (arp_string.tmp) do (
echo %%j|find /V "invalid">>arp_table.txt
)
)
del arp_string.tmp

и более тотальный скрипт:

  1. '******************************************************************************
  2. '* File: mac2ip.vbs
  3. '* Purpose: Finds IP of the host with given MAC address.
  4. '* Syntax: cscript mac2ip.vbs /mac:MAC_ADDRESS /ip:IP_BLOCK [/p:pause]
  5. '* Version: 1.0.2
  6. '*
  7. '* Technology: VBSCRIPT,WSH,WMI
  8. '* Requirements: Windows XP or newer (uses Win32_PingStatus WMI class)
  9. '*
  10. '* Authors: 4u3u (asuhovey mtu-net ru)
  11. '*
  12. '******************************************************************************
  13. Option Explicit
  14. 'On Error Resume Next
  15. Dim objShell,strOutput,i,strMAC,objOutput,objAdapter,intPause
  16. Dim strSTime,strIP,strNameSpace,strQuery,colAdapters,PausePattern
  17. Dim colResult,IPPattern,MACPattern,strArpCommand,strOMAC
  18.  
  19. '* Matches valid MAC address
  20. MACPattern = "^([0-9a-f][0-9a-f]-){5}([0-9a-f][0-9a-f])$"
  21. '*Matches valid IP block
  22. IPPattern = "^b((25[0-5]|2[0-4]d|[01]dd|d?d).){3}$"
  23. '*Matches positive integer
  24. PausePattern = "^d+$"
  25.  
  26. '****************************************
  27. 'Parse arguments
  28. '****************************************
  29. strOMAC = WScript.Arguments.Named("mac")
  30. strMAC = Replace(LCase(strOMAC),":","-")
  31. strIP = Wscript.Arguments.Named("ip")
  32. intPause = Wscript.Arguments.Named("p")
  33. If intPause="" Then intPause=1000
  34. If Wscript.Arguments.Count<2 Then
  35. Syntax()
  36. End If
  37. If not ArgVrf(strMAC,MACPattern) Then
  38. WScript.Echo "ERROR: Invalid MAC: '" & strOMAC & "' Check syntax..." & VbCrLf
  39. Syntax()
  40. End If
  41. If not ArgVrf(strIP,IPPattern) Then
  42. WScript.Echo "ERROR: Invalid IP: '" & strIP & "' Check syntax..." & VbCrLf
  43. Syntax()
  44. End If
  45. If not ArgVrf(intPause,PausePattern) Then
  46. WScript.Echo "ERROR: Invalid Pause: '" & intPause & "' Must be positive integer." & VbCrLf
  47. Syntax()
  48. End If
  49.  
  50. ''****************************************
  51. 'Check if script is running by cscript.
  52. 'If not, restart script using cscript.
  53. '****************************************
  54. Set objShell = WScript.CreateObject("WScript.Shell")
  55. If Instr(1, WScript.FullName, "CScript", vbTextCompare) = 0 Then
  56. objShell.Run "cmd /k cscript.exe /nologo """ & WScript.ScriptFullName & """ /mac:" &_
  57. strOMAC & " /ip:" & strIP & " /p:" & intPause, 1, False
  58. WScript.Quit
  59. End If
  60.  
  61. '****************************************
  62. 'Check if given MAC is owned by local host
  63. '****************************************
  64. strNameSpace = "winmgmts:{impersonationLevel=impersonate}//./root/cimv2"
  65. strQuery = "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True"
  66. Set colAdapters = GetObject(strNameSpace). ExecQuery(strQuery)
  67. For Each objAdapter in colAdapters
  68. If LCase(Replace(objAdapter.MACAddress,":","-")) = strMAC Then
  69. WScript.Echo strOMAC & " is YOUR MAC address!"
  70. WScript.Quit
  71. End If
  72. Next
  73.  
  74. '****************************************
  75. 'Ping all IPs in range.
  76. '****************************************
  77. strSTime = Now()
  78. strQuery = "SELECT * FROM Win32_PingStatus WHERE Address = '" & strIP
  79. For i = 1 To 254 Step 1
  80. Set colResult = GetObject(strNameSpace). ExecQuery(strQuery & i & "'")
  81. WScript.StdOut.Write "."
  82. If i/51-Int(i/51)=0 Then
  83. WScript.StdOut.WriteLine " " & Int(100*i/254) & "%"
  84. End If
  85. Next
  86. WScript.Echo ". 100%" & VbCrLf & "Ping completed in " & DateDiff("s",strSTime,Now()) & " seconds." & VbCrLf
  87.  
  88. '****************************************
  89. 'Get IP-MAC pair from ARP cache.
  90. '****************************************
  91. WScript.Sleep(intPause)
  92. strArpCommand = "%comspec% /c arp.exe -a | find /i """ & strMAC & """"
  93. Set objOutput=objShell.Exec(strArpCommand).StdOut
  94. WScript.Echo String(56,"=")
  95. i=0
  96. Do While Not objOutput.AtEndOfStream
  97. i=i+1
  98. strOutput = objOutput.ReadLine
  99. WScript.Echo StrOMAC & " is " & RTrim(Left(LTrim(strOutput),15))
  100. Loop
  101. If i=0 Then
  102. WScript.Echo strOMAC & " was NOT FOUND" &_
  103. " on the local network" & VbCrLf &_
  104. "Either host is unreachable or " & strIP &_
  105. "xxx is not" & VbCrLf & "your local network."
  106. End If
  107. WScript.Echo String(56,"=")
  108.  
  109. '****************************************
  110. 'Subroutines
  111. '****************************************
  112. '*Syntax
  113. Sub Syntax()
  114. Dim s
  115. s = "Finds IP of the host with given MAC address." & VbCrLf & VbCrLf
  116. s = s & "SYNTAX: cscript /nologo " & UCase(WScript.ScriptName) &_
  117. " /mac:MAC_ADDRESS /ip:IP_BLOCK [/p:pause]" & VbCrLf & VbCrLf
  118. s = s & " MAC_ADDRESS MAC address to search for. MAC_ADDRESS" & VbCrLf
  119. s = s & " is in XX-XX-XX-XX-XX-XX format. Both" & VbCrLf
  120. s = s & " ':' and '-' delimiters allowed." & VbCrLf
  121. s = s & " IP_BLOCK First three octets of local ip range to" & VbCrLf
  122. s = s & " scan. E.g. '192.168.0.' Only /24 subnets" & VbCrLf
  123. s = s & " are supported in current version." & VbCrLf
  124. s = s & " pause Pause after ping in milliseconds." & _
  125. VbCrLf & " Default is 1000 (1 second)" & VbCrLf & VbCrLf
  126. s = s & "Example:" & VbCrLf
  127. s = s & " cscript /nologo " & UCase(WScript.ScriptName) &_
  128. " /mac:01-23-45-67-89-AB /ip:192.168.0." & VbCrLf
  129. WScript.Echo s
  130. WScript.Quit 1
  131. End Sub
  132.  
  133. '*Arguments validation
  134. Function ArgVrf(arg,pattern)
  135. Dim objRegExp
  136. Set objRegExp = New RegExp
  137. objRegExp.IgnoreCase = true
  138. objRegExp.Pattern = pattern
  139. ArgVrf = objRegExp.Test(arg)
  140. Set objRegExp = Nothing
  141. End Function
  142.  
  143. '****************************************
  144. 'End of script
  145. '****************************************