Прямая ссылка: https://youtu.be/lO5xD3R6MpA
Tag Archives: it
Отложенная автозагрузка.
Или автозагрузка нужных программ с подключаемых дисков, внешних носителей и сетевых шар.
Возникла тут производственная задача. Некоторые программы, необходимые для работы, находятся на сетевых шарах (либо подключаемых/шифрованных контейнерах), однако, после загрузки рабочей ОС, они должны автоматически запускаться у пользователя. Для примера, на работе это была программа управления станком.
Решая задачу, перелопатил гору литературы, но ничего готового не нашел. В результате написал свой «Менеджер отложенной автозагрузки».
Принцип работы простой, пользователь в этом самом «Менеджере» указывает путь до нужной программы, лежащей, например, на сетевом диске. «Менеджер» установлен на разделе с ОС, и запускается при ее загрузке. При запуске он проверяет через заданный интервал времени, появился ли нужный «экзешник». Если появился — запускает.
По умолчанию программа работает в портативном режиме (т.е. все настройки и список запускаемых программ, хранятся в директории с программой). Запуск без параметров открывает окно настройки, где можно добавить нужные для запуска задачи, а также в отдельном меню установить время проверки доступности задач, прочие параметры и добавить сам менеджер в автозагрузку ОС. Понятно, что менеджер должен находиться на разделе жесткого диска, который доступен ОС сразу после загрузки.
В качестве запускаемой задачи можно указать не исполняемый файл (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).
— проверено замечание пользователя paperdaemon@ljr. Данная ошибка при работе в Windows 7 и более ранних версиях так и не была выявлена.
Основная статья о 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));
Если же делать типизированный 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. Но на самом деле нам нужно отследить конкретную ошибку, для соответствующей нашему случаю реакции на нее, а изначально, мы этого не сделали, полагаясь на авось (внутренний флаг).
Как известно, в .NET ошибки времени выполнения распределены по классам. Есть общий класс — Exception
, в который попадают все ошибки времени выполнения, и есть конкретные классы для обработки определенных ошибок. Иерархия обработки следующая: «от конкретных к общему». Т.е. сначала (если мы хотим их обработать), указываются конкретные ошибки, а потом можно, но не обязательно указать общий обработчик.
Конкретно при запуске внешних процессов могут возникнуть следующие виды ошибок:
ArgumentNullException
(на самом деле в зависимости от OS но может не сработать, сработает следующий)
ObjectDisposedException
FileNotFoundException
— он нам и нужен
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. Нужный код ошибки (Отменено пользователем)
1. Репозиторий на GitHub
2. Скачать
3. Заметка об утилите Копия
Психоделические графики (DOS, Turbo Pascal)
Наконец нашел дико красивые графики, которые наш товарищ рисовал в Turbo Pascal под DOS. Ни я, ни товарищ алгоритма не помним, помним только то, что в качестве входных данных была матрица 3×3. Писалось это в качестве какого-то зачета. Но товарищ, тот еще креатвищик, усовершенствовал формулу и задание, в результате программа рисовала четырехмерные графики. Поскольку четырехмерного монитора у нас не было (хотя была мысль собрать, но что б мы делали со своими трехмерными глазами), четвертое измерение отображалось цветом.
С этими графиками связана забавная история, которая, минимум до 2010 г. будоражила универ. Дело в том, что условное задание «нарисовать в паскале графики», давалось всем. Но по внутриуневеровской сети до сих пор ходит, или ходил, легендарный исходник моего товарища. И его периодически некоторые долбозавры брали, и пытались сдать преподу Б. А препод Б. спрашивал, «объясните, как написали, и что оно делает». И это был провал. Сдающего.
Вообще хочу это соптимизировать и сделать из оригинала заставку, на Юнити, например.
В оригинале звука не было, и работало оно гораздо медленнее, но может в этом виноват эмулятор DOS, я ускорил видео в 20 раз примерно.
Один из исходников, вроде последняя версия, на PasteBin и пример файла данных к нему
Весь архив с проектом
C#, программное создание ярлыка (shortcut) Windows
И случайно, самое полное описание WshShortcut
.
Почему-то, уж не знаю почему, в .NET Framework (во всяком случае до 4 версии, в 4 вроде появился) не было стандартного способа создать ярлык (файл .LNK) программно. Но способы все-таки есть. Расскажу о них, в порядке уменьшения геморройности.
Самый геморройный способ, для любителей ассемблера и прочего байтокопательства. Файл ярлыка (*.lnk
), это обычный бинарный файл. Почему-то в сети бытует мнение, что формат LNK-файлов закрыт, и чуть ли не засекречен. Однако это не так, спецификация формата вполне себе открыта и лежит на официальном сайте Microsoft. Так что остается осилить 48 страничную спецификацию, и можно приступать. 🙂 Но мы этого делать не будем. Замечу лишь, что в формате файла есть несколько странных моментов. Например, зачем хранить в файле ярлыка серийный номер тома и тип диска (HDD, CD, Floppy) и NetBIOS имя компьютера, я совершенно не понимаю.
Способ, наиболее часто встречающийся в сети, но почему-то, весьма поверхностно описанный. 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
Вообще, этот способ по геморройности надо было бы ставить на второе место, чего одна статья [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
Отключение запроса UAC для отдельных приложений. Видеоверсия инструкции.
Сетевые namespace’ы Linux, отдельные конфигурации для каждого namespace.
Это заметка от моего собственного склероза, потому что мелочи иногда забываю.
Для общей информации, что такое этот самый сетевой неймспейс. Это такая хитрая фиговина в ядре Linux, которая позволяет на одной машине с одной сетевой картой соединяться с сетью, будто у вас вагон и маленькая тележка этих сетевых карт (соответственно, куча локальных IP), можно, например, на одном неймспейсе поднять VPN до одного провайдера, на втором — до второго, на третьем — коннектиться к основному, и т.д.
Network namespace — это логически отделенный от других стек сетевых протоколов в Linux. Такая себе контейнерная виртуализация для сетевых интервейсов, когда chroot LXC и нужна виртуализация только сетевых интерфейсов. Эмулируется полностью сетевой стек: сетевые интерфейсы, таблица маршрутизации, файрволл и т.д. Так, как это работает на уровне ядра и для определенных процессов, то вполне можно получить рабочую конфигурации, когда на одной машине есть несколько сетевых интерфейсов с одинаковыми IP-адресами и ничто не конфликтует.
Хочу по этим штуковинам написать большой материал, как мы их у себя сконфигурировали и развели с одного сервера целый пул доступа к разным VPN-провайдерам, но руки не доходят. Поэтому да, заметка от склероза.
Каждому из нэймспейсов можно подсунуть свою конфигурацию сети, свои конфигурационные файлы (resolv.conf
, hosts
)
Для этого достаточно положить соответствующие файлы в директорию /etc/netns/имя_namespace
, например, для гипотетического namespace с именем riseupvpnns
это будет каталог /etc/netns/riseupvpnns
, туда можно положить, например, resolv.conf
, прописать необходимые DNS, и эта конфигурация будет влиять только на данный namespace, в независимости, что там в основной системе прописано.
C# Получение пути к папке ОС Windows
Оказывается, вплоть до версии .NET 4 в перечислении Environment.SpecialFolder
нет пути к папке, куда установлена Windows (обычно C:\Windows
). Эту досадную оплошность можно обойти двумя способами:
1. Посмотреть в переменную окружения SystemRoot
или windir
:
string windir=Environment.GetEnvironmentVariable("SystemRoot");
string windir=Environment.GetEnvironmentVariable("windir");
2. ВНЕЗАПНО, бывают хитрые самосборные или специальные дистрибутивы, где данных переменных окружения нет. Тогда:
— надо взять путь к директории system
, (обычно это C:\Windows\System32
), который есть в Environment.SpecialFolder
во всех версиях .NET: Environment.SpecialFolder.System
— получить директорию выше уровнем:
string windir = System.IO.Directory.GetParent( Environment.GetFolderPath(Environment.SpecialFolder.System));
SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Содержание
SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. Часть I — инициализация (и введение)
-Преамбула
-Общая структура БД
-Заголовок базы данных
-Дополнительные перечисления и мелкая корректировка с придирками.
-Поля, свойства и конструктор класса
-Функции для чтения БД
-Функции для чтения заголовка
-Закрытие базы данных
-Открытие базы данных, чтение и проверка заголовка, чтение индексов.
SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Часть II. Поиск.
-Трехбайтовые числа
-Байтовый substr
-Поиск ID или смещения в «Диапазонах IP»
-Функция поиска в «Диапазонах» (SearchDB)
SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Часть III. Универсальный формат упаковки данных и получение данных из справочников.
-Приведение типов
-Анализ (распаковка) записи
-Обработка полей записи
-Дополнительные функции
SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Часть IV. Получение данных.
-Чтение информации из справочников
-Поиск в справочнике по ID
-Очистка ответа
-Функция, формирующая финальный ответ.
SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Приложение
-Дополнительно
-Источники
-Код на GitHub
-Создатели
SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Приложение
Спецификация формата SxGeo Копия
https://github.com/tolik-punkoff/sxgeosharp
БД Cypex Geo (с) 2012-2018 БИННОВАТОР
SxGeoSharp:
Идея: Leha Silent (Tolik-punkoff/Chaossoft/ОИМ)
Реализация: Werwolf aka PunkArr[] aka IogSohoth (Tolik-punkoff/Wildsoft/ОИМ)
Спонсор: OpPosition (ОИМ)
Слава Украине!
SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. -Часть IV. Получение данных.
Закончим с SxGeoCountry, в которой нет справочников и информации кроме ID страны.
В оригинальном исходнике есть массив с кодами стран, а позиция в массиве, как раз ID страны из базы. Соответственно, надо просто сходить в нужный элемент массива за ISO-кодом страны.
Сделаем соответствующую функцию private string IdToIso(uint ID)
Тут все просто, мы должны либо взять определенное количество байт из массива (на это дело есть bSubstr
), либо прочиатать данные с диска. На это у нас есть поток SxStream
и все позиции — start
— откуда начинать читать, seek
— сдвиг в файле, и max
— максимальная длина записи в байтах.Читать далее…
SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Часть III. Универсальный формат упаковки данных и получение данных из справочников.
Данные в справочниках хранятся в «универсальном формате упаковки данных», каждая запись идет последовательно, без разделителей. Сама запись имеет переменный размер, и состоит как из бинарных, так и из строковых данных. Вот тут разработчиками был подложен второй поросеночек — прочитать записи переменной длины и загрузить их в удобный DataSet
без бубна нельзя. Третий поросеночек, к сожалению, никак не отраженный в спецификации, был в том, что числовые данные в «универсальном формате» на самом деле в little-endian! Хотя в спецификации было указано, что данные хранятся в big-endian, и все работало до того момента, когда я не попытался прочитать данные из справочников.
SxGeoSharp. Интерфейс на C# для базы данных SypexGeo. — Часть II. Поиск.
Итак, наша основная задача вообще-то найти регион (страну, город) соответствующего IP-адреса. Вот этим и займемся. Точнее, найдем либо ID страны, либо смещение в файле БД, откуда потом вытащим данные. Этот функционал реализован в функции
private uint SearchID(string IP)
.
Читать далее
Отключение стандартных (скрытых) общих ресурсов в 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$ также известен, как подключение пустых сеансов. С помощью этих сеансов 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$
— вырубается доступ ко всем скрытым шарам, а иногда такую корову полезно иметь самому, для некоторых дисков, и без установки стороннего ПО.
Плюсы:
+ Вырубается быстро и самое основное.
С одной стороны все довольно просто — можно насовать в файл однотипных команд типа
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
@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]
С автозагрузкой получается странная штука, на форумах подобный батник советуют просто кинуть в автозапуск и забыть. Может на XP/2000 так и сработает, но на Windows 7 тут кардинальное отличие.
1. Такой батник надо запускать от администратора (пользователя из группы «Администраторы
«)
2. Будет заебно заставлять главбуха каждую загрузку подтверждать UAC
3. Сразу дерево почему-то не жужжит, скорее всего, потому что сетевой подсистеме требуется время на запуск, который происходит после входа пользователя в систему. А до этого команда net
не работает.
Но тут на помощь пришел опять «Планировщик заданий».
Как в статье про запуск программы без сообщений UAC от имени администратора [12] [13], мы также добавляем наш батник в «Планировщик заданий», но на этот раз, создавая задание, переходим еще и на вкладку «Триггеры«. Добавляем триггер, и откладываем запуск задачи (батника) на 30 секунд. Значение 30 секунд установлено исключительно экспериментально и не на совсем говенной машине, возможно, вам потребуется больше. Ставьте минуту/две.

1. Общие ресурсы Windows 7 Копия
2. Общий ресурс IPC$ и поведение пустых сеансов в Windows
3. IPC$ share and null session behavior in Windows
4. Скрытые административные и общие сетевые ресурсы в Windows XP/2000 C$, ADMIN$, FAX$, IPC$, PRINT$
5. https://www.securitylab.ru/forum/forum18/topic15107/
6. Удаление стандартных общих ресурсов C$, ADMIN$, IPC$ Копия
7. Команда FOR КОПИЯ
Обсуждения на форумах:
8. Доступ к сетевым шарам в Windows 7
9. IPC$
Код:
10. Код на PasteBin
11. Код на Mega.NZ
12. Отключение запроса UAC для отдельных приложений
13. Отключение запроса UAC для отдельных приложений
Раритетные рекламные ролики Windows 95
Внезапно, нашел в архиве. Были на лицензионном расширенном диске Windows 95 (2 CD).
Диски за давностью лет потерялись, а ролики остались.
Несколько психоделичный ролик, чем-то напоминает советский мультфильм «Контакт».
Мой любимый добрый ролик, вызывает ностальгию, печаль, пробивает на слезу, а еще в ролике есть котик 🙂
Отключение запроса UAC для отдельных приложений
В Windows 7 и выше есть дополнительный механизм безопасности UAC (Контроль учетных записей пользователей). Обычно пользователь заходит в систему под учетной записью с ограниченными правами, а когда приложению для каких-то целей (установка драйверов, изменение файлов в системных папках и т.д.) требуются админские права, то соответствующий запрос появляется на экране у пользователя.

В принципе, можно вообще отключить UAC, но это понизит безопасность системы, т.к. любое приложение (в т.ч. и зловредное) сможет без всякого запроса поднять себе права до уровня администратора, и сделать с системой все, что ему угодно.
А вот для отдельных программ полезно было бы иметь возможность отключить уведомления. Например, у меня в автозагрузке есть несколько служебных программ, которым требуются права администратора, но неудобно каждый раз копытом набирать номер при каждой загрузке системы прихлопывать вылетающие окна с этим запросом 🙂
На самом деле способов есть минимум 3:
— Скачать программку AdmLink и ей воспользоваться (тогда приложение можно будет запускать и пользователю вообще не входящему в группу «Администраторы»)
— Скачать Microsoft Application Compatibility Toolkit, и воспользоваться им.
— И третий, приглянувшийся мне, запускать программу с повышением прав с помощью «Планировщика заданий»
Способ собственно тем и приглянулся, что не надо ничего качать, планировщик заданий есть на любой машине, а вот интернет не везде. Да, способ будет работать только для пользователей, входящих в группу «Администраторы» (для домашнего компьютера, при установке Windows по умолчанию, пользователь обычно в нее входит).
Создаем задачу
Для примера создадим ярлык для запуска Редактора реестра (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 не появилось
ФАНФАРЫ!
C#, .NET Framework 2.0 Декодировка URL-адреса без System.Web.
Понадобилось тут перекодировать URL с русскими буквами в нормальный текст, т.е. нечто вида https://ru.wikipedia.org/wiki/URL#%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_URL
в читабельный вид https://ru.wikipedia.org/wiki/URL#Кодирование_URL
В MSDN сходу нашлось решение для .NET Framework 4, а вот для 2.0 так сразу не нашлось, но оказалось, что все-таки решение есть.
string text = https://ru.wikipedia.org/wiki/URL#%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_URL
text = text.Replace("+", " ");
text = System.Uri.UnescapeDataString(text);
string text = https://ru.wikipedia.org/wiki/URL#Кодирование_URL
text = System.Uri.EscapeDataString(text);
На самом деле, тот случай, когда мопед совершенно не мой, и я просто объяву разместил.
1. https://ru.wikipedia.org/wiki/URL#Кодирование_URL
2. Сам способ нашел здесь, у няшного серфера и программера.
Html and Uri String Encoding without System.Web
Там еще есть и способ кодирования эскейп-последовательностей HTML.
Ну чтоб не потерять, еще и класс на PasteBin и Mega.NZ