Ovaj članak sam prvi napisao u svom , 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:

Našao sam rješenje broj 2 na internetu: Omogućava nam pokretanje aplikacije koja nam je potrebna pomoću linka koji navodi protokol u kojem se registrujemo Windows U registru, pod HKEY_CLASSES_ROOT. Budući da SAP GUI Shortcut ima svoj podključ u ovom odjeljku, možete dodati parametar stringa URL Protocol s praznom vrijednošću:

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

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:

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

Ups, preglednik je pretvorio razmak u %20. I drugi znakovi će također biti kodirani u vlastiti numerički kod sa znakom procenta. A najgore od svega je što se ništa ne može učiniti po tom pitanju na nivou preglednika (ovdje je sve standardno) - preglednik ne voli takve znakove, a ni interpreter komandi. Windows ne radi s tako kodiranim vrijednostima. Još jedan nedostatak je što se cijeli niz znakova prenosi 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:
- 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.
- Korišćenje programa omotača za pozivanje sapshcut.exe ili sapgui.exeSuština ovog programa je jednostavna - on treba da uzme string koji mu preglednik šalje putem web protokola i pretvori ga u reprezentaciju koja je prihvaćena. Windows, tj. pretvara sve kodove znakova nazad u znakove (možda čak i parsira niz po parametrima), a zatim poziva SAP GUI sa naredbom za koju se garantuje da je tačna. Ovo nije u potpunosti prikladno za naš slučaj (zbog čega se nisam ni trudio da to napišem), jer dodavanje protokola svim korisničkim računarima nije dovoljno (još uvijek je u redu unutar domene, iako je najbolje izbjegavati ovu praksu). Također ćemo morati instalirati program na računar i stalno ga pratiti kako bismo osigurali da ostane na mjestu prilikom ponovne instalacije softvera na računaru.
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 .sapA ako ga pokrenete Windows — 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 v profil korisnika Windows) i iako su tamo šifrirani, nisu previše šifrirani i mogu se dešifrirati ako to zaista želite. Ali ovo možete riješiti i 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 Lozinka za unos na obrascu za kreiranje prečice u SAP Logon:

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:

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
