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 protokolu. Umožňuje nám spustiť aplikáciu, ktorú potrebujeme, pomocou odkazu s uvedením protokolu, ktorý sami zaregistrujeme v systéme Windows v registri v časti HKEY_CLASSES_ROOT. Keďže skratka SAP GUI má v tejto časti svoju vlastnú podsekciu, môžete tam pridať parameter reťazca protokolu URL 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

Ojoj, prehliadač zmenil medzerník na %20. No aj ostatné znaky budú zakódované do vlastného číselného kódu so symbolom percenta. A najnepríjemnejšia vec je, že sa tu nedá nič robiť na úrovni prehliadača (všetko sa tu robí podľa štandardu) - prehliadač takéto znaky nemá rád a interpret príkazov systému Windows s takto zakódovanými hodnotami nepracuje. A ešte jedno mínus - ako parameter sa odovzdá celý reťazec 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.exe. Podstata tohto programu je jednoduchá – musí zobrať reťazec, ktorý mu prehliadač odošle cez webový protokol a premeniť ho na reprezentáciu, ktorú prijíma Windows, t.j. premení všetky kódy znakov späť na znaky (možno aj analyzuje reťazec podľa parametrov) a už volá SAP GUI so zaručene správnym príkazom. V našom prípade to tiež nie je úplne vhodné (preto som to ani nepísal), pretože nám nestačí pridať protokol na všetky používateľské PC (v rámci domény je to stále v poriadku, aj keď je tiež lepšie vyhnúť sa tejto praxi), ale tu budeme potrebovať viac umiestniť program na PC a tiež neustále zabezpečiť, aby nezmizol, keď sa softvér preinštaluje na PC.

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 .sap. A ak ho spustíte v systéme Windows, SAP GUI sa spustí s parametrami, ktoré sú špecifikované 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 užívateľskom profile Windows) a tam, hoci sú zašifrované, nie sú príliš silne zašifrované a na želanie sa dajú dešifrovať. Môžete to však vyriešiť 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

Pridať komentár