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

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

Преамбула

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

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

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

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

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

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

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

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

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

taskschd.msc /s

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

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

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

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

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

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

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

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

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

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

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

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

ФАНФАРЫ!

Источник

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

DriverPackSolutions для старых компов

Жалуются тут, что последний на старых компах падает и виснет.
Нашел старый, кому надо, вот ссылка на DriverPackSolutions 11:
https://mega.nz/#!dQUTlaxL.
Ссылка без ключа, тому ще, кто сильно жаловался, ключ был по почте отправлен. Но если кому сей раритет вдруг будет нужен, пишите в комментарии на ЛЖР, я дам, если вежливо попросить.

C# и автозагрузка из реестра.

Преамбула

Оказывается, несколько моих рабочих софтин тихо отвалились, пока пользователи молчали, как партизаны (обычное дело). Теперь я стал работать в Win 7, где не был вырван с корнем UAC и вся виндовая система безопасности. Мне-то хватало Comodo, а что-то действительно важное крутилось на Linux. Ну зато нашел баги. И приобрел опыт.

В чем баг

Я почему-то, если нужна была автозагрузка из реестра, пытался прописываться в HKEY_LOCAL_MACHINE (Software\Microsoft\Windows\CurrentVersion\Run), а для того, чтоб туда прописаться, нужны права администратора.
Чтоб сделать правильно, надо прописываться не в HKEY_LOCAL_MACHINE, а в HKEY_CURRENT_USER, т.е. в куст реестра, ответственный за настройки текущего пользователя, что и вообще правильно, и админских прав не надо.

Как исправил

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

Функции класса

1. Autorun.Add() — добавляет программу в автозагрузку Реестра.
2. Autorun.Remove() — удаляет программу из автозагрузки Реестра.
3. Autorun.Check(bool FixPath) — проверяет статус, если FixPath установлен в True, то исправляет путь к приложению на новый, если приложение было ранее добавлено в автозагрузку, но местоположение экзешника изменилось.
4. Autorun.Switch () — изменяет автозапуск на противоположный (т.е., если программа в автозагрузке — удаляет, если нет — добавляет)

Ссылка на демо

На GitHub

C#, запуск программы от имени администратора

Или как я сделал недо-sudo для Windows 7

Преамбула

У меня для работы понаписана куча батников для всяких мелких задач: перенастройки сетевых соединений, включения/отключения устройств и т.д. Некоторые команды требуют повышения уровня доступа до администратора, потому батники отказались на семерке работать.

Поскольку работаю я в основном в консоли, да и рабочий стол захламлять не охота, то от создания кучи ярлыков на нужные батники я отказался. Про штатный runas в Windows я знаю, но он меня тоже не устроил. Хотелось, чтоб как в новом Far Manager’е — при необходимости выполнить операцию от имени администратора, выскакивало стандартное окошко виндового UAC, запрашивалось подтверждение и выполнялась нужная команда.
В общем решил я написать быстренько свой недо-sudo на C#, благо действительно получилось быстро и удобно.

Рассуждения и подготовка

Способ, вполне штатный, произвести такое дело с помощью C# есть, но о нем ближе к концу. Пока скажу, что для запуска внешнего процесса нужен будет полный путь к исполняемому файлу, а прописывать его каждый раз очень сильно влом, потому батники пусть лежат в каталоге, доступном в PATH, а нам придется немного «прикинуться операционкой» и вести себя как она. А операционка действует просто. Если просто введена команда без расширения, то она ищет сначала в текущем каталоге, а потом в каталогах из переменной PATH файл с расширением .com, .exe, .bat, .cmd — нашла, значит выполняет.
Так и будем делать.

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

private static string[] FindDirs = null;
private static string[] Extensions = new string[] {"com","exe","bat","cmd"};

2. Функцию для получения списка каталогов из PATH Копия
3. Функцию, которая будет собирать список каталогов, в которых будет производиться поиск. Не буду здесь ее приводить, она просто добавляет текущую директорию (с помощью Directory.GetCurrentDirectory()) и список, полученный на предыдущем шаге в массив. См. в классе FindApp функцию GetFindDirs()
4. Понадобится функция, определяющая по расширению, является ли файл исполняемым. Она тоже довольно проста. См. ссылку выше private static bool IsExecutable(FileInfo fi). Структуру FileInfo сформируем на шаге поиска далее. Она в цикле сравнивает расширение файла, если оно указано, со списком расширений исполняемых файлов.
5. Функцию, которая ищет файл, если расширение не задано private static string FindNoExt(string path, string FileName) Она проверяет, заканчивается ли путь к директории символом \, в цикле подставляет расширения и проверяет наличие файла по указанному пути с помощью File.Exists(). Если файл найден — возвращает полный путь, если нет — null.

Поиск файла

Функция Find (string Command) в классе FindApp

1. Получаем список каталогов, в которых будем искать, с помощью ранее описанной функции GetFindDirs()
2. Создаем класс FileInfo:

FileInfo fi = new FileInfo(Command);

3. Проверяем, был ли задан путь к исполняемому файлу. Тут надо остановиться немного подробнее. Если в команде Command путь задан не был, то свойство DirectoryName класса FileInfo будет содержать текущий каталог, что никак нам не поможет. Поэтому, надо проверить, был ли задан полный путь. Проще всего это сделать, проверив, содержала ли команда Command символ \:
if (Command.Contains("\\"))
...

4. Если каталог указан, то проверяем, указано ли расширение. Тут можно воспользоваться свойством Extension структуры FileInfo. Оно будет пустым, если расширение не задано. Если расширение задано, то проверяем, является ли файл исполняемым, и в случае, если да — возвращаем его полный путь. Если расширение не указано, пытаемся найти в каталоге исполняемый файл с помощью ранее созданной функции FindNoExt.
5. Если каталог не задан в команде, то выполняем шаг 4 для каждого каталога из списка поиска, пока не найдем файл. Если файл так и не будет найден, значит возвращаем null.

Запуск программы

Выполнение программы организовано в отдельном классе RunApp

Проверка админских прав

Сначала мы должны проверить, а нет ли прав администратора у нас уже. Для этого надо будет подключить пространство имен using System.Security.Principal;
Сама проверка вынесена в отдельную функцию:

public static bool IsAdmin()
{
    WindowsPrincipal pricipal = new WindowsPrincipal(
        WindowsIdentity.GetCurrent());

    return pricipal.IsInRole(
        WindowsBuiltInRole.Administrator);
}


Выполнение

Подключаем пространство имен using System.Diagnostics;

public static bool Excecute(string path, string parameters)
{
    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = path;
    psi.Arguments = parameters;            
    bool admin = IsAdmin();

    if (!admin)
    {
        psi.Verb = "runas";
    }

    try
    {
        Process.Start(psi);
    }
    catch (Exception ex)
    {
        if (admin) //админские права уже были, что-то испортилось
        {
            ErrorMessage = ex.Message;
            return false;
        }
       //иначе может быть просто нажали отмену в UAC
    }
    return true;
}

Сначала формируем структуру ProcessStartInfo из пути к программе и параметров. Далее проверяем наличие админских прав, если их нет, то указываем системе, что процесс-программу нужно запустить с правами администратора с помощью psi.Verb = "runas";
Далее запускаем процесс.
Проверки, правда, минимальные. И наверняка, кривые.

Основная программа

Ну тут вообще все элементарно. Это консольное приложение, при запуске которого ему передаются в командной строке параметры. Первый — имя вызываемой команды, остальные — ее параметры. См. здесь

Источники

Статья на Cyberforum

Скачать

Исходники на GitHub
Готовую программу с GitHub

Программист биокибернетических автономных модулей.

Есть у меня постоянная клиентша, скажем, Юля, которой периодически надо восстанавливать систему на ноуте, тому ще также периодически ее грохает мелкий Юлин сын. У Юли есть еще и гражданский муж, скажем Вова, работающий прорабом на стройке.

Сыну, пусть будет Леша, около 5 лет, такой шустрый почемучка с шилом в пигидии, от которого прячутся коты, программисты и любая другая живность, попавшая в зону поражения. Детей я терпеть не могу, но зато очень люблю виски и коньяк, которым меня Юля с Вовой усердно потчуют, так что я к ним всегда лечу, аки муха на мед, и даже денег беру только на такси.

Для них, как и почти для любых юзверей, я «программист» и даже «хакер» (могу сломать пароль на винде, значит хакер). И сыну Юля всегда говорит, что вот, дядя Панкарь программист, сейчас все починит, и Леша опять будет смотреть своих смешариков. Единственное мое достижение в этой семье — я их подсадил на великолепного Глебыча и на «Магазинчик Бо». Ну вот, дело не в этом.

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

— Дядя Панкарь, а папа Вова тоже программист, как и ты!

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

