Lanciazione di SAP GUI da un navigatore

Prima aghju scrittu stu articulu in my блог, Per ùn circà è ricurdate di novu dopu, ma postu chì nimu ùn leghje u blogu, aghju vulsutu sparte sta infurmazione cù tutti, in casu chì qualchissia trova utile.

Mentre travagliava nantu à l'idea di un serviziu di resettore di password in i sistemi SAP R/3, hè stata una quistione - cumu lancià SAP GUI cù i parametri necessarii da u navigatore? Siccomu sta idea implicava l'usu di un serviziu web, prima risponde à una dumanda SOAP da a GUI SAP è invià un email cù un ligame à una pagina web cù un script per resetting a password à l'iniziale, è dopu mostra à l'utilizatore. un missaghju nantu à u resettore di password successu è a visualizazione di sta password iniziale, allora mi piacerebbe chì sta pagina hà ancu un ligame per lancià SAP GUI. Inoltre, stu ligame duveria apre u sistema desideratu, è, preferibbilmente, cù i campi di login è password riempiti in una volta: l'utilizatore duveria solu compie a password produtiva duie volte.

U lanciamentu di SAP Logon ùn era micca interessante per u nostru scopu, è quandu eseguisce sapgui.exe era impussibile di specificà u cliente è u nome d'utilizatore, ma era pussibule lancià un sistema micca definitu in SAP Logon. Per d 'altra banda, lanciari SAP GUI cù paràmetri di u servitore arbitrariu ùn era micca particularmente pertinente: se risolvemu u prublema di resettate a password di l'utilizatore, allora più prubabilmente hà digià a linea necessaria in SAP Logon, cù i paràmetri chì hà bisognu, è ci hè. ùn hè micca bisognu di scherzà cù u so propiu. Ma i requisiti specificati sò stati cumpresi da a tecnulugia SAP GUI Shortcut è u prugramma sapshcut.exe stessu, chì hà permessu di lancià a SAP GUI cù un "shortcut" specificu.

Risolve u prublema in capu: lanciate sapshcut.exe direttamente da u navigatore utilizendu un oggettu 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');
}

A suluzione hè male: prima, funziona solu in Internet Explorer, in segundu, hè bisognu di paràmetri di sicurità adattati in u navigatore, chì in una urganizazione pò esse pruibita à u livellu di u duminiu, è ancu s'ellu hè permessu, u navigatore mostra una finestra cù un spaventu. avvisu à l'utilizatori:

Lanciazione di SAP GUI da un navigatore

Aghju trovu a suluzione #2 in Internet: criendu u vostru propiu protocolu web. Ci permette di lancià l'applicazione chì avemu bisognu utilizendu un ligame chì indica u protocolu, chì noi stessi registremu in Windows in u registru in a sezione HKEY_CLASSES_ROOT. Siccomu SAP GUI Shortcut hà a so propria sottosezzione in questa sezione, pudete aghjunghje u paràmetru di stringa di protocolu URL cù un valore viotu quì:

Lanciazione di SAP GUI da un navigatore

Stu protokollu principia sapgui.exe cun paràmetru / SCORCIATURA, chì hè esattamente ciò chì avemu bisognu:

Lanciazione di SAP GUI da un navigatore

Ebbè, o se vulemu fà un protokollu cumplettamente arbitrariu (per esempiu, sapshcut), allora pudete registrà lu cù u seguente file 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""

Avà, se facemu un ligame nantu à una pagina web indicà u protocolu Sapgui.Shortcut.File In modu simili:

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

Avemu da vede una finestra cum'è questu:

Lanciazione di SAP GUI da un navigatore

È tuttu pare bellu, ma quandu cliccate nant'à u buttone "Permette" vedemu:

Lanciazione di SAP GUI da un navigatore

Oops, u navigatore hà trasfurmatu a barra spaziatrice in % 20. Ebbè, altri caratteri seranu ancu codificati in u so propiu codice numericu cù un simbulu per centu. È a cosa più dispiacevule hè chì nunda ùn pò esse fattu quì à u livellu di u navigatore (tuttu quì hè fattu secondu u standard) - u navigatore ùn piace micca tali caratteri, è l'interprete di cumandamentu di Windows ùn viaghja micca cù tali valori codificati. È un altru minus - tutta a stringa hè passata cum'è paràmetru, cumpresu u nome di u protokollu è ancu u colon (sapgui.shortcut.file:). Inoltre, ancu s'ellu hè u listessu sapshcut.exe pò scaccià tuttu ciò chì ùn hè micca un paràmetru per ellu (accumincia cù u simbulu "-", dopu u nome, "=" è valore), i.e. una linea cum'è "sapgui.shortcut.file: -system=SID"funcionerà sempre, allora senza spaziu"sapgui.shortcut.file:-system=SID"ùn funziona più.

Ci hè chì, in principiu, ci sò duie opzioni per utilizà u protocolu URI:

  1. Utilizà senza parametri: Creemu un saccu di protokolli per tutti i nostri sistemi di u tipu SIDMANDT, tipu AAA 200, BBB 200 eccetera. Se avete bisognu di inizià u sistema desideratu, l'opzione hè abbastanza pratica, ma in u nostru casu ùn hè micca adattatu, postu chì almenu vulete trasfiriri u login di l'utilizatori, ma questu ùn pò micca esse fattu cusì.
  2. Utilizà un prugramma wrapper per chjamà sapshcut.exe o sapgui.exe. L'essenza di stu prugramma hè simplice - deve piglià a stringa chì u navigatore trasmette à ellu via u protokollu web è trasfurmà in a rapprisintazioni chì Windows riceve, i.e. torna tutti i codici di caratteri in caratteri (forse ancu analizza a stringa secondu i paràmetri) è digià chjama SAP GUI cù un cumandamentu currettu garantitu. In u nostru casu, ùn hè ancu micca cumplettamente adattatu (hè per quessa chì ùn l'aghju mancu scrittu), perchè ùn ci hè micca abbastanza per aghjunghje u protokollu in tutti i PC di l'utilizatori (in un duminiu hè sempre bè, ancu s'ellu hè ancu megliu per evitari sta pratica), ma quì avemu bisognu di più postu u prugramma nant'à u PC, è ancu assicurendu constantemente chì ùn si ne va micca quandu u software hè reinstallatu in u PC.

