Am scris inițial acest articol în scopul meu , pentru a nu căuta și a nu-mi aminti din nou, dar, având în vedere că nimeni nu citește blogul, am dorit să împărtășesc această informație cu toți, poate va fi util cuiva.
În timp ce lucram la ideea unui serviciu pentru resetarea parolelor în sistemele SAP R/3, a apărut întrebarea – cum pot lansa SAP GUI cu parametrii necesari din browser? Deoarece această idee implica utilizarea unui serviciu web, care întâi ar răspunde la cererea SOAP din SAP GUI și ar trimite un e-mail cu un link către o pagină web cu scriptul de resetare a parolei inițiale, iar apoi să afișeze utilizatorului un mesaj de succes pentru resetarea parolei și să arate această parolă inițială, mi-am dorit ca pe această pagină să existe și un link pentru a lansa SAP GUI. În plus, acest link ar trebui să deschidă sistemul dorit, de preferat, imediat cu câmpurile de login și parolă completate: utilizatorul ar trebui să completeze doar parola de producție de două ori.
Lansarea SAP Logon – nu era interesantă pentru scopul nostru, iar la lansarea sapgui.exe nu se putea specifica clientul și numele utilizatorului, însă putea fi lansat un sistem care nu era definit în SAP Logon. Pe de altă parte, lansarea SAP GUI cu parametrii arbitrare ai serverului nu era deosebit de relevantă: dacă rezolvăm problema resetării parolei utilizatorului, cea mai probabilă situație este că acestuia îi lipsește deja linia necesară în SAP Logon, cu setările potrivite și nu este cazul să intervenim cu ale noastre. Cu toate acestea, cerințelor specificate le răspunde tehnologia SAP GUI Shortcut și, de fapt, programul sapshcut.exe, care oferea posibilitatea de a lansa SAP GUI utilizând un „shortcut” specific.
Soluția problemei direct: lansarea sapshcut.exe direct din browser cu ajutorul obiectului 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=RO');
}
Soluția este slabă: pe de o parte, funcționează doar în Internet Explorer, pe de altă parte, necesită setări de securitate corespunzătoare în browser, care în organizație pot fi interzise la nivel de domeniu, iar chiar dacă sunt permise, browserul oferă utilizatorului o fereastră cu un avertisment înfricoșător:

Soluția nr. 2 am descoperit-o pe internet: . Permite lansarea aplicației dorite printr-un link care specifică protocolul, pe care îl înregistrăm noi în Windows în registrul de sistem la secțiunea HKEY_CLASSES_ROOT. Deoarece scurtcuponul SAP GUI are o subsecțiune în această secțiune, putem adăuga acolo parametrul de text URL Protocol cu valoare goală:

Acest protocol lansează sapgui.exe cu parametrul /SHORTCUT, ceea ce este exact ceea ce ne trebuie:

Sau, dacă dorim să creăm un protocol complet arbitrar (de exemplu, sapshcut), acesta poate fi înregistrat folosind următorul fișier reg:
Editorul de Registry Windows Versiunea 5.00
[HKEY_CLASSES_ROOTsapshcut]
@="Handler sapshcut"
"Protocol URL"=""
[HKEY_CLASSES_ROOTsapshcutDefaultIcon]
@="sapshcut.exe"
[HKEY_CLASSES_ROOTsapshcutshell]
[HKEY_CLASSES_ROOTsapshcutshellopen]
[HKEY_CLASSES_ROOTsapshcutshellopencommand]
@="sapshcut.exe "%1""
Acum, dacă facem un link pe pagina web specificând protocolul Sapgui.Shortcut.File într-un mod similar:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
ar trebui să ne apară o fereastră de tip:

Și totul pare minunat, dar când apăsăm butonul „Permite” vedem:

