Запуск SAP GUI із браузера

Цю статтю я спочатку написав до своєї блогщоб потім знову не шукати і не згадувати, але оскільки блог ніхто не читає, то цією інформацією захотілося поділитися з усіма, раптом комусь у пригоді.

Під час роботи над ідеєю сервісу зі скидання пароля в системах SAP R/3 постало питання — а як запустити SAP GUI з потрібними параметрами з браузера? Оскільки в цій ідеї передбачалося використання веб-сервісу, що спочатку відпрацьовує на запит SOAP із SAP GUI і відправляє лист з посиланням на веб-сторінку зі скриптом скидання пароля на початковий, а потім вже відображення користувачеві повідомлення про успішне скидання пароля і відображення цього самого початкового пароля хотілося, щоб на цій сторінці було ще й посилання на запуск SAP GUI. Причому, щоб це посилання відкривало потрібну систему, та ще, бажано, відразу із заповненими полями логіну та паролю: користувачеві залишалося б тільки двічі заповнити продуктивний пароль.

Запуск SAP Logon - для нашої мети був не цікавий, а при запуску sapgui.exe неможливо було вказати мандант та ім'я користувача, зате можна було запустити систему, не визначену в SAP Logon. З іншого боку, запуск SAP GUI з довільними параметрами сервера був не дуже актуальний: якщо ми вирішуємо завдання скидання пароля користувача, то швидше за все у нього в SAP Logon вже є потрібний рядок, з потрібними йому налаштуваннями і не треба лізти зі своїми. Натомість заданим вимогам задовольняла технологія SAP GUI Shortcut і програма sapshcut.exe, яка давала можливість запускати SAP GUI з використанням певного «ярлика».

Вирішення завдання в лоб: запуск sapshcut.exe безпосередньо з браузера за допомогою об'єкта ActiveX:

function openSAPGui(sid, client, user, password) {
var shell = new ActiveXObject("WScript.Shell");
shell.run('sapshcut.exe -system="'+sid+'" -client='+client+' -user="'+user+'" -pw="'+password+'" -language=RU');
}

Рішення погане: по-перше, працює тільки в Internet Explorer, по-друге, вимагає відповідних налаштувань безпеки в браузері, які в організації можуть бути заборонені на доменному рівні, і навіть якщо дозволені, браузер видає користувачеві вікно з лякаючим попередженням:

Запуск SAP GUI із браузера

Рішення №2 відкопав в інтернеті: створення власного веб-протоколу. Дозволяє запустити потрібну нам програму за допомогою посилання із зазначенням протоколу, який ми самі реєструємо у Windows у реєстрі у розділі HKEY_CLASSES_ROOT. Оскільки в SAP GUI Shortcut в цьому розділі є свій підрозділ, можна туди додати рядковий параметр URL Protocol з порожнім значенням:

Запуск SAP GUI із браузера

Цей протокол запускає sapgui.exe з параметром /SHORTCUT, Що нам як би і треба:

Запуск SAP GUI із браузера

Ну або якщо ми хочемо зробити взагалі довільний протокол (наприклад, sapshcut), то зареєструвати його можна за допомогою наступного reg-файлу:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTsapshcut]
@="sapshcut Handler"
"URL Protocol"=""
[HKEY_CLASSES_ROOTsapshcutDefaultIcon]
@="sapshcut.exe"
[HKEY_CLASSES_ROOTsapshcutshell]
[HKEY_CLASSES_ROOTsapshcutshellopen]
[HKEY_CLASSES_ROOTsapshcutshellopencommand]
@="sapshcut.exe "%1""

Тепер, якщо ми на веб-сторінці зробимо посилання із зазначенням протоколу Sapgui.Shortcut.File подібним чином:

<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>

у нас має відобразитися вікно виду:

Запуск SAP GUI із браузера

І начебто все чудово, але при натисканні на кнопку «Дозволити» бачимо:

Запуск SAP GUI із браузера

Опа, браузер пропуск перетворив на %20. Та й інші символи теж будуть закодовані у свій числовий код із символом відсотка. І найнеприємніше, що тут нічого не можна зробити на рівні браузера (тут все зроблено за стандартом) — браузер не любить подібні символи, а командний інтерпретатор Windows не працює з закодованими значеннями. І ще один мінус - як параметр передається весь рядок, включаючи назву протоколу і навіть двокрапка (sapgui.shortcut.file:). Причому, хоча той самий sapshcut.exe вміє відкидає усе що є йому параметром (починається з символу «-«, потім назва, «=» і значення), тобто. рядок виду «sapgui.shortcut.file: -system=SIDще прокотить, то без пропускуsapgui.shortcut.file:-system=SID» вже не працює.

