Zagon SAP GUI iz brskalnika

Ta članek sem prvič napisal v svojem blog, da ne bi kasneje spet iskal in se spominjal, ker pa bloga nihče ne bere, sem želel to informacijo deliti z vsemi, če se bo komu zdelo koristno.

Med delom na ideji o storitvi ponastavitve gesla v sistemih SAP R/3 se je pojavilo vprašanje - kako zagnati SAP GUI s potrebnimi parametri iz brskalnika? Ker je ta zamisel pomenila uporabo spletne storitve, ki je najprej odgovorila na zahtevo SOAP iz SAP GUI in poslala pismo s povezavo do spletne strani s skriptom za ponastavitev gesla na začetno, nato pa prikazala uporabniku sporočilo o uspešni ponastavitvi gesla in prikaz tega začetnega gesla, potem želim, da ima ta stran tudi povezavo za zagon SAP GUI. Poleg tega bi morala ta povezava odpreti želeni sistem in po možnosti z istočasno izpolnjenimi polji za prijavo in geslo: uporabnik bi moral samo dvakrat izpolniti produktivno geslo.

Zagon SAP Logon za naš namen ni bil zanimiv, pri izvajanju sapgui.exe pa ni bilo mogoče določiti odjemalca in uporabniškega imena, vendar je bilo mogoče zagnati sistem, ki ni definiran v SAP Logon. Po drugi strani pa zagon SAP GUI s poljubnimi parametri strežnika ni bil posebno pomemben: če rešujemo problem ponastavitve uporabniškega gesla, potem najverjetneje že ima potrebno vrstico v SAP Logon z nastavitvami, ki jih potrebuje, in tam ni potrebe, da bi se zapletal s svojim. Toda navedenim zahtevam sta izpolnila tehnologija SAP GUI Shortcut in sam program sapshcut.exe, ki je omogočil zagon SAP GUI z uporabo posebne »bližnjice«.

Neposredno reševanje težave: zagon sapshcut.exe neposredno iz brskalnika z uporabo predmeta 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');
}

Rešitev je slaba: prvič, deluje samo v Internet Explorerju, drugič, zahteva ustrezne varnostne nastavitve v brskalniku, kar je v organizaciji lahko prepovedano na ravni domene, in tudi če je dovoljeno, brskalnik prikaže okno s strašljivim opozorilo uporabniku:

Zagon SAP GUI iz brskalnika

Na internetu sem našel rešitev #2: ustvarjanje lastnega spletnega protokola. Omogoča zagon aplikacije, ki jo potrebujemo, s povezavo, ki označuje protokol, ki ga sami registriramo v sistemu Windows v registru v razdelku HKEY_CLASSES_ROOT. Ker ima Bližnjica GUI SAP v tem razdelku svoj podrazdelek, lahko tam dodate parameter niza protokola URL s prazno vrednostjo:

Zagon SAP GUI iz brskalnika

Ta protokol se začne sapgui.exe s parametrom /BLIŽNJIC, kar potrebujemo:

Zagon SAP GUI iz brskalnika

No, ali če želimo narediti povsem poljuben protokol (npr. sapshcut), potem ga lahko registrirate z naslednjo reg datoteko:

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

Zdaj, če naredimo povezavo na spletni strani, ki označuje protokol Sapgui.Shortcut.File Na podoben način:

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

Videti bi morali takšno okno:

Zagon SAP GUI iz brskalnika

In vse se zdi super, a ko kliknete gumb »Dovoli«, vidimo:

Zagon SAP GUI iz brskalnika

Ups, brskalnik je preslednico spremenil v %20. No, tudi drugi znaki bodo kodirani v lastno številsko kodo s simbolom za odstotek. In najbolj neprijetna stvar je, da tukaj ni mogoče storiti ničesar na ravni brskalnika (tukaj je vse narejeno po standardu) - brskalnik ne mara takšnih znakov in ukazni tolmač Windows ne deluje s tako kodiranimi vrednostmi. In še en minus - kot parameter se posreduje celoten niz, vključno z imenom protokola in celo dvopičjem (sapgui.shortcut.file:). Še več, čeprav enako sapshcut.exe lahko zavrže vse, kar zanj ni parameter (začne se s simbolom »-«, nato ime, »=« in vrednost), tj. vrstica kot "sapgui.shortcut.file: -system=SID"še vedno bo delovalo, potem pa brez presledka"sapgui.shortcut.file:-system=SID"ne deluje več.

Izkazalo se je, da načeloma obstajata dve možnosti za uporabo protokola URI:

  1. Uporaba brez parametrov: Ustvarimo cel kup protokolov za vse naše sisteme te vrste SIDMANDT, kot AAA200, BBB200 in tako naprej. Če morate samo zagnati želeni sistem, potem je možnost precej izvedljiva, vendar v našem primeru ni primerna, saj bi radi vsaj prenesli uporabniško prijavo, vendar tega ni mogoče storiti na ta način.
  2. Uporaba ovojnega programa za klic sapshcut.exe ali sapgui.exe. Bistvo tega programa je preprosto - vzeti mora niz, ki mu ga brskalnik posreduje prek spletnega protokola, in ga spremeniti v predstavitev, ki jo sprejme Windows, tj. spremeni vse znakovne kode nazaj v znake (morda celo razčleni niz glede na parametre) in že kliče SAP GUI z zajamčeno pravilnim ukazom. V našem primeru tudi ni povsem primeren (zato tega niti nisem napisal), ker ni dovolj, da dodamo protokol na vse uporabniške računalnike (znotraj domene je to še vedno v redu, čeprav je tudi bolje, da izogibajte se tej praksi), vendar bomo tukaj potrebovali več prostora za program v računalniku in nenehno zagotavljanje, da ne izgine, ko programsko opremo znova namestite v računalnik.

