Spuštění SAP GUI z prohlížeče

Tento článek jsem nejprve napsal pro sebe blog, abych se pak znovu nemusel snažit najít nebo si pamatovat, ale protože blog nikdo nečte, chtěl jsem se o tuto informaci podělit se všemi, náhodou se to někomu hodí.

Při práci na myšlence služby pro resetování hesla v systémech SAP R/3 se objevila otázka – jak spustit SAP GUI s potřebnými parametry z prohlížeče? Vzhledem k tomu, že tato myšlenka zahrnovala použití webové služby, která nejprve reaguje na SOAP požadavek z SAP GUI a posílá e-mail s odkazem na webovou stránku se skriptem pro resetování hesla na úvodní stránku, a potom zobrazí uživateli zprávu o úspěšném resetování hesla a zobrazení tohoto samého úvodního hesla, chtěl jsem, aby na této stránce byl také odkaz na spuštění SAP GUI. A to tak, aby tento odkaz otevřel požadovaný systém, a pokud možno, s předem vyplněnými poli pro přihlášení a heslo: uživateli by stačilo vyplnit pouze produkční heslo dvakrát.

Spuštění SAP Logon – pro náš cíl nebylo zajímavé, a při spuštění sapgui.exe nebylo možné zadat mandant a uživatelské jméno, ale naopak bylo možné spustit systém, který v SAP Logon nebyl definován. Na druhou stranu, spuštění SAP GUI s libovolnými parametry serveru nebylo zvlášť aktuální: když se už snažíme vyřešit problém resetování uživatelského hesla, pravděpodobně už má v SAP Logon potřebný řádek s odpovídajícím nastavením a není třeba zasahovat se svými. Naproti tomu požadavkům odpovídala technologie SAP GUI Shortcut a samotný program sapshcut.exe, který umožňoval spouštět SAP GUI pomocí specifického „zástupce“.

Řešení problému přímo: spuštění sapshcut.exe přímo z prohlížeče pomocí 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');
}

Řešení není dobré: za prvé, funguje pouze v Internet Exploreru, za druhé, vyžaduje odpovídající bezpečnostní nastavení v prohlížeči, která mohou být v organizaci zakázána na doménové úrovni, a i když jsou povolena, prohlížeč zobrazí uživateli okno s děsivým upozorněním:

Spuštění SAP GUI z prohlížeče

Řešení č. 2, které jsem našel na internetu: vytvoření vlastního webového protokoluUmožňuje spustit potřebnou aplikaci pomocí odkazu se specifikací protokolu, který si sami registrujeme v systému Windows v registru v sekci HKEY_CLASSES_ROOT. Jelikož má SAP GUI Shortcut v této sekci svůj pododdíl, můžeme tam přidat řetězcový parametr URL Protocol s prázdnou hodnotou:

Spuštění SAP GUI z prohlížeče

Tento protokol spouští sapgui.exe s parametrem /SHORTCUT, což je přesně to, co potřebujeme:

Spuštění SAP GUI z prohlížeče

Nebo pokud chceme vytvořit úplně libovolný protokol (například, sapshcut), můžeme ho zaregistrovat pomocí následujícího reg souboru:

Editor registru systému Windows verze 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""

Teď, pokud na webové stránce vytvoříme odkaz se specifikací protokolu Sapgui.Shortcut.File tímto způsobem:

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

mělo by se nám zobrazit okno jako:

Spuštění SAP GUI z prohlížeče

A zdá se, že vše je skvělé, ale po stisknutí tlačítka „Povolit“ vidíme:

Spuštění SAP GUI z prohlížeče

Opi, prohlížeč přetvořil mezeru na . I další symboly budou zakódovány do svého číselného kódu se znakem procenta. A to nejhorší je, že s tím nelze na úrovni prohlížeče nic udělat (všechno je uděláno podle standardu) — prohlížeč nemá rád takové symboly a příkazový interpret Windows nepracuje s takto zakódovanými hodnotami. A ještě jeden mínus — jako parametr se předává celý řetězec, včetně názvu protokolu a dokonce dvojtečky (sapgui.shortcut.file:). Ačkoli ten samý sapshcut.exe umí odmítnout vše, co pro něj není parametrem (začíná s „-“, pak název, „=“ a hodnota), tzn. řetězec ve tvaru „sapgui.shortcut.file: -system=SID“ ještě projde, tak bez mezery „sapgui.shortcut.file:-system=SID“ už nefunguje.

Ukazuje se, že v zásadě existují dva způsoby použití URI protokolu:

  1. Použití bez parametrů: Vytvoříme celou řadu protokolů pro všechny naše systémy jako SIDMANDT, typu AAA200, BBB200 atd. Pokud potřebujeme pouze spustit požadovaný systém, je tento způsob zcela funkční, ale v našem případě není vhodný, protože bychom chtěli také předat uživatelské jméno, a to se takto nedá udělat.
  2. Použití obalového programu pro volání sapshcut.exe nebo sapgui.exePodstata tohoto programu je jednoduchá – měla by vzít ten řetězec, který jí předá prohlížeč přes webový protokol, a převést ho na to, co přijímá Windows, tj. opět převádí všechny kódy znaků na znaky (možná i rozebírá řetězec podle parametrů) a již vyvolává SAP GUI garantovaně správným příkazem. V našem případě to také úplně nevyhovuje (proto jsem jej ani nenapsal), protože nám už nestačí přidat protokol na všech uživatelských PC (v rámci domény to ještě ujde, i když takové praxi bychom se měli vyhnout), ale zde bude třeba ještě navíc umístit program na PC a neustále sledovat, aby někam nezmizel při přeinstalaci softwaru na PC.