Виходить, що в принципі є два варіанти використання URI-протоколу:

  1. Використання без параметрів: Створюємо цілу купу протоколів під усі наші системи виду SIDMANDT, типу AAA200, BBB200 і т.п. Якщо потрібно просто запустити потрібну систему, то варіант цілком робочий, але в нашому випадку не підходить, оскільки хоча б логін користувача хочеться теж передати, а це таким чином не зробити.
  2. Використання програми-обгортки для виклику sapshcut.exe або sapgui.exe. Суть цієї програми проста - вона повинна брати той рядок, що їй передасть браузер через веб-протокол і її перетворювати на те, що приймає Windows, тобто. назад перетворює всі коди символів на символи (може навіть розбирає рядок за параметрами) і вже викликає SAP GUI гарантовано вірною командою. У нашому випадку теж не зовсім підходить (тому навіть не став її писати), тому що нам вже мало додати протокол на всіх ПК (в рамках домену це ще куди не йшло, хоча теж краще уникати такої практики), але тут потрібно ще додатково програму розмістити на ПК, та ще й постійно стежити, щоб вона нікуди не поділася при переустановках на ПК.

Тобто. даний варіант теж відкидаємо як непридатний для нас.

Тут я вже почав думати, що з ідеєю запускати SAP GUI з потрібними параметрами з браузера доведеться розпрощатися, але тут мені спало на думку, що в SAP Logon можна зробити ярлик і його можна скопіювати на робочий стіл. Я користувався таким способом колись, але раніше файл ярлика спеціально не дивився. І виявилося, що цей ярлик є звичайним текстовим файлом з розширенням .sap. І якщо його запустити в Windows - запуститься SAP GUI з параметрами, які вказані в цьому файлі. "Бінго!"

Формат даного файлу приблизно наступний (ще може бути транзакція, що запускається при старті, але я її опустив):

[System]
Name=SID
Client=200
[User]
Name=
Language=RU
Password=
[Function]
Title=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0

Начебто все, що необхідно: і ідентифікатор системи, і мандант, і ім'я користувача і навіть пароль. І навіть додаткові параметри: назва - Заголовок вікна, GuiSize - Розмір запущеного вікна (на весь екран чи ні) і Повторне використання — чи відкривати обов'язково нове вікно чи використовувати вже відкрите із цією системою. Але відразу виліз нюанс — пароль у SAP Logon виявити не можна, рядок був заблокований. Виявилося, що це зроблено з міркувань безпеки: всі ярлики, створені в SAP Logon, він зберігає у файлі sapshortcut.ini (поряд з saplogon.ini у профілі користувача Windows) і там вони хоч і зашифровані, але не надто сильно і за великого бажання їх можна розкодувати. Але це можна і дозволити за допомогою зміни значення одного параметра в реєстрі (за замовчуванням значення 0):

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"

Це розблокує для введення поля "Пароль" на формі створення ярлика в SAP Logon:

Запуск SAP GUI із браузера

І при внесенні в це поле пароля, він буде розміщений у відповідному рядку
sapshortcut.iniАле при перетягуванні ярлика на робочий стіл він там не з'являється - зате можна його туди додати вручну. Пароль зашифрований, для 111111 він буде наступного виду: PW_49B02219D1F6, для 222222 - PW_4AB3211AD2F5. Але нас більше цікавить те, що цей пароль шифрується одним способом, який не залежить від конкретного ПК і, якщо ми скидатимемо пароль на початковий, то можна в цьому полі використовувати одне заздалегідь відоме значення. Ну а якщо ми захочемо використовувати довільно створений пароль, то доведеться зрозуміти алгоритм цього шифру. Але, зважаючи на наведені приклади, зробити це буде нескладно. До речі, у SAP GUI 7.40 це поле взагалі зникло з форми, але файл із заповненим паролем він коректно сприймає.

Тобто виходить, що в браузері достатньо клацнути за посиланням на файл з розширенням .sap і з потрібним форматом - і він запропонує його відкрити як файл типу SAP GUI Shortcut (природно на ПК зі встановленим SAP GUI) і відкриє вікно SAP GUI із зазначеними параметрами (якщо пара SID та мандант є у списку SAP Logon на цьому ПК).

Але зрозуміло, що просто файли ніхто заздалегідь створювати і складувати на сайт не буде - їх треба генерувати виходячи з потрібних параметрів. Наприклад, можна створити скрипт на PHP для генерації ярликів (sapshcut.php):

