среда, 17 января 2018 г.

Принтер HP P1102W не печатает через RDP

Вводная: Есть терминальный сервер - Windows 2008 R2 64 bit, стандартная редакция. И клиент - Windows 7 Pro, 32 бита. На клиенте установлен принтер HP P1102W. При подключении через RDP, принтер отказывается работать. Пробрасывается, но не печатает. На самом клиенте проблем с печатью нет.

Решение:

  1. Закрыть сеанс (именно выход из системы) и открыть заново - не помогло
  2. Перезагрузить клиент и сервер - не помогло
  3. Проверил корректность драйверов и ОДИНАКОВОСТЬ версии на клиенте и на сервере. Самое простое - и там, и там удаляем и ставим заново. Для сервера ставим и 32 битную версию, и 64 - не помогло
  4. Устанавливаем политику - запускаем gpedit.msc и по пути Computer Configuration -> Administrative templates -Windows Components -> Remote Desktop Services > Remote Desktop Session Host -> Printer Redirection отключаем опцию "Use Terminal Services Easy Print Driver First" - не помогло (но было странно, ОПЦИЯ НЕ ДЕЙСТВОВАЛА - в свойствах принтера всё равно оставался Easy Print Driver)
  5. Добавил ключ реестра UseUniversalPrinterDriverFirst по пути HKLM\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services тип REG_DWORD, создал его и установил в значение "4" ("3" - включен) - помогло и всё заработало.


PS: Ещё в интернетах встречал совет поменять драйвера на XPS, но на них очень сильно начинала тормозить клиентская 1С в RDP сеансе. Но вам может быть поможет.

PS2: После каждого шага перезагружался.

вторник, 16 января 2018 г.

Ежедневная смена пароля на роутере Mikrotik на пароль построенный по дате

Вводная: "Иван, у меня есть тривиальная задача для микротик. Мне нужно ежедневно в 12 часов ночи менять пароль на вай-фае на текущую дату без точек (16012017 например вот так). Я так думаю, что можно решить скриптом, но не знаю, честно говоря, с какой стороны к этой проблеме подойти"

Решение: Идею взял на http://kvas.livejournal.com/679174.html

:local wifiProfile wifiMyProfile

:local dateNow [/system clock get date];
:local dateNowDay [:pick $dateNow 4 6]
:local dateNowMonth [:pick $dateNow 0 3]
:local dateNowYear [:pick $dateNow 7 11]

:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");
:set dateNowMonth ([:find $months $dateNowMonth -1 ] + 1)

:if ( $dateNowMonth < 10 ) do={
:set $dateNowMonth ("0"."$dateNowMonth");
};

:log info message="==== NOW DATE: day: $dateNowDay month: $dateNowMonth year: $dateNowYear"

:local newPassword ("$dateNowDay" . "$dateNowMonth" . "$dateNowYear");
:log info message="==== NEW PASSWORD: $newPassword"

/interface wireless security-profiles set [find name=$wifiProfile] wpa2-pre-shared-key=$newPassword


Всё это добавляется в System-Script и вызывается в 0:05 через шедулер.

понедельник, 15 января 2018 г.

Удаление папок по времени

Вводная: Делаю для себя небольшую систему резервного копирования. Задача - удалять старые папки-даты при добавлении новых. По алгоритму - оставляем только 15 последних папок, остальные удаляем.

Решение: На вход подаётся List класса BackupDirectoryInfo. Просто DirectoryInfo не используется, так как в качестве хранилища бэкапа используются и файловые ресурсы, и облачные хранилища. Если требуется использовать только папки на физическом диске, то можно обойтись одним DirectoryInfo.

public abstract class BackupDirectoryInfo
{
     public string Name;
     public string Path;
     public DateTime CreatedTime;

     public abstract void Delete();
}
private void DeleteOldFolder(List<BackupDirectoryInfo> dirs )
{
    var orderedList = dirs.OrderByDescending(x => x.CreatedTime)
                      .Take(15);

    var dirToDelete = dirs.Except(orderedList).ToList();
            
    dirToDelete.ForEach(x => x.Delete() );
}

суббота, 30 декабря 2017 г.

Заполнить базу в MS SQL тестовыми данными

Вводная: сабж.

Решение:
USE [testBackup]
GO

DECLARE @count INT 
SET @count = 1

WHILE @count <= 100000
BEGIN
INSERT INTO [dbo].[Table_1]
    SELECT 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + 
            CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) + CHAR((ABS(CHECKSUM(NEWID())) % 26) + 97) [Test]
    SET @count += 1
END
GO

Ну и удаление
USE [testBackup];
GO
DELETE FROM [dbo].[Table_1];
GO

вторник, 19 декабря 2017 г.

C# - отправить монитор в сон

Вводная: Есть телевизор, он используется исключительно как монитор и подключен к компьютеру. Настроено автовыключение при пропадании сигнала и соответственно включение при его появлении. Но есть несколько моментов:
1) Если выключаешь не с пульта, а с кнопки на телевизоре, то при появлении сигнала сам не включается - надо обязательно опять её нажать вручную.
2) На компьютере настроен таймаут 15 минут - его менять не хотелось. А иногда ждать эти пятнадцать минут не хочется. А вставать за пультом, также не хочется. (к примеру когда вечером ложимся спать) - ну и пульт получается только для включения-выключения.
3) Компьютер не выключается никогда.

Решение: Была написана небольшая программа на C#, которая при запуске просто отправляет монитор в сон. Код -

    class Program
    {
        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, 
                                         int msg, 
                                         IntPtr wParam, 
                                         IntPtr lParam);
 
        static void Main()
        {
            var hwndBroadcast  = (IntPtr)0xFFFF;
            var scMonitorpower = (IntPtr)0xF170;
            var wmSyscommand   = 0x0112;
 
            SendMessage(hwndBroadcast, wmSyscommand, scMonitorpower, (IntPtr)2);
        }
    }

Несколько примечаний -
1) Проект консольный, но "Output type" windows application - по этому никаких окон не появляется при запуске
2) Админских прав не требует
3) Никаких дополнительных библиотек не требует

понедельник, 19 июня 2017 г.

Настройки IPTV для роутеров Mikrotik в сети TTK

Как настроить IPTV в ТТК.

1. ОЧЕНЬ рекомендую в случае использования IPTV подключать его проводом. Иначе эфир у вас будет мягко говоря засран. Далее рассматривается схема с двумя бриджами - bridgeEthernet и bridgeWifi (конечно можно и не создавать бриджи, а оперировать сразу интерфейсами, к примеру ether2 (остальные будует подключены по master-slave) и просто wlan1), но лучше рассматривать бридж, так как есть и 2011, и мультидиапозонные роутеры (где WiFi 2.4+5). У нас будет bridgeEthernet, так как телевизор подключен проводом.

2. Устанавливаем пакет multicast.

3.
/routing igmp-proxy interface
add interface=bridgeEthernet
add alternative-subnets=0.0.0.0/0 interface=ether1 upstream=yes

В качестве апстрима выбираем физический интерфес в который у нас приходит провод от провайдера -
есть два важных момента -
а) НИ В КОЕМ СЛУЧАЕ НЕ ПППОЕ! 
б) ДОЛЖЕН БЫТЬ ОБЯЗАТЕЛЬНО НАЗНАЧЕН ЛЮБОЙ СТАТИЧЕСКИЙ АЙПИШНИК!!!

В качестве локального интерфейса выбираем нужный нам интерфейс в локальной сети. Здесь также есть нюанс - ОБЯЗАТЕЛЬНО НА ЭТОМ ИНТЕРФЕЙСЕ ДОЛЖЕН БЫТЬ НАЗНАЧЕН АЙПИШНИК!!!

То есть на обоих интерфейсах должны быть айпишники из домашних диапазонов (Из разных).
/ip address
add address=192.168.123.1/24 interface=bridgeEthernet network=192.168.123.0
add address=192.168.10.10/24 interface=ether1 network=192.168.10.0

Если IPTV нужен через WiFi - ОБЯЗАТЕЛЬНО включите MulticastHelper. Но старайтесь чтобы не потребовалось.

Также надо настроить параметры IGMP Proxy

/routing igmp-proxy
set query-interval=1m5s query-response-interval=5s quick-leave=yes

Всё. Можете проверять работу IPTV.

суббота, 14 января 2017 г.

"Колхозное" крепление Mikrotik SXT

Иногда нужно срочно устанавливать точку доступа Mikrotik SXT, причём не на мачту, а на стену. Но нормального крепления ( https://routerboard.com/QM ) нет. Да и вообще никаких креплений, кроме стандартного, нет. А магазины где можно купить что-либо для микротика далеко.

В таком случае может помочь использование такой штуки как "ответная часть петли". Стоит рублей 50. Отверстия для крепления есть. Нагрузку в виде антенны точно выдержит :) Продаётся в разных хозяйственных и строительных магазинах.


четверг, 1 декабря 2016 г.

Тестовая задача C# - создание самораспаковывающегося архива

Реализовать программу, которая создаёт самораспаковывающийся архив.

  1. Тип результирующего файла - exe.
  2. Одного файла должно быть достаточно, чтобы передать его для извлечения в другом месте.
  3. При старте спрашивает папку в которую распаковать.
  4. Сжатие любое, но должно присутствовать.
  5. Программа должна уметь создавать архив из произвольного количества папок и файлов, произвольного типа.

Сторонние библиотеки использовать нелья, только Net.Framework (любая версия на ваш выбор).


пятница, 28 октября 2016 г.

Функционал tool snmp-[get|walk] в новых версиях Mikrotik

В последнем релиз кандидате 6.38rc19 появилась интересная функция -
snmp - added basic get and walk functionality "/tool snmp-[get|walk]";

Теперь можно получить информацию о другом устройстве через snmp. Что открывает некоторые интересные возможности (можно сделать небольшой мониторинг на основе микротика).

Для примера узнать занятую память на другом микротике (с адресом 192.168.0.1 и включенным SNMP без авторизации), можно простым запросом -
tool snmp-get address=192.168.0.1 oid=.1.3.6.1.2.1.25.2.3.1.6.65536

С помощью запроса
tool snmp-walk 192.168.0.1
Мы можем получить все значения всех OID которые есть в устройстве (лучше так не делать, а выводить только нужные ИМХО)

Какие плюсы -

  • мы не ограничены ПРОИЗВОДИТЕЛЕМ, можем получать информацию и от систем Windows, Linux, Cisco и всех прочих гд реализовано SNMP.


Какие минусы -

  • я пока не понял, как положить значение в какую-нибудь переменную. Операторы put, get, set, find и прочие не работают (или я не понял как из завести, если кто знает поправьте - добавлю в описание). Как костыль записывать вывод в файл и его парсить
  • Нет реализации snmp-set, как я надеюсь пока. Потому что лично у меня есть оборудование которое его использует. 

четверг, 6 октября 2016 г.

Mikrotik: как посмотреть кто из пользователей забивает канал и как ограничить ему скорость?

Увидел вопрос-ответ на http://spw.ru/support/voprosotvet/podklyuchenie/vopros5/
"Mikrotik 1100AH как посмотреть кто из пользователей забивает канал и как ограничить ему скорость?" и решил поделится немного другим способом.

На мой взгляд, приведённый в ответе способ через Tools-Torch не очень наглядно показывает скорость, так как там идёт разбивка по IP адресам.


Так что иногда может помочь определение "качальщика" через Simple Queue.
Создаём для пользователей нашей сети следующие правила -
/queue simple
add max-limit=1G/1G name=X220 target=192.168.0.100/32
add max-limit=1G/1G name=MainComp target=192.168.0.200/32

Далее создаём правило ограничивающее скорость для всех кто не указан в перечислении выше:
/queue simple
add max-limit=2M/2M name="All Other" target=192.168.0.0/24

Теперь чтобы увидеть кто и с какой скоростью качает можно просто смотреть в окно Queue. Причём в достаточно человекопонятном виде.


Также из плюсов можно отметить, что можно смотреть (и ограничивать) скорость не только по IP адресам, но и по подсетям (а там можно разбить к примеру по кабинетам, подразделениям или как вам удобно).

И можно сразу же, ограничить пользователя который увлёкся :)

PS: Не забывайте, что Queue даёт нагрузку на процессор. Так что проверяйте можно или нет это использовать в вашем случае.