Стартиране на 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 Версия 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 от браузъра

Опа, браузърът преобразува интервала в . И други символи също ще бъдат кодирани в техния числов код с процентен символ. Най-неприятното е, че нищо не може да се направи на ниво браузър (всичко е направено по стандарта) — браузърът не обича подобни символи, а командният интерпретатор на 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]
Име=SID
Клиент=200
[User]
Име=
Език=BG
Парола=
[Function]
Заглавие=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0

Изглежда всичко необходимо е там: и идентификатор на системата, и мандант, и име на потребителя, и дори парола. И дори допълнителни параметри: Title — заглавие на прозореца, GuiSize — размер на стартираното изображение (на цял екран или не) и Reuse — трябва ли задължително да се открие нов прозорец, или да се използва вече отворен с тази система. Но веднага изникна нюанс - в SAP Logon не може да се зададе парола, полето беше заключено. Оказа се, че това е направено по съображения за сигурност: всички преки пътища, създадени в SAP Logon, се съхраняват в файл sapshortcut.ini (до saplogon.ini в профила на Windows) и там, макар да са криптирани, не са особено силно и при голямо желание могат да бъдат декодирани. Но може и да се разреши това чрез промяна на стойността на един параметър в регистъра (по подразбиране стойността 0):

Редактор на регистъра на Windows Версия 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 = 'BG'; };
$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', '');"/>Пример 1: Изпълнете sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Пример 2: Отворете sapshcut.exe (URI)</a><br>
<a href='/bg/sapshcut.php/?SID=SID&Client=200&User=test'>Пример 3: Отворете файла .sap (Съкращение на SAP GUI)</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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster