Llançament de SAP GUI des d'un navegador

Vaig escriure aquest article per primera vegada al meu Bloc, per no cercar i recordar més endavant, però com que ningú llegeix el blog, he volgut compartir aquesta informació amb tothom, per si algú li sembla útil.

Mentre treballava en la idea d'un servei de restabliment de contrasenyes als sistemes SAP R/3, va sorgir una pregunta: com llançar SAP GUI amb els paràmetres necessaris des del navegador? Atès que aquesta idea implicava l'ús d'un servei web, primer respondre a una sol·licitud SOAP des de la GUI de SAP i enviar una carta amb un enllaç a una pàgina web amb un script per restablir la contrasenya a la inicial, i després mostrar-la a l'usuari. un missatge sobre el restabliment de la contrasenya amb èxit i la visualització d'aquesta contrasenya inicial, aleshores m'agradaria que aquesta pàgina també tingués un enllaç per iniciar SAP GUI. A més, aquest enllaç hauria d'obrir el sistema desitjat i, preferiblement, amb els camps d'inici de sessió i contrasenya emplenats alhora: l'usuari només hauria d'omplir la contrasenya productiva dues vegades.

Llançar SAP Logon no va ser interessant per al nostre propòsit, i quan s'executava sapgui.exe era impossible especificar el client i el nom d'usuari, però era possible llançar un sistema no definit a SAP Logon. D'altra banda, llançar SAP GUI amb paràmetres de servidor arbitraris no va ser especialment rellevant: si estem solucionant el problema de restablir la contrasenya d'un usuari, el més probable és que ja tingui la línia necessària a SAP Logon, amb la configuració que necessita, i allà no cal ficar-se amb el seu. Però la tecnologia SAP GUI Shortcut i el programa sapshcut.exe van complir amb els requisits especificats, que va permetre llançar la SAP GUI mitjançant una "drecera" específica.

Resoldre el problema directament: llançant sapshcut.exe directament des del navegador mitjançant un objecte 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');
}

La solució és dolenta: en primer lloc, només funciona a Internet Explorer, en segon lloc, requereix una configuració de seguretat adequada al navegador, que en una organització pot estar prohibida a nivell de domini i, fins i tot si es permet, el navegador mostra una finestra amb un advertència a l'usuari:

Llançament de SAP GUI des d'un navegador

He trobat la solució núm. 2 a Internet: creant el vostre propi protocol web. Ens permet llançar l'aplicació que necessitem mitjançant un enllaç que indica el protocol, que nosaltres mateixos registrem a Windows al registre de l'apartat HKEY_CLASSES_ROOT. Com que SAP GUI Shortcut té la seva pròpia subsecció en aquesta secció, podeu afegir-hi el paràmetre de cadena de protocol URL amb un valor buit:

Llançament de SAP GUI des d'un navegador

Aquest protocol comença sapgui.exe amb paràmetre /Drecera, que és exactament el que necessitem:

Llançament de SAP GUI des d'un navegador

Bé, o si volem fer un protocol completament arbitrari (per exemple, sapshcut), llavors podeu registrar-lo mitjançant el següent fitxer de registre:

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

Ara, si fem un enllaç en una pàgina web indicant el protocol Sapgui.Drecera.Fitxer De manera semblant:

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

Hauríem de veure una finestra com aquesta:

Llançament de SAP GUI des d'un navegador

I tot sembla genial, però quan feu clic al botó "Permetre" veiem:

Llançament de SAP GUI des d'un navegador

Vaja, el navegador ha convertit la barra espaiadora en %20. Bé, altres caràcters també es codificaran en el seu propi codi numèric amb un símbol de percentatge. I el més desagradable és que aquí no es pot fer res a nivell de navegador (tot es fa d'acord amb l'estàndard): al navegador no li agraden aquests caràcters i l'intèrpret d'ordres de Windows no funciona amb aquests valors codificats. I un negatiu més: la cadena sencera es passa com a paràmetre, inclòs el nom del protocol i fins i tot els dos punts (sapgui.shortcut.file:). A més, encara que igual sapshcut.exe pot descartar tot el que no és un paràmetre per a això (comencen amb el símbol "-", després el nom, "=" i el valor), és a dir. una línia com "sapgui.shortcut.file: -system=SID"encara funcionarà, llavors sense espai"sapgui.shortcut.file:-system=SID"ja no funciona.