Oh, the browser turned spaces into . Other characters will also be encoded into their numerical codes with a percent symbol. And the most unpleasant thing is that nothing can be done on the browser level (it’s all done according to the standard) — the browser doesn’t like such characters, and the Windows command interpreter doesn’t work with such encoded values. One more downside is that the whole string is passed as a parameter, including the protocol name and even the colon ("sapgui.shortcut.file:). Chiar dacă același sapshcut.exe știe să ignore tot ce nu este un parametru pentru el (începe cu simbolul „-“, urmat de nume, „=” și valoare), adică o linie de forma „sapgui.shortcut.file: -system=SID„ încă va funcționa, dar fără spațiu „sapgui.shortcut.file:-system=SID„ deja nu mai funcționează.
Se pare că, în principiu, există două variante de utilizare a protocolului URI:
- Utilizarea fără parametrii: Creăm o mulțime de protocoale pentru toate sistemele noastre de forma SIDMANDT, de tipul AAA200, BBB200 etc. Dacă trebuie să lansăm pur și simplu sistemul dorit, atunci opțiunea este complet viabilă, dar în cazul nostru nu se potrivește, deoarece dorim să transmitem măcar numele utilizatorului, iar acest lucru nu se poate face în acest fel.
- Utilizarea unui program wrapper pentru apel sapshcut.exe sau sapgui.exeIdeea principală a acestui program este simplă - acesta trebuie să ia acea linie pe care browserul o transmite prin protocolul web și să o transforme în acea reprezentare care este acceptată de Windows, adică să transforme înapoi toate codurile simbolurilor în simboluri (poate chiar să analizeze linia după parametri) și apoi să apeleze SAP GUI cu o comandă garantat corectă. În cazul nostru, nici asta nu se potrivește complet (de aceea nici nu am scris-o), deoarece nu este suficient să adăugăm protocolul pe toate PC-urile utilizatorilor (în cadrul domeniului este acceptabil, deși este mai bine să evităm o astfel de practică), dar va fi necesar să plasăm suplimentar programul pe PC-uri și să ne asigurăm constant că nu dispare în urma reinstalărilor software-ului pe PC.
Deci, această variantă o excludem ca fiind necorespunzătoare.
Aici am început să mă gândesc că va trebui să renunț la ideea de a lansa SAP GUI cu parametrii necesari din browser, dar apoi mi-a venit în minte gândul că în SAP Logon se poate crea un shortcut și se poate copia pe desktop. Am folosit odată acest mod, dar până atunci nu am verificat special fișierul shortcut-ului. Și s-a dovedit că acest shortcut este de fapt un fișier text obișnuit cu extensia .sap. Și dacă îl lansezi în Windows - se va deschide SAP GUI cu parametrii specificați în acest fișier. "Bingo!"
Formatul acestui fișier este aproximativ următorul (poate exista și tranzacția de lansare la start, dar am omis-o):
[System]
Nume=SID
Client=200
[User]
Nume=
Limba=RU
Parolă=
[Function]
Titlu=
[Configuration]
GuiSize=Maximizat
[Options]
Reuse=0
Se pare că este tot ce este necesar: și ID-ul sistemului, și mandantul, și numele utilizatorului și chiar și parola. Și chiar și parametrii suplimentari: Titlu — titlul ferestrei, GuiSize — dimensiunea ferestrei deschise (pe tot ecranul sau nu) și Reuse — dacă să deschizi obligatoriu o fereastră nouă sau să folosești deja deschisa cu același sistem. Dar imediat a apărut o problemă - în SAP Logon se pare că nu s-a putut seta parola, câmpul a fost blocat. S-a dovedit că acest lucru a fost realizat din motive de securitate: toate shortcut-urile create în SAP Logon sunt stocate într-un fișier sapshortcut.ini (lângă saplogon.ini în profilul utilizatorului Windows) și acolo, deși sunt criptate, nu sunt foarte puternic protejate, iar la o dorință mare pot fi decodificate. Dar este posibil și să se permită acest lucru prin schimbarea valorii unui parametru în registru (în mod implicit valoarea este 0):
Editorul de Registry Windows Versiunea 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
Aceasta deblochează câmpul „Parolă” pe formularul de creare a shortcut-ului în SAP Logon:

Iar când introduci o parolă în acest câmp, aceasta va fi plasată în linia corespunzătoare.
sapshortcut.ini, dar atunci când tragiun shortcut pe desktop, acesta nu apare acolo – însă îl poți adăuga manual. Parola este criptată, pentru 111111 va avea următorul format: PW_49B02219D1F6, pentru 222222 – PW_4AB3211AD2F5. Dar ne interesează mai mult faptul că această parolă este criptată într-un mod care nu depinde de PC-ul specific și, dacă vom reseta parola la valoarea inițială, putem folosi o valoare cunoscută în acest câmp. Dacă dorim să folosim o parolă creată aleatoriu – va trebui să înțelegem algoritmul acestei criptări. Dar, judecând după exemplele furnizate, nu va fi greu de realizat. Apropo, în SAP GUI 7.40, acest câmp a dispărut complet din formular, dar fișierul cu parola completată este recunoscut corect.
Deci, se pare că în browser este suficient să dai click pe un link către un fișier cu extensia .sap și cu formatul necesar – și acesta va oferi opțiunea de a-l deschide ca un fișier de tip SAP GUI Shortcut (bineînțeles, pe un PC pe care este instalat SAP GUI) și ne va deschide fereastra SAP GUI cu parametrii indicați (dacă perechea SID și clientul se află în lista SAP Logon de pe acest PC).
Dar, este clar că nimeni nu va crea și stoca fișiere în avans pe site – acestea trebuie să fie generate pe baza parametrilor necesari. De exemplu, se poate crea un script în PHP pentru generarea shortcut-urilor (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=Intrare in sistemrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>
Dacă nu se specifică un nume de utilizator și o parolă, atunci vom obține fereastra următoare cu cererea de autentificare și parolă:

Dacă transmitem doar numele de utilizator, câmpul numelui va fi completat, iar câmpul parolei va rămâne gol. Dacă, în schimb, transmitem utilizatorului atât numele, cât și parola, dar în registrul PC-ului utilizatorului, cheia EnablePassword în secțiunea [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] este setată pe 0, vom obține același rezultat. Și doar dacă această cheie este setată pe 1 și transmitem și numele, și parola inițială, sistemul va solicita imediat introducerea de două ori a unei noi parole permanente. Asta era scopul.
În concluzie, avem următorul set de opțiuni discutate ca o ilustrare a celor de mai sus:
<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', '');"/>Exemplu 1: Executați sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Exemplu 2: Deschideți sapshcut.exe (URI)</a><br>
<a href='/ro/sapshcut.php/?SID=SID&Client=200&User=test'>Exemplu 3: Deschideți fișierul .sap (Scurtătură SAP GUI)</a><br>
</body>
</html>
M-a mulțumit ultima opțiune. Dar se poate înlocui generarea de scurtături SAP cu, de exemplu, generarea de fișiere CMD, care, de asemenea, la deschiderea din browser, vă vor deschide fereastra SAP GUI. Mai jos este un exemplu (sapguicmd.php) de lansare directă a SAP GUI cu specificarea întregii linii de conectare, fără a fi necesar să aveți SAP Logon configurat:
<?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 Întroducerea î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";
?>
Sursa: habr.com
