Pokretanje SAP GUI iz preglednika

Prvo sam napisao ovaj članak u svom blog, da ne bih kasnije opet tražila i prisjećala se, ali pošto nitko ne čita blog, htjela sam sa svima podijeliti ovu informaciju, ako nekome bude od koristi.

Dok smo radili na ideji usluge resetiranja lozinke u SAP R/3 sustavima, postavilo se pitanje - kako pokrenuti SAP GUI s potrebnim parametrima iz preglednika? Budući da je ova ideja podrazumijevala korištenje web servisa, prvo odgovaranje na SOAP zahtjev iz SAP GUI i slanje pisma s poveznicom na web stranicu sa skriptom za resetiranje lozinke na početnu, a zatim prikazivanje korisniku poruka o uspješnom poništavanju lozinke i prikaz ove početne lozinke, tada bih želio da ova stranica ima i vezu za pokretanje SAP GUI-ja. Štoviše, ova bi poveznica trebala otvoriti željeni sustav, i to po mogućnosti s odjednom ispunjenim poljima za prijavu i lozinku: korisnik bi samo dvaput trebao ispuniti produktivnu lozinku.

Pokretanje SAP Logona nije nam bilo zanimljivo, a prilikom pokretanja sapgui.exe nije bilo moguće navesti klijenta i korisničko ime, ali je bilo moguće pokrenuti sustav koji nije definiran u SAP Logonu. S druge strane, pokretanje SAP GUI-ja s proizvoljnim parametrima poslužitelja nije bilo osobito relevantno: ako rješavamo problem poništavanja korisničke lozinke, tada najvjerojatnije on već ima potrebnu liniju u SAP Logonu, s postavkama koje su mu potrebne, i tamo nema potrebe petljati se sa svojima. No navedene zahtjeve zadovoljila je tehnologija SAP GUI Shortcut i sam program sapshcut.exe, koji je omogućio pokretanje SAP GUI-a korištenjem specifičnog "prečaca".

Rješavanje problema izravno: pokretanje sapshcut.exe izravno iz preglednika pomoću ActiveX objekta:

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');
}

Rješenje je loše: prvo, radi samo u Internet Exploreru, drugo, zahtijeva odgovarajuće sigurnosne postavke u pregledniku, što u organizaciji može biti zabranjeno na razini domene, a čak i ako je dopušteno, preglednik prikazuje prozor sa zastrašujućim upozorenje korisniku:

Pokretanje SAP GUI iz preglednika

Našao sam rješenje #2 na internetu: stvaranje vlastitog web protokola. Omogućuje nam pokretanje aplikacije koja nam je potrebna pomoću veze koja označava protokol, koji sami registriramo u sustavu Windows u registru u odjeljku HKEY_CLASSES_ROOT. Budući da SAP GUI Shortcut ima svoj pododjeljak u ovom odjeljku, tamo možete dodati parametar niza URL protokola s praznom vrijednošću:

Pokretanje SAP GUI iz preglednika

Ovaj protokol počinje sapgui.exe s parametrom /PREČICA, što je upravo ono što nam treba:

Pokretanje SAP GUI iz preglednika

Pa, ili ako želimo napraviti potpuno proizvoljan protokol (npr. sapshcut), tada ga možete registrirati pomoću sljedeće reg datoteke:

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

Sada, ako napravimo vezu na web stranici koja označava protokol Sapgui.Shortcut.File Na sličan način:

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

Trebali bismo vidjeti ovakav prozor:

Pokretanje SAP GUI iz preglednika

I sve izgleda super, ali kada kliknete na gumb "Dopusti", vidimo:

Pokretanje SAP GUI iz preglednika

Ups, preglednik je razmaknicu pretvorio u %20. Pa, drugi znakovi također će biti kodirani u vlastiti numerički kod sa simbolom postotka. A najneugodnija stvar je da se ovdje ništa ne može učiniti na razini preglednika (ovdje se sve radi prema standardu) - preglednik ne voli takve znakove, a tumač naredbi Windows ne radi s takvim kodiranim vrijednostima. I još jedan minus - cijeli niz se prosljeđuje kao parametar, uključujući naziv protokola, pa čak i dvotočku (sapgui.shortcut.file:). Štoviše, iako isto sapshcut.exe može odbaciti sve što mu nije parametar (počinje simbolom „-“, zatim imenom, „=“ i vrijednošću), tj. linija poput "sapgui.shortcut.file: -system=SID"i dalje će raditi, onda bez razmaka"sapgui.shortcut.file:-system=SID"više ne radi.

Ispostavilo se da u načelu postoje dvije opcije za korištenje URI protokola:

  1. Korištenje bez parametara: Stvaramo čitavu hrpu protokola za sve naše sustave te vrste SIDMANDT, Kao AAA200, BBB200 i tako dalje. Ako samo trebate pokrenuti željeni sustav, tada je opcija sasvim izvodljiva, ali u našem slučaju nije prikladna, jer biste barem željeli prenijeti korisničku prijavu, ali to se ne može učiniti na ovaj način.
  2. Korištenje programa omotača za poziv sapshcut.exe ili sapgui.exe. Bit ovog programa je jednostavna - mora uzeti string koji mu preglednik šalje putem web protokola i pretvoriti ga u reprezentaciju koju Windows prima, tj. pretvara sve kodove znakova natrag u znakove (možda čak analizira niz prema parametrima) i već poziva SAP GUI sa zajamčeno ispravnom naredbom. U našem slučaju također nije sasvim prikladan (zato ga nisam ni napisao), jer nam nije dovoljno dodati protokol na sva korisnička računala (unutar domene je to još uvijek u redu, iako je i bolje izbjegavajte ovu praksu), ali ovdje ćemo trebati više postaviti program na računalo, a također stalno paziti da ne nestane kada se softver ponovno instalira na računalo.

