Spustenie SAP GUI z prehliadača

Prvýkrát som napísal tento článok v mojom blog, aby som neskôr nehľadal a nepamätal si, ale keďže blog nikto nečíta, chcel som sa o tieto informácie podeliť so všetkými, ak to niekomu príde vhod.

Pri práci na myšlienke služby resetovania hesla v systémoch SAP R/3 vyvstala otázka - ako spustiť SAP GUI s potrebnými parametrami z prehliadača? Keďže táto myšlienka znamenala použitie webovej služby, najprv odpovedanie na požiadavku SOAP z GUI SAP a odoslanie listu s odkazom na webovú stránku so skriptom na obnovenie hesla na pôvodné heslo a následné zobrazenie používateľovi správu o úspešnom resetovaní hesla a zobrazení tohto úplne počiatočného hesla, potom by som chcel, aby táto stránka obsahovala aj odkaz na spustenie GUI SAP. Okrem toho by tento odkaz mal otvoriť požadovaný systém a najlepšie s vyplnenými poliami pre prihlásenie a heslo naraz: používateľ by musel zadať produktívne heslo iba dvakrát.

Spustenie SAP Logon nebolo pre náš účel zaujímavé a pri spustení sapgui.exe nebolo možné zadať meno klienta a používateľa, ale bolo možné spustiť systém nedefinovaný v SAP Logon. Na druhej strane spustenie SAP GUI s ľubovoľnými parametrami servera nebolo obzvlášť relevantné: ak riešime problém s resetovaním hesla používateľa, potom s najväčšou pravdepodobnosťou už má potrebný riadok v SAP Logon s nastaveniami, ktoré potrebuje, a tam nie je potrebné zahrávať sa so svojimi. Zadané požiadavky však spĺňala technológia SAP GUI Shortcut a samotný program sapshcut.exe, čo umožnilo spustiť SAP GUI pomocou špecifickej „skratky“.

Riešenie problému priamo: spustenie sapshcut.exe priamo z prehliadača pomocou objektu 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');
}

Riešenie je zlé: po prvé, funguje iba v Internet Exploreri, po druhé, vyžaduje vhodné nastavenia zabezpečenia v prehliadači, čo môže byť v organizácii zakázané na úrovni domény, a aj keď je povolené, prehliadač zobrazí okno s desivým upozornenie pre užívateľa:

Spustenie SAP GUI z prehliadača

Na internete som našiel riešenie číslo 2: vytvorenie vlastného webového protokoluUmožňuje nám spustiť potrebnú aplikáciu pomocou odkazu s uvedením protokolu, v ktorom sa zaregistrujeme. Windows V registri, pod HKEY_CLASSES_ROOT. Keďže skratka SAP GUI má v tejto sekcii vlastný podkľúč, môžete pridať parameter reťazca URL Protocol s prázdnou hodnotou:

Spustenie SAP GUI z prehliadača

Tento protokol sa spustí sapgui.exe s parametrom /SKRATKA, čo je presne to, čo potrebujeme:

Spustenie SAP GUI z prehliadača

No, alebo ak chceme urobiť úplne ľubovoľný protokol (napr. sapshcut), potom ho môžete zaregistrovať pomocou nasledujúceho súboru 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""

Teraz, ak vytvoríme odkaz na webovú stránku označujúcu protokol Sapgui.Shortcut.File podobným spôsobom:

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

Mali by sme vidieť takéto okno:

Spustenie SAP GUI z prehliadača

A všetko sa zdá byť skvelé, ale keď kliknete na tlačidlo „Povoliť“, uvidíme:

Spustenie SAP GUI z prehliadača

Ups, prehliadač zmenil medzeru na %20. A ďalšie znaky budú tiež zakódované do vlastného číselného kódu so znakom percenta. A najhoršie na tom je, že s tým na úrovni prehliadača nič nenarobíte (tu je všetko štandardné) – prehliadač takéto znaky nemá rád a ani interpret príkazov nie. Windows nefunguje s takto kódovanými hodnotami. Ďalšou nevýhodou je, že celý reťazec sa odovzdáva ako parameter vrátane názvu protokolu a dokonca aj dvojbodky (sapgui.shortcut.file:). Navyše, hoci rovnako sapshcut.exe môže zahodiť všetko, čo preň nie je parametrom (začína symbolom „-“, potom názvom, „=“ a hodnotou), t.j. riadok ako "sapgui.shortcut.file: -system=SID"stále to bude fungovať, potom bez medzery"sapgui.shortcut.file:-system=SID"už nefunguje.

Ukazuje sa, že v zásade existujú dve možnosti použitia protokolu URI:

  1. Použitie bez parametrov: Vytvárame celý rad protokolov pre všetky naše systémy tohto typu SIDMANDT, Páči sa mi to AAA200, BBB200 a tak ďalej. Ak potrebujete iba spustiť požadovaný systém, potom je táto možnosť celkom funkčná, ale v našom prípade nie je vhodná, pretože by ste prinajmenšom chceli preniesť prihlasovacie meno používateľa, ale nedá sa to urobiť.
  2. Použitie programu wrapper na volanie sapshcut.exe alebo sapgui.exePodstata tohto programu je jednoduchá - mal by vziať reťazec, ktorý mu prehliadač pošle cez webový protokol, a previesť ho do reprezentácie, ktorá je akceptovaná. Windows, t. j. prevedie všetky kódy znakov späť na znaky (možno dokonca analyzuje reťazec podľa parametrov) a potom zavolá grafické používateľské rozhranie SAP s príkazom, ktorý zaručene vygeneruje správny príkaz. Pre náš prípad to nie je úplne vhodné (preto som sa s tým ani neobťažoval písať), pretože pridanie protokolu do všetkých používateľských počítačov nestačí (v rámci domény je to stále v poriadku, aj keď je najlepšie sa tejto praxi vyhnúť). Budeme tiež musieť program nainštalovať na počítač a neustále ho monitorovať, aby sme zabezpečili, že zostane na mieste aj pri preinštalovaní softvéru na počítači.

Tie. Túto možnosť tiež zavrhujeme ako pre nás nevhodnú.

V tomto momente som už začínal uvažovať o tom, že sa budem musieť rozlúčiť s myšlienkou spustenia SAP GUI s potrebnými parametrami z prehliadača, no potom ma napadla myšlienka, že v SAP Logon si môžete urobiť skratku a skopírujte ho na plochu. Túto metódu som použil raz, ale predtým som sa konkrétne nepozrel na súbor skratky. A ukázalo sa, že táto skratka je obyčajný textový súbor s príponou .sapA ak ho spustíte Windows — grafické používateľské rozhranie SAP sa spustí s parametrami uvedenými v tomto súbore. „Bingo!“

Formát tohto súboru je približne nasledujúci (pri spustení môže byť spustená aj transakcia, ale vynechal som ju):

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

Zdá sa, že všetko, čo je potrebné: systémový identifikátor, klient, používateľské meno a dokonca aj heslo. A dokonca aj ďalšie parametre: nadpis - nadpis okna, GuiSize — veľkosť spusteného okna (celá obrazovka alebo nie) a opätovné — či je potrebné otvoriť nové okno alebo použiť už otvorené okno s rovnakým systémom. Okamžite sa však objavila nuansa - ukázalo sa, že heslo v SAP Logon nebolo možné nastaviť, linka bola zablokovaná. Ukázalo sa, že to bolo urobené z bezpečnostných dôvodov: všetky skratky vytvorené v SAP Logon sa ukladajú do súboru sapshortcut.ini (V blízkosti saplogon.ini v používateľskom profile Windows) a hoci sú tam šifrované, nie sú príliš silno šifrované a dajú sa dešifrovať, ak naozaj chcete. Môžete to však vyriešiť aj zmenou hodnoty jedného parametra v registri (predvolená hodnota je 0):

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

Tým sa odomkne pole Heslo pre zadanie vo formulári na vytvorenie skratky v SAP Logon:

Spustenie SAP GUI z prehliadača

A keď do tohto poľa zadáte heslo, umiestni sa do príslušného riadku
sapshortcut.ini, ale keď pretiahnete zástupcu na plochu, nezobrazí sa tam - ale môžete si ho tam pridať ručne. Heslo je zašifrované, pre 111111 bude nasledovné: PW_49B02219D1F6, pre 222222 - PW_4AB3211AD2F5. Nás ale skôr zaujíma, že toto heslo je zašifrované jedným spôsobom, nezávisle od konkrétneho PC a ak heslo resetujeme na počiatočné, tak v tomto poli môžeme použiť jednu vopred známu hodnotu. No, ak chceme použiť náhodne vytvorené heslo, budeme musieť pochopiť algoritmus tejto šifry. Ale súdiac podľa uvedených príkladov to nebude ťažké. Mimochodom, v SAP GUI 7.40 toto pole úplne zmizlo z formulára, ale správne akceptuje súbor s vyplneným heslom.

To znamená, že sa ukáže, že v prehliadači stačí kliknúť na odkaz na súbor s príponou .sap a požadovaným formátom - a ponúkne ho otvoriť ako súbor typu SAP GUI Shortcut (samozrejme na PC s nainštalovaným SAP GUI) a otvorí okno SAP GUI so špecifikovanými parametrami (ak je SID a pár klientov v zozname SAP Logon na tomto PC).

Je však jasné, že nikto nebude jednoducho vytvárať súbory vopred a ukladať ich na stránku - musia byť generované na základe potrebných parametrov. Môžete napríklad vytvoriť skript PHP na generovanie skratiek (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";
?>

Ak nezadáte používateľské meno a heslo, zobrazí sa nasledujúce okno so žiadosťou o prihlásenie a heslo:

Spustenie SAP GUI z prehliadača

Ak odovzdáte iba prihlasovacie meno, prihlasovacie pole sa vyplní a pole pre heslo bude prázdne. Ak používateľovi dáme prihlasovacie meno aj heslo, ale používateľ na počítači má kľúč EnablePassword v registri v časti [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] nastavený na 0, dostaneme to isté. A iba ak je tento kľúč nastavený na 1 a odovzdáme meno aj počiatočné heslo, systém vás hneď dvakrát vyzve na zadanie nového trvalého hesla. To sme potrebovali získať.

Výsledkom je, že ako ilustráciu všetkých vyššie uvedených možností máme nasledujúci súbor zvažovaných možností:

<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>

Posledná možnosť mi vyhovovala. Ale namiesto generovania skratiek SAP môžete použiť napríklad aj generovanie CMD súborov, ktoré vám po otvorení z prehliadača otvoria aj okno SAP GUI. Nižšie je uvedený príklad (sapguicmd.php) priamo spustite SAP GUI s úplným reťazcom pripojenia bez potreby nakonfigurovať 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";
?>

Zdroj: hab.com

Kúpte si spoľahlivý hosting pre stránky s DDoS ochranou, VPS VDS servery 🔥 Kúpte si spoľahlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster