вторник, 16 апреля 2019 г.

Доступ к IP KVM Avocent DSR 1021

Вводная: Имеется IP KVM Avocent DSR 1021. С настроенным IP-адресом и модулями. Необходимо зайти на него со свежо установленной Windows 10

Решение:
1. Скачиваем последнюю версию JRE https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html и устанавливаем 

2. В браузере прописываем, что открывать в режиме совместимости. 

3. Редактируем файл java.security по адресу C:\Program Files\Java\jre1.8.****\lib\security\ 

4. Убираем MD5 в строке 
jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024 

5. Убираем DH keySize < 768 
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768 

6. Открываем "Панель управления"-"Программы"-"Java" 
Security tab -> Edit Site List -> Добавляем IP адрес KVM "http://X.X.X.X" (+https)

7. Пробуем подключиться

вторник, 5 марта 2019 г.

Про перевод имен переменных

Вот есть разное программирование. И везде надо переменные называть. И правилом хорошего тона называть их на английском (нуу за несколькими исключениями, к примеру в виде 1С).

И вот тут можно использовать небольшой финт ушами.

Для примера возьмём слово "склад" и предположим, что мы не знаем как его нам забить. Казалось бы не проблема - идём в Google.Translate и переводим

И тут нас поджидает засада - ни одно из предложенных нам гуглом слов не будет верным. А вот для того, чтобы узнать верное слово, мы ищем наш "Склад" на википедии. После чего переключаемся на английскую страницу кнопкой English. И узнаём, что правильно наш склад называть Warehouse

понедельник, 4 марта 2019 г.

Перехват пароля к FTP серверу с помощью роутера Mikrotik

Вводная: Есть программа с "захардкорженным" в коде паролем с доступом к FTP. Необходимо узнать пароль.

Решение: Так как в качестве роутера у нас Mikrotik RB951Ui-2HnD, то будем использовать его. Заходим в winbox. В меню выбираем Tools - Packet Sniffer. Если стоит галочка "Only Headers" снимаем её.

На вкладке Filter выставляем Port - 21.


Далее нажимаем "Start". Пробуем получить обновления через программу. Если пакеты пошли хорошо, есть нет, то вариант чуть сложнее - убираем порт и смотрим все пакеты от данного компьютера - вероятно (если мы уверены, что используется FTP) используется не стандартный порт.
Узнать порт также можно простым запросом у техподдержки вашей программы - объяснив, что "системный администратор не открывает доступ по всем портам, а только по списку".
Далее нажимаем "Packets" и смотрим все пакеты подряд (Нас интересует вкладка "Packet") - в каком-нибудь из них, будет строка "PASS" и далее пароль который нам нужен.


Как вариант можем сделать сохранение в файл - на вкладке General. И сделать поиск по подстроке "PASS"



среда, 27 февраля 2019 г.

Строки в компоненте DataGrid разного размера (Compact Framework)

Вводная: Есть проект для ТСД Windows Mobile 6.5 на .Net Compact Framework 3. И в нём есть DataGrid с некоторыми данным. Но проблема в том, что в данной версии фреймворка нельзя задать высоту для конкретной строки или авторасширение по контенту.

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



Решение: Напрямую мы не можем обращаться к высоте каждой строки. Но такой параметр ЕСТЬ, правда он с приватным модификатором доступа, поэтому придётся немного схитрить

Добавим после заполнения данными (dataGrid1.DataSource = dataTable;) 
такой код
//Здесь получаем все строки 
var allRows = (ArrayList)dataGrid1
   .GetType()
                        .GetField("m_rlrow", BindingFlags.NonPublic
                                           | BindingFlags.Static
                                           | BindingFlags.Instance)
                        .GetValue(dataGrid1);
 
//Здесь формируем массив строк для обработки с их индексами
foreach (var pair in dataTable.Rows.Cast<DataRow>()
                                   .Select((r, i) => new {Row = r, Index = i})
                                   //Указываем параметр по которому увеличиваем размер строки
                                   .Where(x => x.Row["Type"].ToString().Contains("\n")))
{
 int index = pair.Index;
        //Эдесь мы можем получить доступ к строке если надо
        //DataRow row = pair.Row;
        SetGridRowHeight(allRows[index], 60);
 
}

Далее сама функция изменения размера
public static void SetGridRowHeight(object row, int height)
{
    row.GetType().GetField("m_cy", BindingFlags.NonPublic
                                 | BindingFlags.Static
                                 | BindingFlags.Instance)
                 .SetValue(row, height);
}
 

И результат:




вторник, 19 февраля 2019 г.

Сброс настроек и пароля в IP камере Dahua 1220SP

Вводная: Дана камера Dahua IPC-HFW1220SP. В веб-интерфейс не входит, telnet-ssh не доступны. IP по DHCP не получает (порт при этом поднимается, линк загорается). ИК-подсветка реагирует на смену света.

Решение: Решили для начала сбросить настройки, но вот тут то и ждала засада - официальная документация https://dahuawiki.com/images/1/1e/ResetIPCamera.pdf про эту модель молчит. Продавец говорит - отправляйте нам на замену. Но это долго.

Начали смотреть, в отличии от младшей модели 1020SP, на этой нет кнопки Reset (да, на младшей всё просто - нажали на кнопочку при включении - выждали 10 секунд и сбросилось).

Не буду вас утомлять - для сброса данной карты нужно снять крышку, снять ИК подсветку (но не отключать провод! Это важно). И замкнуть чем-нибудь тонким две площадки указанные на фото, на выключенной камере - затем подать питание, выждать 15 секунд и убрать замыкание. По сути это кнопка сброса, но не распаянная.


После сброса всё заработало штатно.

Ключевые слова:  Dahua, HFW1220SP, factory settings, reset, default 

PS: Эксперимент делался на свой страх и риск - было бы очень весело если бы это было питание для чего-либо :) И замкнули + и -. Так что будьте осторожнее делая это на других ревизиях или моделях - проверьте вначале мультиметром, что там не будет ничего.

среда, 5 сентября 2018 г.

Доступ в интернет с эмулятора Windows Mobile 6 на Windows 10

Вводная: Есть ТСД, штука дорогая, защищённая, с мощными батареями и главное в наличии. "Покупать другие не предлагать". Разработка для них знакома и не представляет сложности. Все поставилось, но софт требует доступа к интернет-серверу (REST-api, все дела). А его нет! Проблема в том, что доступ к сети реализован через VirtualPC 2007, которая в Windows 10 не работают от слова вообще.

Но выход есть:
1. Ставим локальный прокси. Я рекомендую Fiddler https://www.telerik.com/fiddler

2. Запускать от админа, потом в меню Tools -> Options -> Connections 

3. Обязательно указываем "Allow remote computers to connect"


4. Запускаем Microsoft Device Emulator Manager 9 (входит в состав Microsoft Device Emulator 3.0 https://www.microsoft.com/ru-ru/download/details.aspx?id=5352 )

5. Выбираем наш эмулятор и в контекстном меню выбираем Cradle

6. Должен открыться "Центр устройств Windows Mobile" https://www.microsoft.com/ru-ru/download/details.aspx?id=3182

7. В нём выбираем "Подключение без настройки устройства"


8. На эмуляторе Settings -> Connections -> Connections -> Edit my proxy server

9. Указываем Ip адрес компьютера на котором запущен Fiddler и дважды нажимаем OK



10. Пробуем выходить в интернет

PS: Минус у этого решения есть и достаточно серъёзный - это всё надо делать каждый раз после перезапуска компьютера. Но автоматизируется легко. AutoIt или на том-же C#.

PS2: Кстати при наличии лицензионного ключа на 2008 Professional пришлось ставить пиратскую. Мой серийник, честно купленный в 2010 году, все найденные дистрибутивы просто отказались принимать :(

пятница, 3 августа 2018 г.

Битрикс - добавление в почтовый шаблон номера телефона

Вводная: Необходимо добавить номер телефона и адрес клиента в письмо от интернет-магазина битрикса (о новом заказе).

Решение:
1) Добавляем в /bitrix/php_interface/init.php код

<?
 AddEventHandler("sale", "OnOrderNewSendEmail", "ModifySaleMails");
 
 function ModifySaleMails($orderID, &$eventName, &$arFields)
 {
    $arOrder = CSaleOrder::GetByID($orderID);  
 
    $order_props = CSaleOrderPropsValue::GetOrderProps($orderID);  
 
    $phone = ""; 
    $address = "";
 
    while ($arProps = $order_props->Fetch()){    
      if ($arProps["CODE"] == "PHONE"){
          $phone = htmlspecialchars($arProps["VALUE"]);}
 
      if ($arProps["CODE"] == "ADDRESS"){
         $address = htmlspecialchars($arProps["VALUE"]);}
    }
 
  if (!empty($arOrder["USER_DESCRIPTION"])){
      $arFields["DESCRIPTION"] = $arOrder["USER_DESCRIPTION"];}
 
    //-- добавляем новые поля в массив результатов
    $arFields["PHONE"] =  $phone;
    $arFields["ADDRESS"] = $address;
 }
?>

2) Добавляем в почтовый шаблон ИМЯСАЙТА/bitrix/admin/message_admin.php
(я добавлял в шаблон "[SALE_NEW_ORDER] Новый заказ")

Доставка по адресу: #ADDRESS#<br />
Ваш контактный телефон: #PHONE#<br />

Должно получится как-то так



3) Результат

воскресенье, 10 июня 2018 г.

Разбиение файла импорта 1С на сайт на части

Вводная: Есть хостинг, есть сайт у сайта есть импорт товаров из 1С. Из 1С УТ файлы выгружаются, через стандартный механизм обмена с web-сайтом.
Но скрипту импорта периодически не хватает памяти, чтобы загрузить всё. И падает с ошибкой. Было решено "разбивать" файлы на части по 1000 товаров. И загружать последовательно.

Решение:
            Directory.EnumerateFiles(Environment.CurrentDirectory)
                     .Where(file => Path.GetFileName(file).StartsWith("output")).ToList()
                     .ForEach(File.Delete);
            
            XDocument source = XDocument.Load("import.xml");

            int iteration = 0;

            while (iteration * 1000 < source.Descendants("Товар").Count())
            {
                XDocument xdoc = new XDocument(source);

                var allElements = xdoc.Descendants("Товар").OrderBy(a => a.Element("Ид")?.Value);

                var whatToLeave = xdoc
                                    .Descendants("Товар")
                                    .OrderBy(w => w.Element("Ид")?.Value)
                                    .Skip(1000 * iteration).Take(1000);

                allElements.Except(whatToLeave).ToList().ForEach(e => e.Remove());

                iteration++;
                xdoc.Save($"output{iteration}.xml");
            }

среда, 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 через шедулер.