Selle artikli kirjutasin algselt enda jaoks, , et hiljem ei peaks uuesti otsima ja meenutama, kuid kuna blogi ei loe keegi, soovisin selle teabe kõikidega jagada, äkki on sellest kasu.
Töötades välja teenust SAP R/3 süsteemide parooli lähtestamiseks, kerkis küsimus — kuidas käivitada SAP GUI vajalikest parameetritest brauserist? Kuna selle idee raames oli planeeritud veebiteenuse kasutamine, mis esmalt töötleb SOAP-päringu SAP GUI-st ja saadab e-kirja lingiga veebilehte parooli lähtestamise skripti jaoks, ja seejärel kuvab kasutajale sõnumi edukast parooli lähtestamisest ja algse parooli, soovisime, et sellel lehel oleks ka link SAP GUI käivitamiseks. Veelgi enam, et see link avaks soovitud süsteemi ja eelistatavalt kohe täidetud kasutajanime ja parooli väljadega: kasutajale jääks üle vaid kaks korda sisestada tootmisparool.
SAP Logoni käivitamine ei olnud meie eesmärkide jaoks huvipakkuv, ja sapgui.exe käivitamisel ei olnud võimalik määrata mandanti ja kasutajanime, kuid see võimaldas isegi mitte-SAP Logonis määramata süsteemi käivitada. Teiselt poolt, SAP GUI käivitamine suvaliste serveri parameetritega ei olnud eriti asjakohane: kui me lahendame kasutaja parooli lähtestamise probleemi, on tõenäoliselt tal SAP Logonis juba vajalik rida, koos tema seadistustega, ja pole vaja oma seadistusi segada. Siiski vastasid nõuetele tehnoloogia SAP GUI Shortcut ja programm sapshcut.exe, mis võimaldas käivitada SAP GUI kindla "lühendi" abil.
Probleemi lahendamine otse: sapshcut.exe käivitamine otse brauserist ActiveX objekti abil:
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');
}
Lahendus on halb: esiteks töötab see ainult Internet Exploreris, teiseks nõuab see vastavaid turvaseadeid brauseris, mis võib organisatsioonis olla domeenitasemel keelatud, ja isegi kui need on lubatud, annab brauser kasutajale hirmutava hoiatusteate:

Lahendus nr 2, mille leidsin internetist: . See võimaldab käivitada vajaliku rakenduse lingi kaudu, määrates protokolli, mille registreerime Windowsis registris jaotises HKEY_CLASSES_ROOT. Kuna SAP GUI Shortcut'il on selles jaotises oma alamjaotis, saame lisada stringi parameetri URL Protocol tühja väärtusega:

See protokoll käivitab sapgui.exe argumenti /SHORTCUT, mis ongi meie soov:

Või kui tahame luua täiesti suvalise protokolli (näiteks, sapshcut), siis saab seda registreerida järgmise reg-failiga:
Windowsi registri redigeeri versioon 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""
Nüüd, kui teeme veebilehe lingi protokolli määramisega Sapgui.Shortcut.File sarnasel viisil:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
peaks meil avanema järgmist tüüpi aken:

Ja kõik näib olevat suurepärane, kuid kui vajutame nuppu „Luba”, näeme:

