Отключение запроса 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 Копия

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 так сразу не нашлось, но оказалось, что все-таки решение есть.

Декодирование URL

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);

Кодирование URL

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

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

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

C#, проверка попадания IP-адреса в зарезервированные диапазоны.

Про зарезервированные диапазоны и то, как проверить, попадает ли в них адрес IPv4, я уже писал и приводил решение данной задачи на PHP. Теперь вариант на C#.

Понадобится функция IPConverter.IPToInt32(IP), которую я описывал в прошлой заметке, аналог функции ip2long() PHP

В остальном все делается также, как и в PHP-примере.

1. Заводим двумерный массив, содержащий IP начала диапазона, конечный IP и описание диапазона:

string[,] SpecList = new string[,]  {
   {"0.0.0.0","0.255.255.255", "Current network"},
   {"255.255.255.255","255.255.255.255", "Broadcast"},
   {"255.0.0.0","255.255.255.255", "Reserved by the IETF, broadcast"},
   {"10.0.0.0","10.255.255.255", "Private network"},
   {"100.64.0.0","100.127.255.255", "Shared Address Space"},
   {"127.0.0.0","127.255.255.255", "Loopback"},
   {"169.254.0.0","169.254.255.255", "Link-local"},
   {"172.16.0.0","172.31.255.255", "Private network"},
   {"192.0.0.0","192.0.0.7", "DS-Lite"},
   {"192.0.0.170","192.0.0.170", "NAT64"},
   {"192.0.0.171","192.0.0.171", "DNS64"},
   {"192.0.2.0","192.0.2.255", "Documentation example"},
   {"192.0.0.0","192.0.0.255", "Reserved by the IETF"},
   {"192.88.99.1","192.88.99.1", "IPv6 to IPv4 Incapsulation"},
   {"192.88.99.0","192.88.99.255", "Anycast"},
   {"192.168.0.0","192.168.255.255", "Private network"},
   {"198.51.100.0","198.51.100.255", "Documentation example"},
   {"198.18.0.0","198.19.255.255", "Test IP"},
   {"203.0.113.0","203.0.113.255", "Documentation example"},
   {"224.0.0.0","224.255.255.255", "Multicast"},
   {"240.0.0.0","240.255.255.255", "Future reserved"}
};

2. Пишем функцию, которая перебирает массив, и проверяет, попал ли указанный IP в один из диапазонов. Если попал — возвращает описание диапазона, если нет — пустую строку. IP-адреса конвертируются функцией IPConverter.IPToInt32(IP) в целые числа и сравниваются:

string CheckSpecDiaps(string IP)
{
    int uip = IPConverter.IPToInt32(IP);

    for (int i = 0; i < SpecList.GetLength(0); i++)
    {
        int start = IPConverter.IPToInt32(SpecList[i, 0]);
        int end = IPConverter.IPToInt32(SpecList[i, 1]);
        string desr = SpecList[i, 2];

        if (uip >= start && uip <= end)
        {
            return desr;
        }
    }

    return string.Empty;
}

Пример на GitHub

C#, проверка корректности и преобразования IP-адреса, класс IPAddress

Для работы с IP-адресами в .NET Framework есть класс IPAddress из пространства имен System.Net

Проверка корректности IP-адреса

bool IsIP(string IP)
{
    try
    {
        IPAddress addr = IPAddress.Parse(IP);
    }
    catch
    {
        return false;
    }
    return true;
}

Преобразование IP-адреса в полную форму записи.

Класс IPAddress и его функция Parse распознает сокращенную форму записи IP-адреса, например, адрес 4.0.0.1 можно записать как 4.1, и он будет таки корректным. Функция ToString() класса IPAddress всегда возвращает строку IP-адреса в полном виде, т.е. n.n.n.n, это можно использовать для преобразования адреса в полную форму записи:

string ToStandForm(string IP)
{
    if (!IsIP(IP))
    {
        return string.Empty;
    }
    IPAddress addr = IPAddress.Parse(IP);
    return addr.ToString();
}

Получение IP-адреса в виде массива байт

byte[] GetBytesBE(string IP)
{
    IPAddress addr = IPAddress.Parse(IP);
    return addr.GetAddressBytes();
}

Примечание: GetAddressBytes() выдает байты IP-адреса всегда в сетевом порядке, т.е. big-endian, в таком же, в котором байты идут при обычной записи IP. Если вдруг понадобится little-endian порядок, например, для того, чтобы преобразовать IP-адрес в целое число на little-endian системе, то массив надо перевернуть.

byte[] GetBytesLE(string IP)
{
    IPAddress addr = IPAddress.Parse(IP);
    byte[] addrbytes = addr.GetAddressBytes();
    Array.Reverse(addrbytes);
    return addrbytes;
}

Преобразование IP-адреса в знаковое 32-битное целое

Аналог PHP-функции ip2long() или сишной inet_addr()

int IPToInt32(string IP)
{
    IPAddress addr = IPAddress.Parse(IP);
    //получаем байты адреса, они всегда в big-endian
    byte[] addrbytes = addr.GetAddressBytes();
    //IP в виде Int32 big-endian
    int n = BitConverter.ToInt32(addrbytes,0);
    //если в системе little-endian порядок
    if (BitConverter.IsLittleEndian)
    {
        n = IPAddress.NetworkToHostOrder(n); //надо перевернуть
    }
    return n;
}

Изменить порядок байт можно и без использования Array.Reverse(), если число типа short или int. Для этого в классе IPAddress присутствуют функции NetworkToHostOrder(), которая меняет порядок байт в переменной с сетевого (big-endian) на используемый на локальной машине, и функция HostToNetworkOrder(), которая делает обратную операцию.

Преобразование IP-адреса в беззнаковое 32-битное целое

Скорее, чтоб два раза не вставать, делается точно так же, как и преобразование в знаковый int, но функции NetworkToHostOrder() и HostToNetworkOrder() тут уже не помогут, так что придется переворачивать массив байт адреса с помощью Array.Reverse():

public static uint IPToUInt32(string IP)
{
    IPAddress addr = IPAddress.Parse(IP);
    byte[] addrbytes = addr.GetAddressBytes();
    if (BitConverter.IsLittleEndian)
    {
        Array.Reverse(addrbytes);
    }
    return BitConverter.ToUInt32(addrbytes, 0);
}

Навеяно вопросом на stackowerflow
Объединил все вышеуказанные функции в отдельный класс.

Исходник на GitHub