Tisti. Tudi to možnost zavržemo kot neprimerno za nas.

Na tej točki sem že začel razmišljati, da se bom moral posloviti od ideje o zagonu SAP GUI s potrebnimi parametri iz brskalnika, potem pa se mi je porodila ideja, da lahko naredite bližnjico v SAP Logon in kopirajte na namizje. To metodo sem uporabil enkrat, vendar pred tem nisem posebej pogledal datoteke bližnjice. In izkazalo se je, da je ta bližnjica običajna besedilna datoteka s pripono .sap. In če ga zaženete v sistemu Windows, se bo SAP GUI zagnal s parametri, ki so navedeni v tej datoteki. "Bingo!"

Format te datoteke je približno naslednji (lahko se ob zagonu sproži tudi transakcija, vendar sem jo izpustil):

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

Zdi se, da vse, kar je potrebno: sistemski identifikator, odjemalec, uporabniško ime in celo geslo. In celo dodatni parametri: Naslov - naslov okna, GuiSize — velikost tekočega okna (cel zaslon ali ne) in Ponovna uporaba — ali je treba odpreti novo okno ali uporabiti že odprto z istim sistemom. Toda takoj se je pojavila niansa - izkazalo se je, da gesla v SAP Logon ni bilo mogoče nastaviti, linija je bila blokirana. Izkazalo se je, da je bilo to storjeno iz varnostnih razlogov: vse bližnjice, ustvarjene v SAP Logon, shrani v datoteko sapshortcut.ini (V bližini saplogon.ini v uporabniškem profilu Windows) in tam, čeprav so šifrirani, niso premočno šifrirani in jih je po želji mogoče dešifrirati. Toda to lahko rešite tako, da spremenite vrednost enega parametra v registru (privzeta vrednost je 0):

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

To odklene polje Geslo za vnos v obrazec za ustvarjanje bližnjice v SAP Logon:

Zagon SAP GUI iz brskalnika

In ko vnesete geslo v to polje, bo postavljeno v ustrezno vrstico
sapshortcut.ini, a ko povlečete bližnjico na namizje, se tam ne prikaže - lahko pa jo tja dodate ročno. Geslo je šifrirano, za 111111 bo naslednje: PW_49B02219D1F6, za 222222 - PW_4AB3211AD2F5. Nas pa bolj zanima, da je to geslo šifrirano na en način, neodvisno od konkretnega računalnika, in če geslo ponastavimo na začetno, potem lahko v tem polju uporabimo eno vnaprej znano vrednost. No, če želimo uporabiti naključno ustvarjeno geslo, bomo morali razumeti algoritem te šifre. Toda sodeč po navedenih primerih to ne bo težko storiti. Mimogrede, v SAP GUI 7.40 je to polje popolnoma izginilo iz obrazca, vendar pravilno sprejme datoteko z izpolnjenim geslom.

To pomeni, da se izkaže, da morate v brskalniku samo klikniti povezavo do datoteke s pripono .sap in želeno obliko - in ponudil bo, da jo odprete kot datoteko tipa SAP GUI Shortcut (seveda na računalnik z nameščenim SAP GUI) in bo odprl okno SAP GUI z navedenimi parametri (če sta par SID in odjemalca na seznamu SAP Logon na tem računalniku).

Vendar je jasno, da nihče ne bo preprosto ustvaril datotek vnaprej in jih shranil na spletno mesto - generirati jih je treba na podlagi potrebnih parametrov. Ustvarite lahko na primer skript PHP za ustvarjanje bližnjic (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";
?>

Če ne vnesete uporabniškega imena in gesla, se prikaže naslednje okno, v katerem boste morali vnesti prijavo in geslo:

Zagon SAP GUI iz brskalnika

Če posredujete samo prijavo, bo polje za prijavo izpolnjeno, polje za geslo pa prazno. Če uporabniku damo prijavo in geslo, vendar ima uporabnik na osebnem računalniku ključ EnablePassword v registru v razdelku [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] nastavljen na 0, potem dobimo isto. In samo če je ta ključ nastavljen na 1 in posredujemo ime in začetno geslo, vas bo sistem takoj pozval, da dvakrat vnesete novo trajno geslo. To smo morali dobiti.

Posledično imamo naslednji niz obravnavanih možnosti kot ponazoritev vsega zgoraj navedenega:

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

Zadnja možnost mi je ustrezala. Toda namesto generiranja bližnjic SAP lahko uporabite tudi na primer generiranje datotek CMD, ki vam ob odprtju iz brskalnika odprejo tudi okno SAP GUI. Spodaj je primer (sapguicmd.php) neposredno zažene SAP GUI s celotnim povezovalnim nizom, ne da bi bilo treba konfigurirati 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";
?>

Vir: www.habr.com

Dodaj komentar