Pokretanje SAP GUI iz pretraživača

Ovaj članak sam prvi napisao u svom blog, da kasnije ne tražim i pamtim ponovo, ali pošto niko ne čita blog, htio sam podijeliti ovu informaciju sa svima, ako nekome bude od koristi.

Dok smo radili na ideji usluge resetovanja lozinke u SAP R/3 sistemima, postavilo se pitanje - kako pokrenuti SAP GUI sa potrebnim parametrima iz pretraživača? Budući da je ova ideja podrazumijevala korištenje web servisa, prvo se odgovori na SOAP zahtjev iz SAP GUI-a i pošalje pismo sa linkom na web stranicu sa skriptom za resetiranje lozinke na početnu, a zatim prikaz korisniku poruku o uspješnom resetovanju lozinke i prikazu ove početne lozinke, onda bih želio da ova stranica također ima vezu za pokretanje SAP GUI. Štaviše, ova veza bi trebala otvoriti željeni sistem i, po mogućnosti, sa popunjenim poljima za prijavu i lozinku odjednom: korisnik bi samo dva puta trebao popuniti produktivnu lozinku.

Pokretanje SAP Logon-a nije bilo zanimljivo za našu svrhu, a prilikom pokretanja sapgui.exe nije bilo moguće navesti ime klijenta i korisnika, ali je bilo moguće pokrenuti sistem koji nije definiran u SAP Logonu. S druge strane, pokretanje SAP GUI-a sa proizvoljnim parametrima servera nije bilo posebno relevantno: ako rješavamo problem resetiranja korisničke lozinke, onda najvjerovatnije on već ima potrebnu liniju u SAP Logon-u, sa postavkama koje su mu potrebne, a tamo nema potrebe da se petlja sa svojim. No, navedene zahtjeve ispunila je tehnologija SAP GUI Shortcut i sam program sapshcut.exe, što je omogućilo pokretanje SAP GUI pomoću specifične „prečice“.

Rešavanje problema direktno: pokretanje sapshcut.exe direktno iz pretraživača 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 pretraživaču, što u organizaciji može biti zabranjeno na nivou domene, a čak i ako je dozvoljeno, pretraživač prikazuje prozor sa zastrašujućim upozorenje za korisnika:

Pokretanje SAP GUI iz pretraživača

Našao sam rješenje broj 2 na internetu: kreiranje vlastitog web protokola. Omogućava nam da pokrenemo aplikaciju koja nam je potrebna pomoću veze koja označava protokol, koji sami registrujemo u Windows-u u registru u odjeljku HKEY_CLASSES_ROOT. Budući da SAP GUI Shortcut ima svoj pododjeljak u ovom odjeljku, možete dodati parametar stringa URL protokola s praznom vrijednošću:

Pokretanje SAP GUI iz pretraživača

Ovaj protokol počinje sapgui.exe sa parametrom /SHORTCUT, a to je upravo ono što nam treba:

Pokretanje SAP GUI iz pretraživača

Pa, ili ako želimo napraviti potpuno proizvoljan protokol (npr. sapshcut), tada ga možete registrirati koristeći sljedeći reg fajl:

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 pretraživača

I sve izgleda super, ali kada kliknete na dugme “Dozvoli” vidimo:

Pokretanje SAP GUI iz pretraživača

Ups, pretraživač je pretvorio razmaknicu u %20. Pa, drugi znakovi će također biti kodirani u vlastiti numerički kod sa simbolom procenta. A najneugodnije je to što se ovdje ništa ne može učiniti na razini pretraživača (ovdje se sve radi po standardu) - pretraživač ne voli takve znakove, a tumač Windows komandi ne radi sa 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:). Štaviše, iako isto sapshcut.exe može odbaciti sve što za njega nije parametar (počinje simbolom “-“, zatim imenom, “=” i vrijednošću), tj. red kao "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 principu, postoje dvije opcije za korištenje URI protokola:

  1. Korišćenje bez parametara: Kreiramo čitav niz protokola za sve naše sisteme ovog tipa SIDMANDT, kao AAA200, BBB200 i tako dalje. Ako samo trebate pokrenuti željeni sistem, onda je opcija prilično 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šćenje programa omotača za pozivanje sapshcut.exe ili sapgui.exe. Suština ovog programa je jednostavna - on mora uzeti string koji mu pretraživač prenosi putem web protokola i pretvoriti ga u reprezentaciju koju Windows prima, tj. pretvara sve znakovne kodove natrag u znakove (možda čak analizira string prema parametrima) i već poziva SAP GUI sa zajamčeno ispravnom komandom. U našem slučaju, takođe nije sasvim prikladan (zato ga nisam ni napisao), jer nije dovoljno da dodamo protokol na svim korisničkim računarima (unutar domena ovo je i dalje u redu, mada je i bolje da izbegavajte ovu praksu), ali ovde će nam trebati više postavljanja programa na računar, a takođe i stalno osigurati da ne nestane kada se softver ponovo instalira na računar.

One. Ovu opciju također odbacujemo kao neprikladnu za nas.

U ovom trenutku već sam počeo da razmišljam da bih morao da se oprostim od ideje da pokrenem SAP GUI sa potrebnim parametrima iz pretraživača, ali onda mi je pala na pamet ideja da možete napraviti prečicu u SAP Logon i kopirajte ga na radnu površinu. Koristio sam ovu metodu jednom, ali prije toga nisam posebno gledao datoteku prečice. I pokazalo se da je ova prečica obična tekstualna datoteka s ekstenzijom .sap. A ako ga pokrenete na Windows-u, SAP GUI će se pokrenuti s parametrima navedenim u ovoj datoteci. "Bingo!"

Format ove datoteke je otprilike sljedeći (možda postoji i transakcija pokrenuta pri pokretanju, ali 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 sistema, klijent, korisničko ime, pa čak i lozinka. Pa čak i dodatni parametri: Naslov - naslov prozora, GuiSize — veličina pokrenutog prozora (celi ekran ili ne) i Ponovna upotreba — da li je potrebno otvoriti novi prozor ili koristiti već otvoren sa istim sistemom. Ali odmah se pojavila nijansa - ispostavilo se da se lozinka u SAP Logonu ne može postaviti, linija je blokirana. Ispostavilo se da je to učinjeno iz sigurnosnih razloga: sve prečice kreirane u SAP Logon-u pohranjuje u datoteku sapshortcut.ini (Blizu saplogon.ini u Windows korisničkom profilu) i tamo, iako su šifrirani, nisu previše jako šifrirani i po želji se mogu dešifrirati. Ali ovo možete riješiti promjenom vrijednosti jednog parametra u registratoru (podrazumevana vrijednost je 0):

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

Ovo otključava polje Lozinka za unos na obrascu za kreiranje prečice u SAP Logon:

Pokretanje SAP GUI iz pretraživača

A kada unesete lozinku u ovo polje, ona će biti postavljena u odgovarajući red
sapshortcut.ini, ali kada prevučete prečicu na radnu površinu, ona se tamo ne pojavljuje - ali možete je dodati tamo ručno. Lozinka je šifrovana, za 111111 će biti sljedeća: PW_49B02219D1F6, za 222222 - PW_4AB3211AD2F5. Ali više nas zanima činjenica da je ova lozinka šifrirana na jedan način, neovisno o konkretnom PC-u, a ako lozinku resetujemo 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. Inače, u SAP GUI 7.40 ovo polje je potpuno nestalo iz obrasca, ali ispravno prihvata datoteku sa popunjenom lozinkom.

Odnosno, ispostavilo se da u pretraživaču samo trebate kliknuti na vezu do datoteke sa ekstenzijom .sap i željenim formatom - i on će ponuditi da je otvorite kao datoteku poput SAP GUI Shortcut (prirodno na PC-u sa instaliranim SAP GUI) i otvoriće prozor SAP GUI sa navedenim parametrima (ako se SID i klijentski par nalaze na SAP listi za prijavu na ovom računaru).

Ali, jasno je da niko neće jednostavno kreirati fajlove unapred i pohraniti ih na sajt - oni moraju biti generisani na osnovu potrebnih parametara. Na primjer, možete kreirati PHP skriptu za generiranje prečica (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, pojavit će se sljedeći prozor u kojem će se tražiti login i lozinka:

Pokretanje SAP GUI iz pretraživača

Ako prođete samo prijavu, polje za prijavu će biti popunjeno, a polje za lozinku će biti prazno. Ako korisniku damo i login i lozinku, ali korisnik na PC-u ima ključ EnablePassword u registru u odjeljku [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] postavljen na 0, onda ćemo dobiti istu stvar. I samo ako je ovaj ključ postavljen na 1 i prosledimo i ime i početnu lozinku, sistem će odmah zatražiti da unesete novu trajnu lozinku dva puta. To je ono što smo trebali dobiti.

Kao rezultat, imamo sljedeći skup razmatranih opcija kao ilustraciju svega gore 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>

Poslednja opcija mi je odgovarala. Ali umjesto generiranja SAP prečica, možete koristiti i, na primjer, generiranje CMD datoteka, koje će, kada se otvore iz pretraživača, otvoriti i SAP GUI prozor za vas. Ispod je primjer (sapguicmd.php) direktno pokrenite SAP GUI s punim nizom veze, bez potrebe za konfiguracijom SAP prijave:

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