Запуск 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

Дадаць каментар