Tedy tuto variantu také zavrhujeme jako nevhodnou.

Zde jsem už začal přemýšlet, že s myšlenkou spouštět SAP GUI s potřebnými parametry z prohlížeče se budu muset rozloučit, ale pak mi napadlo, že v SAP Logon lze vytvořit zástupce a ten lze zkopírovat na plochu. Tento způsob jsem kdysi používal, ale předtím jsem se na soubor zástupce speciálně nedíval. A ukázalo se, že tento zástupce představuje běžný textový soubor s příponou .sap. A pokud ho spustíte ve Windows, spustí se SAP GUI s parametry, které jsou uvedeny v tomto souboru. „Bingo!“

Formát tohoto souboru je zhruba následující (může být ještě spouštěná transakce při startu, ale tu jsem vynechal):

[System]
Jméno=SID
Klient=200
[User]
Jméno=
Jazyk=RU
Heslo=
[Function]
Název=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0

Vypadá to, že je zde vše, co je potřeba: identifikátor systému, mandant, uživatelské jméno a dokonce i heslo. A dokonce i další parametry: Title — název okna, GuiSize — velikost spuštěného okna (na celou obrazovku nebo ne) a Reuse — zda otevřít nutně nové okno nebo používat již otevřené s touto stejnou systémem. Ale okamžitě se objevil problém — heslo v SAP Logon se ukázalo jako nemožné nastavit, pole bylo zablokováno. Ukázalo se, že to bylo uděláno z důvodů bezpečnosti: všechny zástupce vytvořené v SAP Logon uchovává v souboru sapshortcut.ini (vedle saplogon.ini v uživatelském profilu Windows) a tam jsou i když zašifrovány, ale ne příliš silně a při velké snaze je možné je dekódovat. Ale lze to také povolit změnou hodnoty jednoho parametru v registru (výchozí hodnota 0):

Editor registru systému Windows verze 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"

to odemkne pole „Heslo“ na formuláři pro vytvoření zástupce v SAP Logon:

Spuštění SAP GUI z prohlížeče

A při vložení do tohoto pole bude heslo umístěno ve správném řádku.
sapshortcut.ini, ale když přetáhnete zástupce na ploše, tam se neobjeví – ale můžete ho tam přidat ručně. Heslo je šifrováno, pro 111111 bude mít tento formát: PW_49B02219D1F6, pro 222222 – PW_4AB3211AD2F5. Ale nás více zajímá to, že toto heslo je šifrováno jedním způsobem, nezávisle na konkrétním PC, a pokud resetujeme heslo na výchozí, můžeme v tomto poli použít jednu předem známou hodnotu. A pokud budeme chtít použít náhodně vytvořené heslo – budeme muset pochopit algoritmus tohoto šifru. Ale soudě podle uvedených příkladů to nebude těžké. Mimochodem, v SAP GUI 7.40 toto pole vůbec vypadlo z formuláře, ale soubor s vyplněným heslem je správně zpracovává.

Jinými slovy, v prohlížeči stačí kliknout na odkaz na soubor s příponou .sap a s požadovaným formátem – a nabídne nám ho otevřít jako soubor typu SAP GUI Shortcut (samozřejmě na PC s nainstalovaným SAP GUI) a otevře nám okno SAP GUI s uvedenými parametry (pokud je pár SID a mandant v seznamu SAP Logon na tomto PC).

Je jasné, že nikdo nebude předem vytvářet a skladovat soubory na webu – je třeba je generovat podle potřebných parametrů. Například je možné vytvořit skript v PHP pro generování zástupců (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=Přihlášení do systémurn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?/>

Pokud nezadáte uživatelské jméno a heslo, zobrazí se nám následující okno s výzvou k přihlášení a heslu:

Spuštění SAP GUI z prohlížeče

Pokud zadáte pouze uživatelské jméno, pole pro uživatelské jméno bude vyplněno a pole pro heslo zůstane prázdné. Pokud však předáváme uživateli jak uživatelské jméno, tak heslo, ale v registru počítače uživatele je klíč EnablePassword v sekci [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] nastaven na 0, dostaneme totéž. A pouze pokud je tento klíč nastaven na 1 a my předáváme jak jméno, tak počáteční heslo, systém okamžitě požádá o dvakrát zadání nového trvalého hesla. Což bylo potřeba získat.

Výsledkem máme následující sadu zvážených možností jako ilustraci všeho výše uvedeného:

<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', '');"/>Příklad 1: Spusťte sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Příklad 2: Otevřete sapshcut.exe (URI)</a><br>
<a href='/cs/sapshcut.php/?SID=SID&Client=200&User=test'>Příklad 3: Otevřete soubor .sap (zkratka SAP GUI)</a><br>
</body>
</html>

Mně vyhovovala poslední možnost. Ale místo generování zástupců SAP lze například použít generování CMD souborů, které také po otevření z prohlížeče otevřou okno SAP GUI. Níže je uveden příklad (sapguicmd.php) přímého spuštění SAP GUI s uvedením celé připojovací řetězce, bez nutnosti mít nastavený 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 Přihlášení do ".$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: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster