Ky artikull unë e shkrova fillimisht për veten time , që më vonë të mos e kërkoj përsëri dhe të mos e kujtoj, por duke qenë se askush nuk e lexon blogun, më erdhi dëshira ta ndaja këtë informacion me të gjithë, ndoshta do t'i vijë në ndihmë dikujt.
Gjatë punës mbi idenë e shërbimit për rikuperimin e fjalëkalimeve në sistemet SAP R/3, lindëm pyetjen - si ta nisnim SAP GUI me parametrat e nevojshëm nga shfletuesi? Duke qenë se kjo ide parashikonte përdorimin e një shërbimi web, i cili do të gjeneronte një kërkesë SOAP nga SAP GUI dhe do të dërgonte një email me lidhjen në faqen e internetit me skriptin për rikuperimin e fjalëkalimit në fillim, pastaj të shfaqej një mesazh për përdoruesin për rikuperimin e suksesshëm të fjalëkalimit dhe shfaqjen e këtij fjalëkalimi fillestar, dëshiroja që në këtë faqe të ishte gjithashtu një lidhje për fillimin e SAP GUI. Megjithatë, kjo lidhje duhej të hapte sistemin e duhur, dhe, idealisht, me fushat e përdoruesit dhe fjalëkalimit të plota: për përdoruesin do të mbetej vetëm të plotësonte fjalëkalimin produktiv dy herë.
Fillimi i SAP Logon - për qëllimin tonë nuk ishte interesant, dhe kur hapja sapgui.exe, nuk mund të specifikoja mandantin dhe emrin e përdoruesit, përkundrazi mund të filloja sistemin që nuk ishte i përcaktuar në SAP Logon. Nga ana tjetër, nisja e SAP GUI me parametra të rastit të serverit nuk ishte shumë e rëndësishme: nëse ne po zgjidhnim detyrën e rikuperimit të fjalëkalimit të përdoruesit, ka shumë mundësi që ai të ketë rreshtin e nevojshëm në SAP Logon, me cilësimet e tij, dhe nuk është e nevojshme të hyjmë me të gjitha tonat. Megjithatë, teknologjia SAP GUI Shortcut dhe vetë programma sapshcut.exe i plotësonin kërkesat e përcaktuara, që lejonte nisjen e SAP GUI duke përdorur një "shkurtore" të caktuar.
Zgjidhja e problemit direkt: nisja e sapshcut.exe direkt nga shfletuesi me ndihmën e objektit 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');
}
Zgjidhja është e dobët: së pari, punon vetëm në Internet Explorer, së dyti, kërkon cilësime të veçanta të sigurisë në shfletues, të cilat në organizatë mund të jenë të ndaluara në nivelin e domainit, dhe madje nëse janë të lejuara, shfletuesi i jep përdoruesit një dritare me një paralajmërim frikësues:

Zgjidhja â2 e gjeta nĂ« internet: . Lejon lejon ecia appletin ton permeson me linqe dhen ndryshimin e protokollit, i cili regjistrohet ne Windows ne regjistrin e seksionit HKEY_CLASSES_ROOT. Duke qene se SAP GUI Shortcut ka nje seksion te vetin ne kete departament, mund te shtojme parametrin e vargut URL Protocol me vlerĂ« tĂ« zbrazĂ«t:

Ky protokoll nis sapgui.exe me parametrin /SHORTCUT, që është çka na nevojitet:

Ose nëse duam të bëjmë një protokoll krejtësisht të rastësishëm (p.sh. sapshcut), atëherë mund ta regjistrojmë atë me anë të skedarit reg të mëposhtëm:
Redaktori i Regjistrit të Windows Versioni 5.00
[HKEY_CLASSES_ROOTsapshcut]
@="menaxheri i sapshcut"
"Protokolli i URL"=""
[HKEY_CLASSES_ROOTsapshcutDefaultIcon]
@="sapshcut.exe"
[HKEY_CLASSES_ROOTsapshcutshell]
[HKEY_CLASSES_ROOTsapshcutshellopen]
[HKEY_CLASSES_ROOTsapshcutshellopencommand]
@="sapshcut.exe "%1""
Tani, nëse në faqen tuaj të internetit bëjmë një lidhje duke specifikuar protokollin Sapgui.Shortcut.File në këtë mënyrë:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
na duhet të shfaqet dritarja e tipit:

Dhe duket krejt mirë, por kur klikojmë butonin 'Lejo' shohim:

Opa, shfletuesi e kthen hapësirën në . Po ashtu simbole të tjera do të kodohen në kodin e tyre numerik me simbolin e përqindjes. Dhe ajo që është më e pakëndshme është se nuk mund të bëni asgjë në nivelin e shfletuesit (gjithçka është bërë sipas standardit) - shfletuesi nuk i pëlqen këto simbole, dhe interpretoni komandave të Windows nuk funksionon me këto vlera të koduara. Një tjetër disavantazh është se si parametër dërgohet e gjithë stringu, duke përfshirë emrin e protokollit dhe madje edhe dy pika.sapgui.shortcut.file:). Edhe pse po ashtu sapshcut.exe tregon se hedh të gjitha ato që nuk janë parametra (fillon me simbolin '-' dhe pastaj emri, '=' dhe vlera), dmth, një varg i tillë "sapgui.shortcut.file: -system=SID" do të funksiononte, por pa hapësirë "sapgui.shortcut.file:-system=SID" tashmë nuk punon.
Kështu që, në parim, ka dy mundësi për përdorimin e protokollit URI:
- Përdorimi pa parametra: Krijojmë një shumë të protokolleve për të gjitha sistemet tona si SIDMANDT, siç është AAA200, BBB200 etj. Nëse thjesht duam të nisnim sistemin e nevojshëm, këtu është një variant i plotë, por në rastin tonë nuk funksionon, sepse së paku duam të kalojmë emrin e përdoruesit, dhe kjo nuk mund të bëhet kështu.
- PĂ«rdorimi i njĂ« programi-wrap pĂ«r thirrje sapshcut.exe ose sapgui.exeThe essence of this program is simple â it should take the string that is passed to it by the browser via the web protocol and convert it into the representation that Windows accepts, i.e., it converts all character codes back into characters (it may also break down the string into parameters) and then calls the SAP GUI with the correct command. In our case, this is not entirely suitable (which is why I didn't even try to write it), as it would not be enough to just add the protocol on all user PCs (within the domain itâs still somewhat acceptable, although itâs better to avoid such practices), but here it will also require placing an additional program on the PCs and constantly monitoring that it does not disappear during software reinstalls.
So, we also discard this option as unsuitable for us.
Here I was already starting to think that the idea of launching SAP GUI with the required parameters from the browser would have to be abandoned, but then the thought struck me that in SAP Logon you can create a shortcut and copy it to the desktop. I used this method once, but before that I hadnât looked at the shortcut file specifically. And it turned out that this shortcut is just a regular text file with the extension .sap. And if you launch it in Windows, SAP GUI will start with the parameters specified in this file. âBingo!â
The format of this file is approximately as follows (there may also be a starting transaction, but I omitted it):
[System]
Emri=SID
Klienti=200
[User]
Emri=
Gjuha=RU
Fjalëkalimi=
[Function]
Titulli=
[Configuration]
MadhësiaGui=Maksimizuar
[Options]
Ribashko=0
It seems everything necessary is there: the system identifier, the client, the username, and even the password. And even additional parameters: Title â the window title, GuiSize â the size of the opened window (full-screen or not), and Reuse â whether to necessarily open a new window or use an already opened one with the same system. But immediately a nuance appeared â it turned out that you cannot set the password in SAP Logon, the field was locked. It turned out this was done for security reasons: all shortcuts created in SAP Logon are stored in a file sapshortcut.ini (next to saplogon.ini in the Windows user profile) and although they are encrypted, it's not very strong and with a strong desire, they can be decoded. However, this can be allowed by changing the value of one parameter in the registry (by default the value 0):
Redaktori i Regjistrit të Windows Versioni 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
This will unlock the 'Password' field in the SAP Logon shortcut creation form:

Dhe nëse vendosni një fjalëkalim në këtë fushë, ajo do të vendoset në rreshtin përkatës
sapshortcut.ini, por kur tĂ«rhiqni ikonikĂ«n nĂ« desktop, ajo nuk shfaqet aty â megjithatĂ«, mund ta shtoni manualisht. FjalĂ«kalimi Ă«shtĂ« i koduar: pĂ«r 111111 do tĂ« duket si: PW_49B02219D1F6, pĂ«r 222222 â PW_4AB3211AD2F5. Por ne jemi mĂ« tĂ« interesuar pĂ«r ato qĂ« ky fjalĂ«kalim kodifikohet nĂ« njĂ« mĂ«nyrĂ« qĂ« nuk varet nga kompjuteri specifik dhe, nĂ«se do tĂ« rikthejmĂ« fjalĂ«kalimin nĂ« fillim, atĂ«herĂ« mund tĂ« pĂ«rdorim njĂ« vlerĂ« tĂ« njohur paraprakisht nĂ« kĂ«tĂ« fushĂ«. E nĂ«se dĂ«shirojmĂ« tĂ« pĂ«rdorim njĂ« fjalĂ«kalim tĂ« krijuar krijueshĂ«m, do tĂ« duhet tĂ« kuptojmĂ« algoritmin e kĂ«sa kodifikimi. MegjithatĂ«, prapa shembujve tĂ« dhĂ«nĂ«, kĂ«tĂ« do ta bĂ«jmĂ« lehtĂ«sisht. PĂ«r mĂ« tepĂ«r, nĂ« SAP GUI 7.40, kjo fushĂ« ka humbur krejt nga formulari, por skedari me fjalĂ«kalimin e plotĂ«suar e pranon siç duhet.
DomethĂ«nĂ«, mjafton tĂ« klikoni nĂ« lidhjen e skedarit me zgjerimin .sap dhe me formatin pĂ«rkatĂ«s nĂ« shfletues â dhe ai do tĂ« ofrojĂ« ta hapni atĂ« si njĂ« skedar tĂ« tipit SAP GUI Shortcut (natyrisht nĂ« kompjuterin me SAP GUI tĂ« instaluar) dhe do tĂ« hapĂ« dritaren SAP GUI me parametrat e specifikuar (nĂ«se çifti SID dhe mjet janĂ« nĂ« listĂ«n e SAP Logon nĂ« kĂ«tĂ« kompjuter).
Por, Ă«shtĂ« e qartĂ« se askush nuk do tĂ« krijojĂ« dhe ruajĂ« skedarĂ« paraprakisht nĂ« faqen e internetit â ato duhet tĂ« gjenerohen duke u bazuar nĂ« parametrat e nevojshĂ«m. PĂ«r shembull, mund tĂ« krijoni njĂ« skenar nĂ« PHP pĂ«r tĂ« gjeneruar ikona (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=Hyrje në sistemrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>
Nëse nuk caktoni një emër përdoruesi dhe një fjalëkalim, do të marrim dritaren e mëposhtme me kërkesën për emrin dhe fjalëkalimin:

Nëse përcjellim vetëm emrin e përdoruesit, fusha për emrin e përdoruesit do të mbushet, ndërsa fusha për fjalëkalimin do të mbetet e zbrazët. Nëse ne përcjellim si emrin e përdoruesit ashtu edhe fjalëkalimin, por çelësi EnablePassword në regjistrin e PC-së së përdoruesit në seksionin [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] është vendosur në 0, atëherë do të marrim të njëjtën gjë. Vetëm nëse ky çelës është vendosur në 1 dhe ne përcjellim si emrin ashtu edhe fjalëkalimin fillestar, sistemi do të kërkojë menjëherë të futet dy herë një fjalëkalim të ri të përhershëm. Kjo ishte e nevojshme të arrihej.
Si rezultat, kemi këtë grup mundësish të shqyrtuara si një ilustrim të gjithçkaje të thënë më parë:
<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', '');"/>Shembulli 1: Ekzekuto sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Shembulli 2: Hap sapshcut.exe (URI)</a><br>
<a href='/sq/sapshcut.php/?SID=SID&Client=200&User=test'>Shembulli 3: Hap skedarin .sap (Shkurtesa SAP GUI)</a><br>
</body>
</html>
Më pëlqeu opsioni i fundit. Por gjithashtu mund të përdorim, për shembull, gjenerimin e skedarëve CMD në vend të gjenerimit të ikonave SAP, të cilat gjithashtu, kur hapen nga shfletuesi, do t'ju hapin dritaren SAP GUI. Më poshtë është një shembull (sapguicmd.php) i ekzekutimit të drejtpërdrejtë të SAP GUI me përcaktimin e linjës së plotë të lidhjes, pa nevojën për të pasur një SAP Logon të konfiguruar:
<?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 Hyrja në ".$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";
?>
Burimi: habr.com
