Отключение стандартных (скрытых) общих ресурсов в 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 для отдельных приложений

Добавить комментарий

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