Пока я сползал под стол, Вова и Юля ржали в голос. Отсмеявшись, привели меня в чувство и объяснили. Оказывается, мелкий сходил на стройку с папой, увидел, как тот командует бригадой, и расшифровал папину должность ПРОРАБ, как ПРОграммист РАБочих!

Так и живем.

C# Пример Charmap (таблицы символов) для различных кодировок.

Очередное студенческое задание, да. Причем опять, то ли препод не совсем адекватный, то ли студент, то ли мы дебилы и не видим чего-то лежащего на поверхности. Потому что «совсем для всех» кодировок, поддерживаемых .NET оно не получается.

Для начала, пришлось задачу все-таки глобально поделить на 3 больших части:
— кодировки однобайтовые (Windows 1251, DOS 866 и т.д.)
— кодировка Unicode
— кодировки многобайтовые, но не Unicode (всякие там японские, китайские и прочие).

Однобайтовые

С ними проще всего. Достаточно перебрать все символы от 0 до 255, перекодировать их последовательно в UTF-16 стандартной функцией класса Encoding и вывести на экран.

Encoding enc = Encoding.GetEncoding(CP);
for (int i = 0; i < 256; i++)
{
	string sChr = enc.GetString(new byte[] { (byte)i });
	//...
}

Отделить их от остальных тоже просто, у объекта Encoding есть свойство IsSingleByte

Unicode

С этим тоже особой сложности нет, весь стандарт открытый, можно взять список диапазонов Юникода прямо с официального сайта. Разобрать, залить в ComboBox и отображать кусками, для больших кусков сделать постраничное листание.

Главная проблема была побороть глюк с отображением символа с кодом > FFFFh Копия, из-за чего пришлось использовать RichTextBox и периодически пересчитывать ему размер в зависимости от используемого шрифта и символа, а также в нужных местах перерисовывать таблицу, чтоб та не расползалась.

Вторая проблема - изобрести какое-то подобие "композитных" шрифтов в BabelMap, т.е. подгружать разные шрифты для разных диапазонов Unicode, поскольку шрифта, абсолютно поддерживающего все символы Unicode нет, он бы получился чудовищно большим. И те, которые есть-то, не маленькие, из нескольких файлов, и весят под сотню мегабайт.

Чтоб ради задания не загадить систему шрифтами, пришлось предусмотреть возможность грузить их из файлов, а тут поджидал уже другой глюк, на этот раз Framework'а Копия.

В общем, процентов 90 кода (да и процессорного времени) уходит на возню со шрифтами и отрисовку таблицы.

Отделить варианты кодирования Unicode от других кодовых страниц тоже несложно, благо всего этих вариантов не так много (UTF16 LE/BE, UTF32 LE/BE, UTF8 и UTF7).

public static bool IsUnicode(int CodePage)
        {

            if (CodePage == 65001 ||
                CodePage == 65000 ||
                CodePage == 1201 ||
                CodePage == 1200 ||
                CodePage == 12000 ||
                CodePage == 12001)
                return true;
            else return false;            
        }


А получить конкретный символ можно вот таким способом:

if ((num >= 0x00d800) && (num <= 0x00dfff))
{
	st = Convert.ToString((char)num);
}
else
{
	st = char.ConvertFromUtf32(num); 
}


if ((num >= 0x00d800) && (num <= 0x00dfff)) - это чтобы не попасть в диапазоны суррогатов, но все-таки на их месте что-то отображать (в шрифтах там обычно пустые символы или знаки ?), а char.ConvertFromUtf32() при попадании в диапазон суррогатов свалится с ошибкой.

Остальные многобайтные кодировки

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

Нет, был, конечно, вариант простого перебора всех возможных вариантов. Максимальное количество байт, необходимых для кодирования символа в указанной кодировке можно получить с помощью Encoding.GetEncoding(cp).GetMaxByteCount(1), но перебрать все возможные значения, например, для массива размером уже в 4 байта, перебирая его, например, так, да еще и фильтруя все лишнее, непомерно долго.

В общем, вроде бы того, что сделали, оказалось достаточно.
Пришлось студенту писать пояснительную записку с источниками 🙂

Исходник примера на GitHub
Скачать

Leha S, NKT

Понабежало студентов

Со своими заданиями на C#, заочники, ко всему прочему. И хрен бы с ним с уровнем знаний, кто-то умеет форму нарисовать сам, уже хорошо, кто-то знает, что такое форма (хотя бы для выпечки пирожных), кто-то умеет водить большой железный корабль и стрелять из… ну чем там корабЕль стреляет. У кого-то своя фирма по вебдезигну и наружной рекламе (такие обычно не приходят, им есть, кому на работе делать, или они сами умеют).

