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

Tento článek jsem poprvé napsal ve svém blog, abych později znovu nehledal a nevzpomínal, ale protože blog nikdo nečte, chtěl jsem se o tyto informace podělit se všemi, kdyby se to někomu hodilo.

Při práci na myšlence služby resetování hesla v systémech SAP R/3 vyvstala otázka - jak spustit SAP GUI s potřebnými parametry z prohlížeče? Vzhledem k tomu, že tato myšlenka znamenala použití webové služby, nejprve odpovědět na požadavek SOAP z GUI SAP a odeslat dopis s odkazem na webovou stránku se skriptem pro resetování hesla na původní a poté zobrazení uživateli zprávu o úspěšném resetování hesla a zobrazení tohoto velmi počátečního hesla, pak bych chtěl, aby tato stránka měla také odkaz na spuštění SAP GUI. Kromě toho by tento odkaz měl otevřít požadovaný systém a nejlépe s vyplněnými poli pro přihlášení a heslo najednou: uživatel by musel vyplnit produktivní heslo pouze dvakrát.

Spuštění SAP Logon nebylo pro náš účel zajímavé a při spuštění sapgui.exe nebylo možné specifikovat klienta a uživatelské jméno, ale bylo možné spustit systém nedefinovaný v SAP Logon. Na druhou stranu spouštění SAP GUI s libovolnými parametry serveru nebylo nijak zvlášť relevantní: pokud řešíme problém s resetováním hesla uživatele, pak s největší pravděpodobností již má potřebný řádek v SAP Logon s nastavením, které potřebuje, a tam není třeba si zahrávat se svými. Zadané požadavky ale splnila technologie SAP GUI Shortcut a samotný program sapshcut.exe, který umožnil spustit 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í je špatné: zaprvé funguje pouze v Internet Exploreru, zadruhé vyžaduje odpovídající nastavení zabezpečení v prohlížeči, což může být v organizaci zakázáno na úrovni domény, a i když je povoleno, prohlížeč zobrazí okno s děsivým upozornění pro uživatele:

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

Na internetu jsem našel řešení č. 2: vytvoření vlastního webového protokolu. Umožňuje nám spustit potřebnou aplikaci pomocí odkazu označujícího protokol, který sami registrujeme ve Windows v registru v sekci HKEY_CLASSES_ROOT. Vzhledem k tomu, že zkratka SAP GUI Shortcut má v této části svou vlastní podsekci, můžete tam přidat parametr řetězce URL protokolu s prázdnou hodnotou:

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

Tento protokol se spustí sapgui.exe s parametrem /ZKRATKA, což je přesně to, co potřebujeme:

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

No, nebo pokud chceme vytvořit zcela libovolný protokol (např. sapshcut), pak jej můžete zaregistrovat pomocí následujícího souboru 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""

Nyní, když uděláme odkaz na webovou stránku označující protokol Sapgui.Shortcut.File Podobným způsobem:

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

Měli bychom vidět okno jako toto:

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

A všechno vypadá skvěle, ale když kliknete na tlačítko „Povolit“, uvidíme:

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

Jejda, prohlížeč změnil mezerník na %20. No a další znaky budou také zakódovány do vlastního číselného kódu se symbolem procenta. A nejnepříjemnější je, že se zde na úrovni prohlížeče nedá nic dělat (zde vše probíhá podle standardu) – prohlížeč takové znaky nemá rád a interpret příkazů Windows s takto zakódovanými hodnotami nepracuje. A ještě jedno mínus - celý řetězec je předán jako parametr, včetně názvu protokolu a dokonce i dvojtečky (sapgui.shortcut.file:). Navíc, i když stejně sapshcut.exe může zahodit vše, co pro něj není parametrem (začíná symbolem „-“, dále názvem, „=“ a hodnotou), tzn. řádek jako "sapgui.shortcut.file: -system=SID"bude to stále fungovat, pak bez mezery"sapgui.shortcut.file:-system=SID"už nefunguje.

Ukazuje se, že v zásadě existují dvě možnosti použití protokolu URI:

  1. Použití bez parametrů: Vytváříme celou řadu protokolů pro všechny naše systémy tohoto typu SIDMANDT, jako AAA200, BBB200 a tak dále. Pokud potřebujete pouze spustit požadovaný systém, pak je tato možnost docela funkční, ale v našem případě není vhodná, protože byste chtěli alespoň přenést uživatelské přihlášení, ale nelze to tímto způsobem provést.
  2. Volání pomocí programu wrapper sapshcut.exe nebo sapgui.exe. Podstata tohoto programu je jednoduchá – musí vzít řetězec, který mu prohlížeč předá přes webový protokol, a převést jej na reprezentaci, kterou přijímá Windows, tzn. převede všechny kódy znaků zpět na znaky (možná i analyzuje řetězec podle parametrů) a již volá SAP GUI se zaručeně správným příkazem. V našem případě to také není úplně vhodné (proto jsem to ani nepsal), protože nám nestačí přidat protokol na všechna uživatelská PC (v rámci domény je to stále v pořádku, i když je také lepší vyhněte se této praxi), ale zde budeme potřebovat více umístit program na PC a také neustále zajistit, aby nezmizel při přeinstalaci softwaru na PC.

Tito. Tuto možnost také zavrhujeme jako pro nás nevhodnou.

V tuto chvíli jsem už začínal uvažovat o tom, že se budu muset rozloučit s myšlenkou spouštět SAP GUI s potřebnými parametry z prohlížeče, ale pak mě napadlo, že v SAP Logon můžete udělat zástupce a zkopírujte na plochu. Tuto metodu jsem použil jednou, ale předtím jsem se konkrétně nedíval na soubor zástupce. A ukázalo se, že tato zkratka je běžný textový soubor s příponou .míza. A pokud jej spustíte ve Windows, SAP GUI se spustí s parametry, které jsou uvedeny v tomto souboru. "Bingo!"

Formát tohoto souboru je přibližně následující (může být také spuštěna transakce při spuštění, ale vynechal jsem ji):

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

Zdá se, že vše, co je potřeba: systémový identifikátor, klient, uživatelské jméno a dokonce i heslo. A ještě další parametry: Titul - název okna, Velikost GuiSize — velikost běžícího okna (celá obrazovka nebo ne) a Opakované použití — zda je nutné otevřít nové okno nebo použít již otevřené se stejným systémem. Ale okamžitě se objevila nuance - ukázalo se, že heslo v SAP Logon nelze nastavit, linka byla zablokována. Ukázalo se, že to bylo provedeno z bezpečnostních důvodů: ukládá všechny zástupce vytvořené v SAP Logon do souboru sapshortcut.ini (U saplogon.ini v uživatelském profilu Windows) a tam, přestože jsou zašifrovány, nejsou šifrovány příliš silně a na přání je lze dešifrovat. To však můžete vyřešit změnou hodnoty jednoho parametru v registru (výchozí hodnota je 0):

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

Tím se odemkne pole Heslo pro zadání ve formuláři pro vytvoření zástupce v SAP Logon:

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

A když do tohoto pole zadáte heslo, bude umístěno na odpovídající řádek
sapshortcut.ini, ale když přetáhnete zástupce na plochu, tak se tam nezobrazí - ale můžete si ho tam přidat ručně. Heslo je zašifrované, pro 111111 bude následující: PW_49B02219D1F6, pro 222222 - PW_4AB3211AD2F5. Nás ale spíše zajímá, že toto heslo je zašifrováno jedním způsobem nezávisle na konkrétním PC a pokud heslo resetujeme na výchozí, tak můžeme v tomto poli použít jednu předem známou hodnotu. Pokud chceme použít náhodně vytvořené heslo, budeme muset porozumět algoritmu této šifry. Ale soudě podle uvedených příkladů to nebude těžké. Mimochodem, v SAP GUI 7.40 toto pole z formuláře úplně zmizelo, ale správně přijímá soubor s vyplněným heslem.

To znamená, že se ukáže, že v prohlížeči stačí kliknout na odkaz na soubor s příponou .sap a požadovaným formátem - a nabídne jej otevřít jako soubor jako SAP GUI Shortcut (samozřejmě na PC s nainstalovaným SAP GUI) a otevře okno SAP GUI se zadanými parametry (pokud jsou SID a klientský pár v seznamu SAP Logon na tomto PC).

Ale je jasné, že nikdo nebude jednoduše vytvářet soubory předem a ukládat je na web - musí být generovány na základě potřebných parametrů. Můžete například vytvořit skript PHP pro generování zkratek (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";
?>

Pokud nezadáte uživatelské jméno a heslo, zobrazí se následující okno s dotazem na přihlašovací jméno a heslo:

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

Pokud předáte pouze přihlášení, pole pro přihlášení bude vyplněno a pole pro heslo bude prázdné. Pokud uživateli dáme přihlašovací jméno i heslo, ale uživatel na PC má klíč EnablePassword v registru v sekci [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] nastavený na 0, dostaneme to samé. A pouze v případě, že je tento klíč nastaven na 1 a předáme jak jméno, tak počáteční heslo, systém vás hned dvakrát vyzve k zadání nového trvalého hesla. To jsme potřebovali získat.

V důsledku toho máme následující sadu zvažovaných možností jako ilustraci všech výše uvedený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žnost mi vyhovovala. Místo generování SAP zkratek ale můžete využít například i generování CMD souborů, které vám po otevření z prohlížeče otevře i okno SAP GUI. Níže je uveden příklad (sapguicmd.php) přímo spusťte SAP GUI s úplným připojovacím řetězcem, aniž byste museli konfigurovat 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: www.habr.com

Přidat komentář