![](https://habrastorage.org/files/e9d/352/227/e9d35222782f472aaf0748bf7ef8eeb4.jpg)
Эта статья — ремейк нескольких старых заметок о том, как, используя миранду, упростить регулярные задачи по саппорту пользователей. В статье вы не встретите 1001ый хау ту по установке Openfire на linux со сквозной аутентификацией, зато будет описано что делает:
?replace(?dbsetting(%subject%,?cinfo(%subject%,protocol),MirVer),Miranda NG Jabber 0.95.5.17337 x86 [,,],)
И как, используя эту фигню, получить удаленный доступ к пользовательскому рабочему столу, например, средствами того же VNC или radmin, просто кликнув по нужному значку прямо в окне беседы с пользователем.
Исходные данные: Debian 7, Openfire 4.1.3, Miranda NG 0.95.5.
Целью же в примере будет автоматический запуск удаленного помощника (msra) с подключением к нужному пользователю прямо из интерфейса миранды. Сразу оговорюсь, что все учетные данные для доступа при необходимости вы должны будете ввести дополнительно, т.е. на безопасность эти трюки никак не влияют.
Итак, Openfire на дебиане уже настроен, а Miranda NG из коробки с тычкой «доменный логин» и без твиков реестра цепляется к серверу без ввода учетных данных. Также указано использовать имя комьютера в качестве ресурса. От нас требуется взять стоковую миранду и допилить в ней некий «админский» функционал. Для упрощения я так и буду называть сборки: админская и юзерская. Обращаю внимание, что в качестве пользовательской подойдет любая другая. Главное, чтобы где-то в поле MirVer присутствовало поле «ресурс», а в качестве ресурса выступало имя компьютера, но об этом ниже. Удаленный помощник уже должен работать. Повторяю, миранда в нашем случае просто удобный интерфейс-надстройка.
Выглядит как-то так:![](https://habrastorage.org/r/w1560/files/ee3/d97/7c9/ee3d977c930d482d9a7ee278ac2be127.png)
![](https://habrastorage.org/files/ee3/d97/7c9/ee3d977c930d482d9a7ee278ac2be127.png)
Первым делом качаем текущий (на момент написания 0.95.5) стейбл Miranda NG, а также нужные плагины: Actman и Variables. Это минимально необходимые, но в свей сборке я покажу и несколько других, с которыми жить становится веселей. Складываем плагины в папку Plugins, перезапускаем миранду, а теперь по пунктам.
1) Основное окно для работы с кастомными действиями внутри миранды это — Настройки → Службы → Действия → Действия. Верхним зеленым плюсом создаем новый скрипт (F2 для переименования), а нижним добавим к нему Действие «Выполнить» (выбрать справа вверху).
Окно 'Действия'![](https://habrastorage.org/r/w1560/files/a77/e0e/cb1/a77e0ecb1f6a439cb71d1e9dc3c8d26c.png)
![](https://habrastorage.org/files/a77/e0e/cb1/a77e0ecb1f6a439cb71d1e9dc3c8d26c.png)
2) Для запуска удаленного помощника надо выполнить msra /offerra имя_компьютера. Дейстиве «Выполнить» содержит 2 поля — путь и аргументы. Первое — это стандартный путь.
%SystemRoot%\system32\msra.exe
а во втором требуется указать, что мы сразу хотим подключиться к указанной станции, передав в качестве последнего аргумента распарсенное имя кампа из поля MirVer конкретного юзера. В текущей Miranda NG «MirVer» принимает значение.
Miranda NG Jabber 0.95.5.17337 x86 [ресурс]
И мы договорились, что в роли ресурса выступает имя компьютера. Здесь и далее в роли примера ресурс будет WS01. Заметьте, что второе поле должно быть отмечено как скрипт (кнопка S, см. скрин выше), иначе магия переменных не сработает.
3) Добраться до хелпа «Помощь по переменным» можно либо из Настройки — Службы → Переменные → синяя кнопка V, либо тот же значок V по нажатию на кнопки S/T прямо из диалога «Действия».
В свойствах контакта значение MirVer выглядит как Miranda NG Jabber 0.95.5.17337 x86 [WS01]. Смысл в том, чтобы найти вхождения "Miranda NG Jabber 0.95.5.17337 x86 [" и "]", заменить их на пустую строку и на выходе получить только WS01. Код для параметра командной строки и поиска имени:
/offerra ?replace(?dbsetting(%subject%,?cinfo(%subject%,protocol),MirVer),Miranda NG Jabber 0.95.5.17337 x86 [,,],)
Учтите, что, нажав на кнопки S|T, вы попадете в «текстовый редактор», в котором допускаются переносы строк, а результат все равно будет записан в одну строку. Только не забывайте о пробелах там, где нужно и где не нужно.
Текстовый редактор![](https://habrastorage.org/r/w1560/files/734/db8/2e4/734db82e46134b619dde3b87f4a1ab38.png)
![](https://habrastorage.org/files/734/db8/2e4/734db82e46134b619dde3b87f4a1ab38.png)
?replace(x,y,z,...) — замена всех вхождений Y в X на Z, возможны множественные аргументы Y и Z.
Тут все понятно. Ищем в MirVer пару нужных указанных выше вхождений и меняем на «пусто». Но как получить MirVer нужного контакта? Нам поможет:
?dbsettings(x,y,z,w) — получить настройку Z плагина Y контакта X или возвратить W, если z не существует (w не обязательно).
Ага, уже лучше, но понятнее не стало. Тут на выручку приходит специальный контакт %subject%, описание которого вы найдете на второй вкладке окна «Помощь по переменным». Итак, выбирая какой-то контакт, маркер %subject% принимает значение этого контакта. Условно, общаемся с юзером, и в %subject% лежит информация об этом конкретном контакте. Откуда взять X для ?dbsettings() разобрались.
Теперь надо узнать значения плагина jabber для Y(ведь мы по джабберу и общаемся) у выбранного контакта:
?cinfo(x,y) — информационное свойство Y контакта X. Cнова берем %subject% и ищем у него свойство protocol, которое будет содержать информацию о текущем используемом протоколе, в значениях свойств которого можно найти необходимое поле MirVer. Получили Y.
Ну и значением Z указываем, что хотим увидеть как раз MirVer. W не нужен.
Всё, получили значение Miranda NG Jabber 0.95.5.17337 x86 [WS01], естественно имя кампа внутри квадратных скобок у каждого контакта будет своим.
А дальше у найденной стоки меняем ?replace`ом 'Miranda NG Jabber 0.95.5.17337 x86 [' на 'пусто' и '] меняем 'пусто' на, т.е. убираем лишнее. На выходе чистый WS01, который будет подставлен в msra /offerra WS01.
4) Предпоследним шагом идем в Настойки → Службы → Действия → Использование действий и отмечаем, где хотим видеть кнопку удаленного помощника. В моем случае это панель кнопок в окне сообщений при непосредственной переписке с юзером и по правой кнопке на контакте в ростере.
Использование действий![](https://habrastorage.org/r/w1560/files/8fa/2c3/bb6/8fa2c3bb64564826833fd014ff92723e.png)
![](https://habrastorage.org/files/8fa/2c3/bb6/8fa2c3bb64564826833fd014ff92723e.png)
5) Осталось прикрутить красивость, ведь в куче кастомных кнопок найти удаленный помощник будет проще, если у него будет свой привычный значок. Настойки → Значки → Действия → Зарегистрированные действия → Импорт значков. Указываете файл, содержащий искомый значок, и просто перетаскиваете его на нужное действие. И вправду удобно.
Свой значок для действия![](https://habrastorage.org/r/w1560/files/2b1/5e0/d5a/2b15e0d5ac154a4395a27bcb75d03a1d.png)
![](https://habrastorage.org/files/2b1/5e0/d5a/2b15e0d5ac154a4395a27bcb75d03a1d.png)
UPD от: MagicEx и Abyss777 Позволяет работать с любым MirVer, при условии, что ресурс в квадратных скобках
длинное от @MagicEx
strchr(!dbsetting(%subject%,?cinfo(%subject%,protocol),jid),@),1)) ?substr(!dbsetting(%subject%,?cinfo(%subject%,protocol),MirVer),?add(?strchr(!dbsetting(%subject%,?cinfo(%subject%,protocol),MirVer),[),1),?sub(?strchr(!dbsetting(%subject%,?cinfo(%subject%,protocol),MirVer),]),1))
короткое на регекспах от @Abyss777
?regexp_substr( \[(.*)\],!dbsetting(%subject%,!cinfo(%subject%,protocol),MirVer),1)
На этом с удаленным помощником всё, проверяйте, как работает. Можно потренироваться с парой других утилит:
Remote Desktop
%SystemRoot%\system32\mstsc.exe
/v:?replace(?dbsetting(%subject%,?cinfo(%subject%,protocol),MirVer),Miranda NG Jabber 0.95.5.17337 x86 [,,],)
Оснастка управление компьютером
mmc.exe
compmgmt.msc /computer=?replace(?dbsetting(%subject%,?cinfo(%subject%,protocol),MirVer),Miranda NG Jabber 0.95.5.17337 x86 [,,],)
UltraVNC
C:\Program Files (x86)\uvnc bvba\UltraVnc\vncviewer.exe
?replace(!dbsetting(%subject%,?cinfo(%subject%,protocol),MirVer),Miranda NG Jabber 0.95.5.17337 x86 [,,],)
Не забывайте, что сторонний софт вроде UltraVNC должен быть установлен в системе.
Вроде все классно. Но как быть, если клиент сидит в другой подсети, да и вообще имеет свой DNS-суффикс? Вопрос по доступу к нужной подсети оставим на откуп шлюза, а вот с суффиксом сложнее, ведь в имени ресурса ничего нет о DNS, и достучаться до юзера в другом городе по одному лишь имени уже не выйдет, нужен весь FQDN. К счастью, миранда с плагинами Actman и Variables настолько крута, что решение есть. Сейчас в двух словах расскажу как, а для удобства восприятия отформатировал код:
?puts(comp,?replace(?dbsetting(%subject%,?cinfo(%subject%,protocol),MirVer),Miranda NG Jabber 0.95.5.17337 x86 [,,],))
?if(?stricmp(?dbsetting(%subject%,CList,Group),Юпитер),
?puts(grp,.jup.com),
?if(?stricmp(?dbsetting(%subject%,CList,Group),Марс),
?puts(grp,.mars.com),
?if(?stricmp(?dbsetting(%subject%,CList,Group),Венера),
?puts(grp,.venus.com),
?puts(grp,.earth.com)
)
)
)
?insert(?get(comp),?get(grp),?len(?get(comp)))
Общий смысл тут в том, чтобы в зависимости от группы ростера, в которой находится пользователь, дописывать соответствующий DNS-суффикс. В примере используется три группы: Юпитер (.jup.com), Марс (.mars.com), Венера (.venus.com), а также Земля (.earth.com), если юзер не принадлежит ни к одной из указанных групп.
1) Первая строка служит для поиска имени компьютера, это мы проходили с одной лишь только разницей, что теперь с помощью ?puts() пишем имя компьютера в переменную comp
?puts(x,y)
?puts(x,y) — сохраняет Y как переменную с именем X
?puts(comp,?replace(?dbsetting(%subject%,?cinfo(%subject%,protocol),MirVer),Miranda NG Jabber 0.95.5.17337 x86 [,,],))
2) с помощью вложенных операторов ?if() ищем соответствие группам, вдруг юзер в одной из них
?if(x,y,z)
.?if(x,y,z) — показывает Y, если X ПРАВДА, иначе показывает Z
Через ?stricmp() проверяем, с Юпитера ли наш товарищ и, если да, с помощью знакомого ?puts() присваиваем переменной «grp» значение ".jup.com"
?stricmp(x,y)
?stricmp(x,y) — правда, если X = Y, без учета регистра
?stricmp(?dbsetting(%subject%,CList,Group),Юпитер),?puts(grp,.jup.com)
Если не с Юпитера, то выполняется следующий блок сравнения и по аналогии еще один. В итоге, если пользователь не найден на трех искомых планетах, то по умолчанию считаем, что он с Земли и присваиваем переменной grp значение .earth.com.
3) Финальный оператор ?insert() через ?get()`ы склеивает имя компьютера с именем домена, в итоге получаем искомый FQDN
?insert(x,y,z) ?get(x)
?insert(x,y,z) — вставляет строку Y в позицию Z в строке X
?get(x) — переменная, заданная put с именем X
?get(x) — переменная, заданная put с именем X
?insert(?get(comp),?get(grp),?len(?get(comp)))
?insert() — хак для вывода получившегося значения, так как никакого echo и прочих не предусмотрено.
Естественно, количество вложенных операторов может быть другим, в зависимости от вашей необходимости.
Как видите, с помощью Переменных и Действий в миранде можно делать всякие крутые штуки, и функционал отнюдь не ограничивается выполнением приложений с аргументами. Остальные фичи при желании вы рассмотрите самостоятельно. Искать нужные значения протоколов и прочего проще всего через плагин редактор базы DbEditorPP. Собственно через этот плагин я и отрыл нужное свойство для ?cinfo(x,y), да и вообще этот инструмент еще пригодится не раз.
Выкладываю готовую юзерскую сборку со своими настройками и дополнительными плагинами, с которыми работа в миранде становится удобнее. Обращаю внимание, что к стоковой Miranda NG добавлены только плагины, смайлики и еще пара мелочей, остальное подкручено через Настройки. Упор делал на минимальные изменения чистой миранды. Юзерская сборка закастомизирована сильнее, т.к. требуется включить или отключить кучу всего, что юзер потом сам не сделает, а компетентный сотрудник в админской сборке разберется сам.
UPD: Админская сборка по просьбе в комментариях. Отличия от юзерской:
1) Добавлено три плагина: ActMan, Variables, DbEditorPP
2) Добавлен удаленный помощник
3) Переименован каталог профиля и убран лаунчер
Сознательно не даю линк на админскую сборку, т.к. она у меня сильно изменена от оригинала и вычищать от всего будет муторно. Правильно будет добавить в юзерскую версию пару плагинов и скопипастить пару строк из примеров. Но если надо, скажите, выложу.
Под конец обещанная пара фичей
У миранды, ввиду особенности архитектуры, есть сложности с обновлением при использовании в корпоративной среде. Обновлением занимается PluginUpdater, у которого просто не хватит прав, чтобы записать что-то в ProgramFiles, где установлена миранда. Вариант, когда у юзера есть права на запись в каталог установки, не рассматривается. В итоге, имеем схему, по которой сама Miranda NG разворачивается в %ProgramFiles%, а профиль пользователя лежит в православно верном %ApplicationData%. Как уже говорил, особенностью является то, что настройки хоть и лежат в профиле пользователя, но сильно завязаны на версии ядра и плагинов, в итоге если просто поверх накатить новый билд, то есть неиллюзорный шанс, что всё сломается. Варианта два: не обновлять вообще ничего или обновлять, но пересоздавать юзеру профиль миранды. Оба варианта плохие. В одном случае страдает безопасность, во втором юзер теряет историю, что тоже фейл. И если с первым всё понятно, то над обновлением остановлюсь подробно.
Я отказался от штатного установщика миранды, который представляет собой Inno Setup, в пользу кастомного скрипта копирования собственной сборки. Объясню почему. Весь обязательный софт разворачивается средствами WSUS через LUP (WPP), но в случае с мирандой иногда, особенно на этапе тестирования, требуется часто обновлять тестовой группе пользователей сборку, а профиль с настройками в любом случае останется старый, т.е. нужно допиливать еще и его. Короче, решил поступить проще. Скрипт развертывания смотрит версию миранды на сервере, и если она больше чем установленная в системе, то тупо грохает её и записывает новую. Ini-файл с версией лежит тут MirandaNGCorpMod\Profiles\jabber\profile_settings.ini. Далее, кастомный лаунчер, с помощью которого запускается миранда, смотрит в каталог установки и, если версия новее, чем в профиле юзера, то грохает профиль и запускает миранду. Миранда уже сама с помощью setting-cln.ini при отсутствующем профиле создает новый с нужными настройками. Вообще, все настройки, отличающиеся от дефолта, вынесены settings.ini, а в Mirandaboot.ini об этом сказано. Далее лаунчер ждет еще пару секунд и записывает новую версию в каталог профиля (на всякий случай плюсом делается 12 попыток с шагом 5 секунд).
Скрипт развертывания должен лежать рядом с каталогом миранды, лаунчер — в каталоге рядом с miranda32.exe
Скрипт копирования юзерской сборки на AutoIT:
NoTrayIcon
;read current miranda version in ProgramFiles. If error - 0000
$MirCurVer = IniRead(@ProgramFilesDir & '\MirandaNGCorpMod\Profiles\jabber\profile_settings.ini','MirandaNGCorpMod','version','0000')
;read new miranda version in ScriptDir. If error - 0001
$MirNewVer = IniRead(@ScriptDir & '\MirandaNGCorpMod\Profiles\jabber\profile_settings.ini','MirandaNGCorpMod','version','0001')
If $MirNewVer > $MirCurVer Then
DirRemove(@ProgramFilesDir & '\MirandaNGCorpMod',1)
Sleep(300)
DirCopy(@ScriptDir & '\MirandaNGCorpMod',@ProgramFilesDir & '\MirandaNGCorpMod')
FileCreateShortcut(@ProgramFilesDir & '\MirandaNGCorpMod\miranda_launch.exe',@DesktopCommonDir & '\MirandaNGCorpMod.lnk')
FileCreateShortcut(@ProgramFilesDir & '\MirandaNGCorpMod\miranda_launch.exe',@StartupCommonDir & '\MirandaNGCorpMod.lnk')
EndIf
Код лаунчера:
#NoTrayIcon
$sMirandaOptions = ''
;check for command line options for Miranda32.exe
If $cmdline[0] > 0 Then
For $i = 1 To $cmdline[0] Step 1
$sMirandaOptions = $sMirandaOptions & ' ' & $cmdline[$i]
Next
EndIf
;read current miranda version. If error - 0000
$MirCurVer = IniRead(@AppDataDir & '\MirandaNGCorpMod\jabber\profile_settings.ini','MirandaNGCorpMod','version','0000')
;read new miranda version. If error - 0001
$MirNewVer = IniRead(@ProgramFilesDir & '\MirandaNGCorpMod\Profiles\jabber\profile_settings.ini','MirandaNGCorpMod','version','0001')
;if exists version in AppData less than ProgramFiles version, remove MirandaNG profile
If $MirNewVer > $MirCurVer Then
DirRemove(@AppDataDir & '\MirandaNGCorpMod',1)
Sleep(300)
EndIf
;run miranda with command line parameters
Run(@ScriptDir & '\miranda32.exe ' & $sMirandaOptions)
Sleep(2000)
;whaiting for miranda creates default profile "jabber.dat". 12 retries, 5 seconds per step
For $i = 1 To 12 Step 1
If FileExists(@AppDataDir & '\MirandaNGCorpMod\jabber\jabber.dat') Then
;copy current "profile_settings.ini" to new profile
FileCopy(@ProgramFilesDir & '\MirandaNGCorpMod\Profiles\jabber\profile_settings.ini',@AppDataDir & '\MirandaNGCorpMod\jabber\profile_settings.ini')
Exit
EndIf
Sleep(5000)
Next
Если будут нужны собранные версии, скажите, выложу.
В сборках требуется задействовать автоподключение при старте Настройки → Статус → Начальный статус → Профили статусов → в окошке Статус указать «В сети» и поменять параметр LoginServer на свой сервер джаббера. Это можно сделать через настройки миранды или редактированием файла setting-cln.ini. Ну и до кучи можете поменять или убрать вообще заставку на старте.
На этом по миранде вроде бы и всё, но не могу удержаться и не включить подсказку, как прикрутить фото пользователей из ActiveDitectoty:
все совпадения случайны![](https://habrastorage.org/r/w1560/files/a9c/8a7/14c/a9c8a714c4554741b7648cbc8d4fd3a8.png)
![](https://habrastorage.org/files/a9c/8a7/14c/a9c8a714c4554741b7648cbc8d4fd3a8.png)
Оговорюсь, версия схемы не ниже Win2008R2.
1)Включить реплику в GC для аттрибута thumbnailPhoto (не обязательно, но стоит)
windowsitpro.com/active-directory/q-how-can-i-add-pictures-my-users-active-directory-ad
Можно по этой же ссылке добавлять через PS, но неудобно, забейте на PS, едем дальше:
2) Скачать и поставить софтину для заливки фоточек в AD www.codetwo.com/freeware/active-directory-photos Бесплатная, ставить можно куда угодно, но запускать с правами админа домена.
3) В консоли OpenFire покрутить параметры:
ldap.override.avatar true
и отредактировать параметр в vCard чтобы было так:
<PHOTO>
<TYPE>image/jpeg</TYPE>
<BINVAL>{thumbnailPhoto}</BINVAL>
</PHOTO>
4) Перезапуск OpenFire и MirandaNG видит аватары из коробки, но юзер хоть раз должен подключиться к джабберу.
Ну теперь точно всё. надеюсь, статья окажется полезной, и добро пожаловать в комментарии.