Страшнее студентов-заочников могут быть только преподаватели, которые им попадаются, и по закону подлости, самому, э-э-э… отстающему студенту, вот-вот, водителю корабЕля, достался самый въедливый препод. «Мало того, что говорящий, но и совсем непьющий препод, хрен знает с какой планеты», у которого ко всему прочему требование, чтоб все комментарии были на английском. Русофобия! Ну вот куда товарищ полковник… Правильно, товарищ полковник ему в прошлом году сам сдавал.

Первое задание было ничего, написать кодер/декодер из BASE64 и обратно. Ну вот как-то так

А второе, написать «менеджер паролей» с базой в XML, умеющий импортировать пароли и заметки к ним из произвольных текстовых файлов типа:

Иван Иванов
ivanov@example.org
13/01/1979
vatnik1931

Марья Иванова
ivanova@example.org
31/02/1989
vatnica1945

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

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

Другие не вздумайте этим изделием пользоваться в целях всамделишного хранения настоящих паролей.

А вискарь, кстати, приехал поездом в косту из гламурманска, Леха его забрал и привез, но я пока не пробовал, меня покрысла грыза уличная и доктор пока запретил алкашку, как несовместимую с антибиотиками.

Перекодировщик в/из BASE64
Исходники типа «менеджера паролей»

Неверный IMEI после прошивки Philips Xenium v 377 и его восстановление.

Принесли означенный телефон, выдающий ошибку «Неверный IMEI» и не видящий ни одной сим-карты. По *#06# также выдается сообщение о неверных IMEI. Восстановил через инженерное меню, по инструкции. Делаю заметку на случай, если вдруг еще понадобится, а оригинал инструкции сгинет.

Сначала надо попасть в инженерное меню:

*#*#3646633#*#*

Далее переходим на вкладку Connectivity и выбираем пункт CDS Information

Далее переходим в пункт Radio Information

Далее выбрать Phone (там их будет два, для первой сим-карты и второй)

Для Phone 1 надо ввести команду AT+[ПРОБЕЛ]EGMR=1,7,”ваш имей”
Нажать кнопочку SEND AT COMMAND

Вместо «ваш имей», таки да, IMEI. Они под крышкой на наклейке, приклеенной на металл корпуса.
Если забыть пробел, то чуда может не получиться, произойдет ошибка This command is not allowed in UserBuild

Перезагружаем устройство, проверяем наличие IMEI #1 по *#06#, повторяем операцию для второго слота, с той только разницей, что выбираем Phone 2 и вводим другую команду: AT+[ПРОБЕЛ]EGMR=1,10,”ваш имей”

Оригинал инструкции
Картинки утащены оттуда же, надеюсь, автор не обидится.

Установка Windows 7 с жесткого диска

Бредистория

Или сраный интеловский чипсет. В общем, вызвали меня на заказ, поставили задачу — десятку убить, семерку вкрутить. Беру верную флешку с YUMI, на которой есть образ Acronis Disk Durector, всякого рода винды и линуксы, нужные для эникейной работы, и начинаю.

Снес я Windows 10, убил б-гмерзкое GPT, переделил диск, вставляю флешку с установщиком Win 7, но не выходит каменный цветок, посылает меня установщик Windows 7 за Cdrom drivers, иначе говоря, Windows 7 просит драйверы CD-ROM.

Непорядок, подумал я, ибо CD-ROM даже в проекте не было. Легкое гугление дало ответ, Windows 7 не поддерживает USB 3.0 искаробки. Гейц с ним, включаю в BIOS режим совместимости USB. Линуксы и флешку и hdd видят, акронис тоже, а вот инсталлятор Windows 7 — хрен.

В общем думал я, думал, и таки нашел способ поставить Win7 с жесткого диска, хотя кучу времени зря потратил на добавление драйверов USB, различную греблю с перетыканием флешек и прочей фигней, есть же способ гораздо проще…

Что надо

1. Две флешки. На одну кладем любимую «форматилку», он же менеджер дисков и Hiren’s Boot CD. Вообще весь HBCD нам тут нахрен не нужен, можно обойтись вырезкой из сабжа.
2. Чуть не забыл, нужен еще какой-нибудь легковесный Linux. Я в конкретном случае использовал Puppy Linux.
3. Флешка 2, на которой или образ установочного диска Win7, или уже подготовленный для загрузки с флешки установщик. В моем случае, был вариант 2, заранее подготовленный с помощью rufus
4. Достаточное дисковое пространство. В моем распоряжении был аж терабайтный винт, хотя описываемый ход котом можно повторить даже на 50-гигабайтном IDE-HDD, буде он в такой конфигурации железа окажется.