Oni. Također odbacujemo ovu opciju kao neprikladnu za nas.

U ovom trenutku već sam počeo razmišljati da ću se morati oprostiti od ideje pokretanja SAP GUI-ja s potrebnim parametrima iz preglednika, ali onda mi je pala na pamet ideja da možete napraviti prečac u SAP Logon i kopirajte ga na radnu površinu. Jednom sam koristio ovu metodu, ali prije toga nisam posebno gledao datoteku prečaca. I pokazalo se da je ovaj prečac obična tekstualna datoteka s ekstenzijom .sap. A ako ga pokrenete u sustavu Windows, SAP GUI će se pokrenuti s parametrima koji su navedeni u ovoj datoteci. "Bingo!"

Format ove datoteke je otprilike sljedeći (možda postoji i transakcija pokrenuta pri pokretanju, ali ja sam je izostavio):

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

Čini se da sve što je potrebno: identifikator sustava, klijent, korisničko ime, pa čak i lozinka. Čak i dodatni parametri: Označite - naslov prozora, GuiSize — veličina tekućeg prozora (puni zaslon ili ne) i ponovo upotrijebiti — je li potrebno otvoriti novi prozor ili koristiti već otvoreni s istim sustavom. Ali odmah se pojavila nijansa - pokazalo se da se lozinka u SAP Logonu ne može postaviti, linija je blokirana. Ispostavilo se da je to učinjeno iz sigurnosnih razloga: pohranjuje sve prečace stvorene u SAP Logonu u datoteku sapshortcut.ini (Blizu saplogon.ini u Windows korisničkom profilu) i tamo, iako su kriptirani, nisu prejako kriptirani i po želji se mogu dekriptirati. Ali to možete riješiti promjenom vrijednosti jednog parametra u registru (zadana vrijednost je 0):

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

Ovo otključava polje Password za unos na obrascu za kreiranje prečaca u SAP Logonu:

Pokretanje SAP GUI iz preglednika

A kada unesete lozinku u ovo polje, ona će biti smještena u odgovarajuću liniju
sapshortcut.ini, ali kada povučete prečac na radnu površinu, on se tamo ne pojavljuje - ali ga tamo možete dodati ručno. Lozinka je šifrirana, za 111111 bit će sljedeća: PW_49B02219D1F6, za 222222 - PW_4AB3211AD2F5. Ali nas više zanima činjenica da je ta lozinka šifrirana na jedan način, neovisno o konkretnom PC-u, a ako vratimo lozinku na početnu, onda možemo koristiti jednu unaprijed poznatu vrijednost u ovom polju. Pa, ako želimo koristiti nasumično kreiranu lozinku, morat ćemo razumjeti algoritam ove šifre. No, sudeći prema navedenim primjerima, to neće biti teško učiniti. Usput, u SAP GUI 7.40 ovo polje je potpuno nestalo iz forme, ali ispravno prihvaća datoteku s ispunjenom lozinkom.

Odnosno, ispada da u pregledniku samo trebate kliknuti vezu na datoteku s ekstenzijom .sap i željenim formatom - i on će ponuditi da je otvorite kao datoteku poput SAP GUI prečaca (naravno na računalu s instaliranim SAP GUI) i otvorit će SAP GUI prozor s navedenim parametrima (ako su SID i par klijenta na SAP listi za prijavu na ovom računalu).

No, jasno je da nitko neće jednostavno unaprijed izraditi datoteke i pohraniti ih na web mjesto - moraju se generirati na temelju potrebnih parametara. Na primjer, možete izraditi PHP skriptu za generiranje prečaca (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";
?>

Ako ne navedete korisničko ime i lozinku, dobit ćete sljedeći prozor u kojem se traže prijava i lozinka:

Pokretanje SAP GUI iz preglednika

Ako unesete samo prijavu, polje za prijavu bit će ispunjeno, a polje za lozinku prazno. Ako korisniku damo i prijavu i lozinku, ali korisnik na računalu ima ključ EnablePassword u registru u odjeljku [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] postavljen na 0, tada dobivamo istu stvar. I samo ako je ovaj ključ postavljen na 1 i proslijeđujemo i ime i početnu lozinku, sustav će odmah od vas tražiti da dva puta unesete novu trajnu lozinku. To je ono što smo trebali dobiti.

Kao rezultat toga, imamo sljedeći skup razmatranih opcija kao ilustraciju svega navedenog:

<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 opcija mi je odgovarala. Ali umjesto generiranja SAP prečaca, također možete koristiti, na primjer, generiranje CMD datoteka, koje će vam, kada se otvore iz preglednika, otvoriti i SAP GUI prozor. Ispod je primjer (sapguicmd.php) izravno pokrenite SAP GUI s punim nizom veze, bez potrebe da imate konfiguriran 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";
?>

Izvor: www.habr.com

Dodajte komentar