Опа, браузер пробел превратил в %20. Ну и другие символы тоже будут закодированы в свой числовой код с символом процента. И самое неприятное, что тут ничего нельзя сделать на уровне браузера (тут всё сделано по стандарту) — браузер не любит подобные символы, а командный интерпретатор Windows не работает с такими закодированными значениями. И еще один минус — в качестве параметра передается вся строка, включая название протокола и даже двоеточие (sapgui.shortcut.file:) sapshcut.exe oskab põhjendada kõik, mis ei ole tema jaoks parameeter (algab sümbolist „-“, seejärel nimi, „=“ ja väärtus), st string nagu „sapgui.shortcut.file: -system=SID“ töötab, aga ilma tühikuta „sapgui.shortcut.file:-system=SID“ ei toimi enam.
Tuleb välja, et põhimõtteliselt on kahe võimaluse olemasolu URI-protokolli kasutamiseks:
- Kasutamine ilma parameetriteta: Loome terve hunniku protokolle kõigi meie süsteemide jaoks, nagu näiteks SIDMANDT, näiteks AAA200, BBB200 jne. Kui on vaja lihtsalt käivitada vajalik süsteem, siis variant on täiesti toimiv, kuid meie juhul see ei sobi, kuna tahaks vähemalt kasutajanime ka edastada, aga seda ei saa sellisel viisil teha.
- Wrapper-programmi kasutamine kutsesüsteemi jaoks sapshcut.exe või sapgui.exeSelle programmi mõte on lihtne — see peab võtma selle rea, mille brauser edastab veebiprotokolli kaudu, ja muutma selle Windowsi aktsepteeritavaks vorminguks, t. .s. tagastab kõik sümbolite koodid sümboliteks (võib-olla isegi eraldab rea parameetrite järgi) ja kutsub juba SAP GUI-d kindla käsuga. Meie puhul ei sobi see ka päris hästi (seetõttu ei hakanud seda isegi kirjutama), kuna meil on vähe lisada protokoll kõikidesse kasutajate PC-desse (domeeni piires on see veel talutav, kuigi sellist praktikat on parem vältida), aga siin on veel lisaks vajalik programm installida PC-le, ja veel pidevalt jälgida, et see kuskile ei kaoks, kui tarkvara PC-l uuesti installitakse.
T.ä. ka see variant jäetakse kõrvale, kuna see ei sobi meile.
Olen juba hakkanud mõtlema, et pean loobuma ideest käivitada SAP GUI vajalike parameetritega brauserist, kuid siis tuli mulle pähe mõte, et SAP Logon'is saab teha otsetee ja selle saab kopeerida töölauale. Olen seda meetodit varem kasutanud, kuid enne ei olnud ma otsetee faili spetsiaalselt vaadanud. Ja selgus, et see otsetee on tavaline tekstifail laiendiga .sap. Ja kui seda Windowsis avada, käivitub SAP GUI parameetritega, mis on antud selles failis. "Bingo!"
Selle faili formaat on umbes järgmine (seal võib olla käivitatav tehing käivitamisel, kuid ma jätsin selle välja):
[System]
Nimi=SID
Klient=200
[User]
Nimi=
Keel=ET
Salasõna=
[Function]
Pealkiri=
[Configuration]
GuiSuurus=Maximeeritud
[Options]
Taasta=0
Tundub, et kõik vajalik on olemas: süsteemi identifikaator, mandant, kasutajanimi ja isegi parool. Ning isegi lisaparameetrid: Pealkiri — akna pealkiri, GuiSize — avatud akna suurus (täisekraan või mitte) ja Reuse — kas on vajalik avada uus aken või kasutada juba avatud sama süsteemiga. Kuid kohe ilmnes nüanss — SAP Logonis ei saanud parooli seada, rida oli blokeeritud. Selgus, et see on tehtud turvakaalutlustel: kõik SAP Logonis loodud otseteed salvestatakse faili sapshortcut.ini (Windowsi kasutajaprofiili kõrval saplogon.ini ) ja seal on need küll krüpteeritud, kuid mitte liiga tugevalt ning suure soovi korral on võimalik need dekodeerida. Kuid seda saab võimaldada, muutes registreerimisandmete ühe parameetri väärtust (vaikimisi väärtus 0):
Windowsi registri redigeeri versioon 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
See avab paroolivälja sisestamiseks SAP Logoni otsetee loomise vormis:

Ja kui see väli parooliga täita, siis paigutatakse see vastavasse ritta
sapshortcut.ini, kuid kui lohistate otsetee töölauale, siis see sinna ei ilmu — aga saate selle sinna käsitsi lisada. Parool on krüpteeritud, 111111 puhul on see järgmises vormis: PW_49B02219D1F6, 222222 puhul — PW_4AB3211AD2F5. Kuid meid huvitab rohkem see, et see parool krüpteeritakse ühe ja sama meetodi abil, mis ei sõltu konkreetsest arvutist ja kui me lähtestame parooli algseteks väärtusteks, siis saab selles väljas kasutada ühte eelnevalt tuntud väärtust. Kui me aga soovime kasutada omavalmistatud parooli — siis tuleb mõista selle šifri algoritmi. Kuid, судя по приведённым примерам, это будет несложно. Üks huvitav detail: SAP GUI 7.40-s on see väli üldse vormist kadunud, kuid fail täidetud parooliga mõistetakse korrektselt.
Nii et brauseris piisab, kui klõpsata lingil .sap failiga ja vajaliku formaadiga — ja ta pakub seda avada SAP GUI Shortcut tüüpi failina (loomulikult arvutis, kuhu on installitud SAP GUI) ja avab meile SAP GUI akna esitatud parameetritega (kui paar SID ja mandant on selle arvuti SAP Logoni nimekirjas).
Entselgelt, et lihtsalt faile ei looda ja ei salvestata veebisaidile ette — neid tuleb genereerida vastavalt vajalikele parameetritele. Näiteks saab luua PHP-skripti otseteed loomiseks (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=Log sisse süsteemi rn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximized rn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>
Kui kasutajanime ja parooli ei sisestata, kuvatakse järgmine sisselogimise ja parooli sisestamise aken:

Kui edastada ainult kasutajanimi, siis kasutajanimi täidetakse ja parooli väli jääb tühjaks. Kui edastame kasutajale nii kasutajanime kui parooli, kuid tema PC registry-s on võtme EnablePassword all [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] väärtus 0, saame sama tulemuse. Ainult juhul, kui see võti on seatud 1 ja edastame nii nime kui algse parooli, palub süsteem kohe uue püsiva parooli kahekordselt sisestada. Just seda me soovisime saada.
Kokkuvõttes on meil järgmine arutletud variantide kogum kogu eelneva illustreerimiseks:
<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', '');"/>Näide 1: Käivita sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Näide 2: Ava sapshcut.exe (URI)</a><br>
<a href='/et/sapshcut.php/?SID=SID&Client=200&User=test'>Näide 3: Ava fail .sap (SAP GUI otsetee)</a><br>
</body>
</html>
Viimane variant sobis mulle. Kuid samuti saab SAP-i otsetee genereerimise asemel kasutada näiteks CMD-failide genereerimist, mis avavad brauserist avamisel ka SAP GUI akna. Allpool on toodud näide (sapguicmd.php) SAP GUI otsesest käivitamisest koos täispotentsiaaliga ühenduse stringiga, ilma vajaduseta omada seadistatud 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 Sisenemine ".$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";
?>
Allikas: habr.com