Что делаем

1. Делаем разделы диска, как нам угодно. Например, я сделал логический диск D: для файлов пользователя, на 700 Гб, в конце диска, и оставил область в 300 Гб в начале неразмеченной. Установщик Win 7 сам ее потом разметит, положит файлы ОС на будущий диск C: и создаст свой загрузчик на отдельном разделе 'Зарезервировано системой', размером 100 Мб

2. Делаем с помощью любимого менеджера дисков, логический раздел для установщика Windows 7, размер варьируется, от 5 до 8 Гб, но лучше сделать 8. Формат (файловая система) раздела NTFS или FAT32, последнее предпочтительнее.

3. Загружаемся в Linux, и если вы последовали совету использовать Puppy, то все будет «какввенде» — рабочий стол, ряд дисков ниже, флешка с виндой с иконкой флешки. Жаль, не могу заснять видео, машину уже унесли

4. Копируем файлы с флешки с установщиком Windows на созданный раздел. Файлы скопировать просто: открываем флешку, кликая по ней 1 раз, открываем нужный диск (аналогично), переключаемся в окно с открытой флешкой, нажимаем CTRL+A, выделяя все в окне, и мышкой перетаскиваем в соседнее окно, где открт нужный раздел

5. Осталось перезагрузиться с загрузочной флешки, и выбрать пункт меню Boot From Hard Drive (Windows Vista/7/2008 or Xp), если вы грузитесь через PXE или с установленного на YUMI HBCD, или последовательно выбрать Boot Windows (XP/2003/2008/Vista/7) From Local HDD а только потом Boot From Hard Drive (Windows Vista/7/2008 or Xp)

Если все сделано верно, то Grub4DOS найдет bootmgr, а тот запустит установщик Windows 7.

Останется установщику указать неразмеченную область диска для установки.

Потом раздел с установщиком можно снести и объединить его с диском C: или D:.

Как-то так, прошу прощения, что без скриншотов и видео, пациента уже выписали.

Утилита для PXE или загрузочной флешки, запускающая Windows с локального жесткого диска.

А нахрена он нам?

Спросит вдумчивый читатель. И будет прав.

Отвечу на это:
1. Да чтобы запустить локальную Windows, если, например, слетел к чертям собачьим MBR, оригинального диска с виндой под руками нет, а зайти смерть, как надо, и именно в локальную винду.
2. Чтобы запустить установку Windows 7 (а может быть и 8, а может быть и 10, а может быть ворона, я не проверял) с локального жесткого диска. А вот зачем это — расскажу позднее.

Как сделано

1. Использован образ DOS, взятый отсюда
2. Подправлен AUTOEXEC.BAT
3. Добавлен Grub4DOS, причем особо не заморачиваясь, утащен с мультизагрузочной флешки, созданной YUMI
4. Подправлен menu.lst также нагло спертый из Hiren’s boot CD
5. Создана ISO-версия этого безобразия, по вот этому рецепту

Скачать

Готовый образ
Готовый образ, сжатый gzip
ISO-образ

Примечание

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

Рабочее