Quelli. Scartamu ancu sta opzione cum'è inadatta per noi.

À questu puntu, aghju digià principiatu à pensà chì avissi da dì addiu à l'idea di lanciari SAP GUI cù i paràmetri necessarii da u navigatore, ma dopu l'idea m'hè accaduta chì pudete fà una scorciata in SAP Logon è copià lu à u vostru desktop. Aghju utilizatu stu metudu una volta, ma prima ùn aghju micca fighjatu specificamente à u schedariu di shortcut. È hè risultatu chì sta scurciata hè un schedariu di testu regulare cù l'estensione .sap. È se l'eseguite in Windows, SAP GUI lanciarà cù i paràmetri chì sò specificati in stu schedariu. "Bingu!"

U furmatu di stu schedariu hè apprussimatamente u seguitu (ci pò ancu esse una transazzione lanciata à l'iniziu, ma l'aghju omessa):

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

Sembra chì tuttu ciò chì hè necessariu: un identificatore di sistema, un cliente, un nome d'utilizatore è ancu una password. È ancu parametri supplementari: Title - titulu di finestra, GuiSize - dimensione di a finestra in esecuzione (schermu pienu o micca) è Reuse - s'ellu hè necessariu apre una nova finestra o aduprà una dighjà aperta cù u listessu sistema. Ma una sfumatura hè subitu subitu - resultò chì a password in SAP Logon ùn pò micca esse stabilita, a linea hè stata bluccata. Hè risultatu chì questu hè statu fattu per ragioni di sicurezza: guarda tutte e scurciate create in SAP Logon in un schedariu. sapshortcut.ini (Vicino saplogon.ini in u prufilu d'utilizatori di Windows) è quì, ancu s'elli sò criptati, ùn sò micca troppu criptati è, se vulete, ponu esse decriptati. Ma pudete risolve questu cambiendu u valore di un paràmetru in u registru (u valore predeterminatu hè 0):

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

Questu sblocca u campu di Password per l'entrata in u furmulariu di creazione di shortcut in SAP Logon:

Lanciazione di SAP GUI da un navigatore

È quandu inserite una password in questu campu, serà postu in a linea currispundente
sapshortcut.ini, ma quandu trascinate un shortcut à u desktop, ùn appare micca quì - ma pudete aghjunghje quì manualmente. A password hè criptata, per 111111 serà cusì: PW_49B02219D1F6, per 222222 - PW_4AB3211AD2F5. Ma simu più interessatu in u fattu chì sta password hè criptata in un modu, indipendentemente da u PC specificu, è s'ellu si resetta a password à l'iniziale, allora pudemu usà un valore pre-cunnisciutu in questu campu. Ebbè, se vulemu utilizà una password creata aleatoriamente, avemu da capisce l'algoritmu di stu cifru. Ma à ghjudicà da l'esempii datu, questu ùn serà micca difficiule di fà. In modu, in SAP GUI 7.40 stu campu hè sparitu cumplettamente da a forma, ma accetta currettamente un schedariu cù una password cumpleta.

Vale à dì, risulta chì in u navigatore basta à cliccà nant'à u ligame à un schedariu cù l'estensione .sap è u formatu desideratu - è offre à apre cum'è un schedariu di u tippu SAP GUI Shortcut (naturalmente nantu à). un PC cù SAP GUI installatu) è apre una finestra SAP GUI cù i paràmetri specificati (se u SID è a coppia di client sò in a lista di SAP Logon in questu PC).

Ma, hè chjaru chì nimu hà da creà i schedarii in anticipu è l'almacenà nantu à u situ - deve esse generatu basatu nantu à i paràmetri necessarii. Per esempiu, pudete creà un script PHP per generà accurtatoghji (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";
?>

Se ùn specificate micca un nome d'utilizatore è una password, uttene a seguente finestra chì dumanda u login è a password:

Lanciazione di SAP GUI da un navigatore

Se passate solu u login, u campu di login serà cumpletu è u campu di password serà viotu. Se demu à l'utilizatore un login è una password, ma l'utilizatore nantu à u PC hà a chjave EnablePassword in u registru in a sezione [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] sette à 0, allora avemu a stessa cosa. È solu s'ellu si sta chjave hè stituutu à 1 è passemu u nome è a password iniziale, u sistema vi invita immediatamente à inserisce una nova password permanente duie volte. Hè ciò chì avemu bisognu di ottene.

In u risultatu, avemu u seguitu inseme di opzioni cunsiderate cum'è una illustrazione di tutte e cose sopra:

<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'ultima opzione mi cunvene. Ma invece di generà accurtatoghji SAP, pudete ancu aduprà, per esempiu, generà schedarii CMD, chì, quandu sò aperti da un navigatore, apre ancu a finestra SAP GUI per voi. Quì sottu hè un esempiu (sapguicmd.php) lanciate direttamente a SAP GUI cù a stringa di cunnessione completa, senza avè bisognu di avè configuratu 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";
?>

Source: www.habr.com

Add a comment