<?php
$queries = array();
parse_str($_SERVER['QUERY_STRING'], $queries);
$Title = $queries['Title'];
$Size = $queries['Size'];
$SID = $queries['SID'];
$Client = $queries['Client'];
if($Client == '') { $Client=200; };
$Lang = $queries['Language'];
if($Lang=='') { $Lang = 'RU'; };
$User = $queries['Username'];
if($User<>'') { $Password = $queries['Password']; };
$filename = $SID.$Client.'.sap';
header('Content-disposition: attachment; filename='.$filename);
header('Content-type: application/sap');
echo "[System]rn";
echo "Name=".$SID."rn";
echo "Client=".$Client."rn";
echo "[User]rn";
echo "Name=".$Username."rn";
echo "Language=".$Lang."rn";
if($Password<>'') echo "Password=".$Password."rn";
echo "[Function]rn";
if($Title<>'') {echo "Title=".$Title."rn";} else {echo "Title=Вход в системуrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>

Якщо не задавати ім'я користувача та пароль, то отримаємо наступне вікно із запитів логіну та паролю:

Запуск SAP GUI із браузера

Якщо передати лише логін — поле логін буде заповнене, а поле пароль порожнє. Якщо ми передаємо користувачеві і логін і пароль, але у користувача на ПК у реєстрі ключ EnablePassword у розділі [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] встановлений в 0, то отримаємо те ж саме. І тільки якщо цей ключ встановлений в 1 і ми передаємо ім'я і початковий пароль, то система відразу запросить двічі ввести новий постійний пароль. Що й потрібно було отримати.

У результаті маємо наступний набір розглянутих варіантів як ілюстрація всього вищесказаного:

<html>
<head>
<script>
function openSAPGui(sid, client, user, password) {
var shell = new ActiveXObject("WScript.Shell");
shell.run('sapshcut.exe -system="'+sid+'" -client='+client+' -user="'+user+'" -pw="'+password+'" -language=RU');
}
</script>
</head>
<body>
<a href='' onclick="javascript:openSAPGui('SID', '200', 'test', '');"/>Example 1: Execute sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Example 2: Open sapshcut.exe (URI)</a><br>
<a href='sapshcut.php?SID=SID&Client=200&User=test'>Example 3: Open file .sap (SAP GUI Shortcut)</a><br>
</body>
</html>

Мені підійшов останній варіант. Але також можна замість генерації ярликів SAP використовувати, наприклад, генерацію CMD-файлів, які при відкритті з браузера також відкриють вам вікно SAP GUI. Нижче наведено приклад (sapguicmd.php) прямого запуску SAP GUI із зазначенням повного рядка підключення, без необхідності мати налаштований SAP Logon:

<?php
$queries = array();
parse_str($_SERVER['QUERY_STRING'], $queries);
$Title = $queries['Title'];
$ROUTER = $queries['ROUTER'];
$ROUTERPORT = $queries['ROUTERPORT'];
$HOST = $queries['HOST'];
$PORT = $queries['PORT'];
$MESS = $queries['MESS'];
$LG = $queries['LG'];
$filename = 'SAPGUI_';
if($MESS<>'') $filename = $filename.$MESS;
if($HOST<>'') $filename = $filename.$HOST;
if($PORT<>'') $filename = $filename.'_'.$PORT;
$filename = $filename.'.cmd';
header('Content-disposition: attachment; filename='.$filename);
header('Content-type: application/cmd');
echo "@echo offrn";
echo "chcp 1251rn";
echo "echo Вход в ".$Title."rn";
echo "set SAP_CODEPAGE=1504rn";
echo 'if exist "%ProgramFiles(x86)%SAPFrontEndSapGuisapgui.exe" set gui=%ProgramFiles(x86)%SAPFrontEndSapGuisapgui.exe'."rn";
echo 'if exist "%ProgramFiles%SAPFrontEndSapGuisapgui.exe" set gui=%ProgramFiles%SAPFrontEndSapGuisapgui.exe'."rn";
echo "set logon=";
if($ROUTER<>'') echo "/H/".$ROUTER;
if($ROUTERPORT<>'') echo "/S/".$ROUTERPORT;
if($MESS<>'') echo "/M/".$MESS;
if($HOST<>'') echo "/H/".$HOST;
if($PORT<>'') echo "/S/".$PORT;
if($LG<>'') echo "/G/".$LG;
echo "rn";
echo '"%gui%" %logon%'."rn";
?>

Джерело: habr.com

Додати коментар або відгук