Lansarea SAP GUI dintr-un browser

Am scris prima dată acest articol în mine blog, ca să nu mai caut și să-mi amintesc din nou mai târziu, dar din moment ce nimeni nu citește blogul, am vrut să împărtășesc această informație cu toată lumea, în caz că cineva i se pare de folos.

În timp ce lucram la ideea unui serviciu de resetare a parolei în sistemele SAP R/3, a apărut o întrebare - cum să lansați SAP GUI cu parametrii necesari din browser? Deoarece această idee presupunea folosirea unui serviciu web, răspunzând mai întâi la o solicitare SOAP din SAP GUI și trimiterea unei scrisori cu un link către o pagină web cu un script pentru resetarea parolei la cea inițială, apoi afișarea utilizatorului un mesaj despre resetarea cu succes a parolei și afișarea acestei parole inițiale, atunci aș dori ca această pagină să aibă și un link pentru a lansa SAP GUI. Mai mult, acest link ar trebui să deschidă sistemul dorit și, de preferință, cu câmpurile de autentificare și parolă completate odată: utilizatorul ar trebui să completeze doar de două ori parola productivă.

Lansarea SAP Logon nu a fost interesantă pentru scopul nostru, iar la rularea sapgui.exe a fost imposibil de specificat clientul și numele de utilizator, dar a fost posibil să lansăm un sistem nedefinit în SAP Logon. Pe de altă parte, lansarea SAP GUI cu parametri arbitrari de server nu a fost deosebit de relevantă: dacă rezolvăm problema resetării parolei unui utilizator, atunci cel mai probabil acesta are deja linia necesară în SAP Logon, cu setările de care are nevoie și acolo nu este nevoie să se încurce cu ale lui. Dar cerințele specificate au fost îndeplinite de tehnologia SAP GUI Shortcut și de programul sapshcut.exe în sine, ceea ce a făcut posibilă lansarea SAP GUI folosind o „comandă rapidă” specifică.

Rezolvarea directă a problemei: lansarea sapshcut.exe direct din browser folosind un obiect 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');
}

Soluția este proastă: în primul rând, funcționează doar în Internet Explorer, în al doilea rând, necesită setări de securitate adecvate în browser, care într-o organizație pot fi interzise la nivel de domeniu și, chiar dacă este permis, browserul afișează o fereastră cu o fereastră înfricoșătoare. avertisment pentru utilizator:

Lansarea SAP GUI dintr-un browser

Am găsit soluția #2 pe internet: crearea propriului protocol web. Ne permite să lansăm aplicația de care avem nevoie folosind un link care indică protocolul, pe care noi înșine îl înregistrăm în Windows în registry din secțiunea HKEY_CLASSES_ROOT. Deoarece SAP GUI Shortcut are propria sa subsecțiune în această secțiune, puteți adăuga acolo parametrul șir Protocol URL cu o valoare goală:

Lansarea SAP GUI dintr-un browser

Acest protocol începe sapgui.exe cu parametru /Scurtătură, care este exact ceea ce avem nevoie:

Lansarea SAP GUI dintr-un browser

Ei bine, sau dacă vrem să facem un protocol complet arbitrar (de exemplu, sapshcut), apoi îl puteți înregistra folosind următorul fișier reg:

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

Acum, dacă facem un link pe o pagină web care indică protocolul Sapgui.Shortcut.File Intr-un mod similar:

<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>

Ar trebui să vedem o fereastră ca aceasta:

Lansarea SAP GUI dintr-un browser

Și totul pare grozav, dar când faceți clic pe butonul „Permite” vedem:

Lansarea SAP GUI dintr-un browser