Вот ведь блинский блин. Друг, товарищ и вообще хороший человек (Ага, три раза человек. Д-р В█████кий ) ███████ устроился на новую работу. И ведь опять, блядь, ██████████. Этот анекдот мне уже начинает надоедать. Мало того, что из ███████ ████████, как из меня ████████ ███, так еще и ███████ ему попадаются есть отдельная шутка юмора, в них обычно не ████████ нужен, а Геракл, чтоб вычистить эти авгиевы конюшни. Нормальный ████████ в такие места идет только за большие деньги, которых у таких контор нету. Ну если есть, то на ████████ █████████. Посему берут ████████ за сраные ███-███ ████ в месяц, поскольку ███████ на такие деньги идет. А работать приходится мне, ну это уже тому ще ███████ не шарит. Если и шарит, то хуево и не в том.
███████, конечно, везет, на самом деле. Тому ще, во-первых, я его █████, а во-вторых, ████████ не предполагает личного посещения этих клоак, и можно помогать █████ с помощью ████████, ███████, всяких ██████████ ████████, ███ и такой-то матери, не отрывая жопу от уютного дивана в Финляндии.
Так вот, новая работа ███████ это вообще что-то с чем-то, в типа таком же говне работает небезызвестный ██████ (██ ████ ██████████ ███████). В общем контора занимается «██████» и сидит на ███████████. У нее внутри неонка даже ███████████ есть, причем кроме ███████████ там походу вообще нет ничего. Исходя из объяснений ████████, контора занимается чем-то ███████-███████-█████████████, вроде ███████████ ██████████ ██████. Это типа официально. На самом деле внутрях даже не неонка, а сплошное ██████- ███питие, куча ███ постпенсионного возраста, четыре █.█.█ (и █.█.█.), которые в чем-то понимают, но постоянно в разъездах или в ███████ и до кучи ████████-████████ на какой-то крутой тачке. ███████ говорит, что на ████████, но тут веры ███████ нет, ибо в машинах он шарит еще хуже, чем в █████████. Совершенно не понимаю, как ████████ взяли в эту контору с █████████████, ибо он везде проходит как ███████████████ █████████████, █████, ████, ████████ и ███████ (причем со █████████, а ни как я). У меня, собственно, все то же, только без █████████████ и █████ ██████ ████.
Ну да ладно. Так вот, об █████████. Как оказалось, в ████████ ну просто не авгиевы конюшни, а конюшни размером с небольшую ███████, типа ███████ ████████.
— везде винды, поставленные еще на заводах при покупке компов, в основном XP, самое свежее — директорский ноутбук с █████ Половину виндов на всем этом хозяйстве надо переустановить, естественно, не проебав данные. Дисководов нет, USB залиты чем-то типа █████████ (████████████). Фотку показать не могу, ибо тоже ███████████. Если просочится, то ████████ изменят класс на «Евклид» (а вас переведут в класс D, будете у меня за SCP-█████ ухаживать — примечание д-р В████ский). Единственный способ общения компов со внешним миром — сетевой разъем.
— кроме компов есть еще некие устройства типа «очень старый китайский телефон» но в чехле от танка. По характеристикам что-то типа третьего пня (хорошо, хоть x86, а не какой-нибудь ARM или ПЦ ПОМЕР). Памяти от 64 до 128 Мб. Софт под DOS (нагло выдранный из 98 винды, видимо без всякого уведомления тов. ██████). Причем все это железо упаковано в реальный такой железный чемодан. Называется херня «█████████».

И все это надо обслуживать, сбэкапить ось и софт с «█████████» (штатную бэкапилку █████████████, а без нее «███████» может только свои данные выгружать с помощью специальной █████████████, запускаемой с «██████████████████» ████), переустановить винды где надо. В общем ад, ужас, шок, трепет и крипота с домовыми.

После интенсивных телефонных переговоров и разрытия склада с деталями был собран относительно неплохой по местным меркам «сервак» (пень четвертый, 1.7 Ггц, гиг памяти). Туда водрузили слакварь и решили поднять PXE-сервер. Поскольку секретность ™, то на █████████ повесили еще и отчетность. Т.е. ему надо составлять [ДАННЫЕ УДАЛЕНЫ], как именно он сделал то-то и то-то. И снабжать ссылками на открытые источники. Поскольку писать у █████████ получается только [ДАННЫЕ УДАЛЕНЫ], то мне придется вас немного █████████ ██████████████████. Заодно и сайт попиарю, да не забанит меня Роскомганьба (Не стоит так оскорблять нашу организацию, мы гораздо круче — примечание д-ра Б█████████).
Как-то так.

Уважаемый █████████ █████████ ██████████████████ еще раз допустите утечку информации, и/или будете в таком тоне отзываться о делах на Базе ███, или об SCP-████, которого вы пренебрежительно называете ██████, то я лично скормлю вас какому-нибудь Кетеру.
О5-█

Дыбр

Поскольку, что-то серьезное писать влом (мануалы в разработке, плокады лень рисовать), то напейшу дыбр. С 12 этажа одного жилого здания в Хельсинках охуительный вид. Да, будем брать вторую. А потом можно увольняться и открывать что-то свое, ибо хоть «дядя» и охуенный, но все-таки «дядя». Кстати, сам «дядя» не против, и даже готов на первое время помочь юристами и сопровождением. Возможно, мне скоро понадобятся кодеры-фрилансеры. Много кодеров. Когда становиться в очередь — скажу. Плюс пара представителей в ГОРФ. Желательно с юридически-бухгалтерским образованием, и плюс еще два с хорошо подвешенным языком. Все не точно, но расклад пока такой.

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/314755.html
Прокомментировать заметку можно по ссылке выше.