Resulta que, en principi, hi ha dues opcions per utilitzar el protocol URI:

  1. Ús sense paràmetres: Creem un munt de protocols per a tots els nostres sistemes del tipus SIDMANDT, M'agrada AAA200, BBB200 etcètera. Si només necessiteu iniciar el sistema desitjat, l'opció és força viable, però en el nostre cas no és adequada, ja que almenys us agradaria transferir l'inici de sessió de l'usuari, però això no es pot fer d'aquesta manera.
  2. Utilitzant un programa d'embolcall per trucar sapshcut.exe o sapgui.exe. L'essència d'aquest programa és senzilla: ha d'agafar la cadena que el navegador li transmet mitjançant el protocol web i convertir-la en la representació que rep Windows, és a dir. torna tots els codis de caràcters en caràcters (potser fins i tot analitza la cadena segons els paràmetres) i ja crida a SAP GUI amb una ordre correcta garantida. En el nostre cas, tampoc és del tot adequat (per això ni tan sols l'he escrit), perquè no n'hi ha prou amb afegir el protocol a tots els ordinadors dels usuaris (dins d'un domini això encara està bé, encara que també és millor evitar aquesta pràctica), però aquí necessitarem més col·locar el programa a l'ordinador i també assegurar-nos constantment que no desaparegui quan es reinstal·li el programari a l'ordinador.

Aquells. També descartem aquesta opció com a no adequada per a nosaltres.

En aquest moment ja començava a pensar que hauria d'acomiadar-me de la idea de llançar SAP GUI amb els paràmetres necessaris des del navegador, però aleshores se'm va ocórrer la idea de poder fer una drecera a SAP Logon i copieu-lo al vostre escriptori. Vaig utilitzar aquest mètode una vegada, però abans no vaig mirar específicament el fitxer de drecera. I va resultar que aquesta drecera és un fitxer de text normal amb l'extensió .saba. I si l'executeu a Windows, SAP GUI s'iniciarà amb els paràmetres que s'especifiquen en aquest fitxer. "Bingo!"

El format d'aquest fitxer és aproximadament el següent (també pot haver-hi una transacció llançada a l'inici, però la vaig ometre):

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

Sembla que tot el que es necessita: un identificador del sistema, un client, un nom d'usuari i fins i tot una contrasenya. I fins i tot paràmetres addicionals: títol - títol de la finestra, GuiSize — mida de la finestra en funcionament (pantalla completa o no) i Reutilització — si cal obrir una finestra nova o utilitzar-ne una ja oberta amb el mateix sistema. Però immediatament va sorgir un matís: va resultar que la contrasenya a l'inici de sessió SAP no es podia establir, la línia estava bloquejada. Va resultar que això es va fer per raons de seguretat: emmagatzema totes les dreceres creades a SAP Logon en un fitxer sapshortcut.ini (A prop saplogon.ini al perfil d'usuari de Windows) i allà, tot i que estan xifrats, no estan massa xifrats i, si es vol, es poden desxifrar. Però podeu resoldre-ho canviant el valor d'un paràmetre al registre (el valor predeterminat és 0):

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

Això desbloqueja el camp Contrasenya per introduir-lo al formulari de creació de dreceres a l'inici de sessió de SAP:

Llançament de SAP GUI des d'un navegador

I quan introduïu una contrasenya en aquest camp, aquesta es col·locarà a la línia corresponent
sapshortcut.ini, però quan arrossegueu una drecera a l'escriptori, no hi apareix, però podeu afegir-la manualment. La contrasenya està xifrada, per a 111111 serà la següent: PW_49B02219D1F6, per a 222222 - PW_4AB3211AD2F5. Però ens interessa més el fet que aquesta contrasenya estigui xifrada d'una manera, independentment de l'ordinador específic, i si restablim la contrasenya a la inicial, podem utilitzar un valor preconegut en aquest camp. Bé, si volem utilitzar una contrasenya creada aleatòriament, haurem d'entendre l'algorisme d'aquest xifrat. Però a jutjar pels exemples donats, això no serà difícil de fer. Per cert, a SAP GUI 7.40 aquest camp va desaparèixer completament del formulari, però accepta correctament un fitxer amb una contrasenya emplenada.

És a dir, resulta que al navegador només cal que feu clic a l'enllaç a un fitxer amb l'extensió .sap i el format desitjat, i us oferirà obrir-lo com a fitxer com SAP GUI Shortcut (naturalment en un ordinador). amb SAP GUI instal·lat) i obrirà una finestra SAP GUI amb els paràmetres especificats (si el SID i la parella de client es troben a la llista d'inici de sessió SAP d'aquest ordinador).

Però, està clar que ningú només crearà fitxers per endavant i els emmagatzemarà al lloc: s'han de generar en funció dels paràmetres necessaris. Per exemple, podeu crear un script PHP per generar dreceres (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";
?>

Si no especifiqueu un nom d'usuari i una contrasenya, obtindreu la següent finestra que us demanarà l'inici de sessió i la contrasenya:

Llançament de SAP GUI des d'un navegador

Si només passeu l'inici de sessió, el camp d'inici de sessió s'omplirà i el camp de la contrasenya estarà buit. Si donem a l'usuari un inici de sessió i una contrasenya, però l'usuari de l'ordinador té la clau EnablePassword al registre de la secció [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] establerta a 0, obtenim el mateix. I només si aquesta clau està configurada a 1 i passem tant el nom com la contrasenya inicial, el sistema us demanarà immediatament que introduïu una nova contrasenya permanent dues vegades. Això és el que necessitàvem aconseguir.

Com a resultat, tenim el següent conjunt d'opcions considerades com a il·lustració de tot l'anterior:

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

L'última opció em va bé. Però en lloc de generar dreceres de SAP, també podeu utilitzar, per exemple, la generació de fitxers CMD, que, quan s'obren des d'un navegador, també us obriran la finestra GUI de SAP. A continuació es mostra un exemple (sapguicmd.php) llança directament la GUI de SAP amb la cadena de connexió completa, sense necessitat de tenir configurat l'inici de sessió de SAP:

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

Font: www.habr.com

Afegeix comentari