Hopa, browserul a transformat bara de spațiu în %20. Ei bine, alte caractere vor fi, de asemenea, codificate în propriul cod numeric cu un simbol procentual. Și cel mai neplăcut lucru este că nu se poate face nimic aici la nivel de browser (totul aici se face conform standardului) - browserului nu-i plac astfel de caractere, iar interpretul de comandă Windows nu funcționează cu astfel de valori codificate. Și încă un minus - întregul șir este transmis ca parametru, inclusiv numele protocolului și chiar două puncte (sapgui.shortcut.file:). Mai mult, deși la fel sapshcut.exe poate elimina tot ceea ce nu este un parametru pentru acesta (începe cu simbolul „-“, apoi numele, „=" și valoare), adică o linie de genul "sapgui.shortcut.file: -system=SID„va funcționa în continuare, atunci fără spațiu”sapgui.shortcut.file:-system=SID"nu mai functioneaza.

Se pare că, în principiu, există două opțiuni pentru utilizarea protocolului URI:

  1. Utilizare fără parametri: creăm o mulțime de protocoale pentru toate sistemele noastre de acest tip SIDMANDT, ca AAA200, BBB200 și așa mai departe. Dacă trebuie doar să porniți sistemul dorit, atunci opțiunea este destul de funcțională, dar în cazul nostru nu este potrivită, deoarece cel puțin ați dori să transferați datele de conectare ale utilizatorului, dar acest lucru nu se poate face în acest fel.
  2. Folosind un program wrapper pentru a apela sapshcut.exe sau sapgui.exe. Esența acestui program este simplă - trebuie să ia șirul pe care browserul i-l transmite prin intermediul protocolului web și să îl transforme în reprezentarea pe care o primește Windows, adică. transformă toate codurile de caractere înapoi în caractere (poate chiar analizează șirul în funcție de parametri) și apelează deja SAP GUI cu o comandă corectă garantată. În cazul nostru, nici nu este pe deplin potrivit (de aceea nici nu am scris-o), pentru că nu este suficient să adăugăm protocolul pe toate PC-urile utilizatorilor (în cadrul unui domeniu este încă în regulă, deși este și mai bine să evitați această practică), dar aici va trebui să plasăm mai mult programul pe computer și, de asemenea, să ne asigurăm constant că nu dispare atunci când software-ul este reinstalat pe computer.

Acestea. De asemenea, respingem această opțiune ca fiind nepotrivită pentru noi.

În acest moment începeam deja să mă gândesc că ar trebui să-mi iau rămas bun de la ideea de a lansa SAP GUI cu parametrii necesari din browser, dar atunci mi-a venit ideea că poți face o comandă rapidă în SAP Logon și copiați-l pe desktop. Am folosit această metodă o dată, dar înainte de asta nu m-am uitat în mod specific la fișierul de comenzi rapide. Și s-a dovedit că această comandă rapidă este un fișier text obișnuit cu extensia .sap. Și dacă îl rulați pe Windows, SAP GUI se va lansa cu parametrii care sunt specificați în acest fișier. "Bingo!"

Formatul acestui fișier este aproximativ următorul (poate fi și o tranzacție lansată la pornire, dar am omis-o):

[System]
Name=SID
Client=200
[User]
Name=
Language=RU
Password=
[Function]
Title=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0

Se pare că tot ce este necesar: un identificator de sistem, un client, un nume de utilizator și chiar o parolă. Și chiar și parametri suplimentari: Titlu - titlul ferestrei, GuiSize — dimensiunea ferestrei de rulare (ecran complet sau nu) și reutilizarea — dacă este necesar să deschideți o fereastră nouă sau să folosiți una deja deschisă cu același sistem. Dar imediat a apărut o nuanță - s-a dovedit că parola în SAP Logon nu a putut fi setată, linia a fost blocată. S-a dovedit că acest lucru a fost făcut din motive de securitate: stochează toate comenzile rapide create în SAP Logon într-un fișier sapshortcut.ini (Aproape saplogon.ini în profilul utilizator Windows) și acolo, deși sunt criptate, nu sunt criptate prea puternic și, dacă se dorește, pot fi decriptate. Dar puteți rezolva acest lucru schimbând valoarea unui parametru din registry (valoarea implicită este 0):

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

Aceasta deblochează câmpul Parolă pentru introducerea în formularul de creare a comenzilor rapide în SAP Logon:

Lansarea SAP GUI dintr-un browser

Și când introduceți o parolă în acest câmp, aceasta va fi plasată în rândul corespunzător
sapshortcut.ini, dar când trageți o comandă rapidă pe desktop, aceasta nu apare acolo - dar o puteți adăuga manual acolo. Parola este criptată, pentru 111111 va fi după cum urmează: PW_49B02219D1F6, pentru 222222 - PW_4AB3211AD2F5. Dar ne interesează mai mult faptul că această parolă este criptată într-un singur mod, independent de computerul specific, iar dacă resetam parola la cea inițială, atunci putem folosi o valoare precunoscută în acest câmp. Ei bine, dacă vrem să folosim o parolă creată aleatoriu, va trebui să înțelegem algoritmul acestui cifr. Dar judecând după exemplele date, acest lucru nu va fi greu de realizat. Apropo, în SAP GUI 7.40 acest câmp a dispărut complet din formular, dar acceptă corect un fișier cu o parolă completată.

Adică, se dovedește că în browser trebuie doar să faceți clic pe linkul către un fișier cu extensia .sap și formatul dorit - și vă va oferi să îl deschideți ca fișier precum SAP GUI Shortcut (în mod firesc pe un PC cu SAP GUI instalat) și va deschide o fereastră SAP GUI cu parametrii specificați (dacă perechea SID și client se află în lista SAP Logon de pe acest computer).

Dar, este clar că nimeni nu va crea pur și simplu fișiere în avans și le va stoca pe site - acestea trebuie generate pe baza parametrilor necesari. De exemplu, puteți crea un script PHP pentru a genera comenzi rapide (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";
?>

Dacă nu specificați un nume de utilizator și o parolă, veți obține următoarea fereastră care vă va cere autentificarea și parola:

Lansarea SAP GUI dintr-un browser

Dacă treceți numai de autentificare, câmpul de autentificare va fi completat și câmpul de parolă va fi gol. Dacă îi dăm utilizatorului atât un login, cât și o parolă, dar utilizatorul de pe computer are cheia EnablePassword în registry din secțiunea [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] setată la 0, atunci obținem același lucru. Și numai dacă această cheie este setată la 1 și trecem atât numele, cât și parola inițială, sistemul vă va solicita imediat să introduceți o nouă parolă permanentă de două ori. Asta trebuia să obținem.

Ca rezultat, avem următorul set de opțiuni luate în considerare ca o ilustrare a tuturor 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', '');"/>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>

Ultima varianta mi s-a potrivit. Dar, în loc să generați comenzi rapide SAP, puteți utiliza, de exemplu, generarea de fișiere CMD, care, atunci când sunt deschise dintr-un browser, vă vor deschide și fereastra SAP GUI. Mai jos este un exemplu (sapguicmd.php) lansați direct SAP GUI cu șirul complet de conexiune, fără a fi nevoie să aveți configurat 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 Вход в ".$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: www.habr.com

Adauga un comentariu