Avvio di SAP GUI dal browser

Ho scritto inizialmente questo articolo nel mio blog, così da non doverlo cercare e ricordare di nuovo, ma dal momento che nessuno legge il blog, ho voluto condividere queste informazioni con tutti, potrebbe essere utile a qualcuno.

Durante il lavoro sull'idea di un servizio per il reset della password nei sistemi SAP R/3, è sorto il problema: come avviare SAP GUI con i parametri necessari dal browser? Poiché in questa idea si prevedeva l'uso di un servizio web, inizialmente gestito tramite una richiesta SOAP da SAP GUI e l'invio di una email con un collegamento a una pagina web contenente lo script di reset della password all'inizio, e poi la visualizzazione di un messaggio all'utente sul successo del reset e la visualizzazione di questa stessa password iniziale, volevo che su questa pagina ci fosse anche un collegamento per avviare SAP GUI. Inoltre, questo collegamento doveva aprire il sistema corretto e, idealmente, con i campi di login e password già compilati: all'utente sarebbe rimasto solo da inserire due volte la password di produzione.

L'avvio di SAP Logon non era interessante per il nostro scopo, e durante l'avvio di sapgui.exe non era possibile specificare il mandante e il nome utente, ma era possibile avviare un sistema non definito in SAP Logon. D'altra parte, l'avvio di SAP GUI con parametri arbitrari del server non era particolarmente rilevante: se stiamo affrontando il problema del reset della password dell'utente, molto probabilmente nella sua SAP Logon c'è già la riga necessaria, con le impostazioni corrette, e non è necessario utilizzare le proprie. Tuttavia, la tecnologia SAP GUI Shortcut e il programma sapshcut.exe soddisfacevano i requisiti stabiliti, permettendo di avviare SAP GUI utilizzando un

La soluzione diretta: avviare sapshcut.exe direttamente dal browser utilizzando un oggetto 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 soluzione non è buona: innanzitutto, funziona solo in Internet Explorer; in secondo luogo, richiede impostazioni di sicurezza appropriate nel browser, che nell'organizzazione possono essere vietate a livello di dominio, e anche se sono consentite, il browser mostra all'utente una finestra con un avviso spaventoso:

Avvio di SAP GUI dal browser

Ho trovato la soluzione n. 2 su internet: creazione di un proprio protocollo web. Consente di avviare l'applicazione desiderata tramite un link specificando il protocollo che registriamo noi stessi in Windows nel registro nella sezione HKEY_CLASSES_ROOT. Poiché nel registro SAP GUI Shortcut c'è una propria sotto-sezione, possiamo aggiungere qui il parametro stringa URL Protocol con un valore vuoto:

Avvio di SAP GUI dal browser

Questo protocollo avvia sapgui.exe con il parametro /SHORTCUT, che è esattamente ciò di cui abbiamo bisogno:

Avvio di SAP GUI dal browser

O se vogliamo creare un protocollo arbitrario (ad esempio, sapshcut), possiamo registrarlo utilizzando il seguente file reg:

Editor del Registro di Windows Versione 5.00
[HKEY_CLASSES_ROOTsapshcut]
@="gestore sapshcut"
"Protocollo URL"=""
[HKEY_CLASSES_ROOTsapshcutDefaultIcon]
@="sapshcut.exe"
[HKEY_CLASSES_ROOTsapshcutshell]
[HKEY_CLASSES_ROOTsapshcutshellopen]
[HKEY_CLASSES_ROOTsapshcutshellopencommand]
@="sapshcut.exe "%1""

Ora, se sulla pagina web facciamo un link specificando il protocollo Sapgui.Shortcut.File in questo modo:

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

dovrebbe apparire una finestra del tipo:

Avvio di SAP GUI dal browser

E sembra tutto fantastico, ma quando clicchiamo il pulsante «Consenti» vediamo:

Avvio di SAP GUI dal browser

Wow, il browser ha trasformato lo spazio in . Anche altri simboli saranno codificati nel loro codice numerico con il simbolo di percentuale. E la cosa più sgradevole è che non si può fare nulla a livello di browser (tutto è fatto secondo lo standard) — il browser non ama simboli simili, e l'interprete dei comandi di Windows non funziona con tali valori codificati. E un altro svantaggio è che viene passata l'intera stringa come parametro, compreso il nome del protocollo e anche i due punti (:sapgui.shortcut.file:). Infatti, sebbene lo stesso sapshcut.exe sia in grado di ignorare tutto ciò che non è un parametro per lui (inizia con il simbolo «-«, poi il nome, «=» e il valore), cioè una stringa del tipo «sapgui.shortcut.file: -system=SID» funziona ancora, senza lo spazio «sapgui.shortcut.file:-system=SID» non funziona più.

In sostanza, ci sono due opzioni per utilizzare il protocollo URI:

  1. Utilizzarlo senza parametri: Creiamo un'intera serie di protocolli per tutti i nostri sistemi di tipo SIDMANDT, tipo AAA200, BBB200 e così via. Se è necessario semplicemente avviare il sistema desiderato, questa opzione è perfettamente valida, ma nel nostro caso non è utile, poiché vorremmo anche trasmettere il login dell'utente, e ciò non può essere fatto in questo modo.
  2. Utilizzo di un programma wrapper per la chiamata sapshcut.exe o sapgui.exe. L'essenza di questo programma è semplice: deve prendere la stringa che il browser le invia tramite il protocollo web e trasformarla in una rappresentazione accettata da Windows, ossia riconvertire tutti i codici dei caratteri in caratteri (potrebbe anche analizzare la stringa per parametri) e infine chiamare SAP GUI con il comando garantito corretto. Nel nostro caso, non si adatta del tutto (per questo non l'ho nemmeno scritta), perché ci basta aggiungere il protocollo su tutti i PC degli utenti (nel contesto del dominio va anche bene, anche se è meglio evitare questa pratica), ma qui sarà anche necessario installare un programma sui PC e tenerlo sotto controllo affinché non venga rimosso durante le reinstallazioni del software sui PC.

Quindi, questa opzione la scartiamo come inadeguata.

Iniziai già a pensare che dovermi arrendere all'idea di avviare SAP GUI con i parametri necessari dal browser fosse inevitabile, ma poi mi è venuta in mente l'idea di creare un collegamento in SAP Logon e copiarlo sul desktop. Ho utilizzato questo metodo un tempo, ma non avevo mai guardato il file del collegamento. E si è rivelato che questo collegamento è un normale file di testo con estensione .sap. E se lo avvii in Windows, si aprirà SAP GUI con i parametri specificati in questo file. «Bingo!»

Il formato di questo file è circa il seguente (potrebbe includere anche la transazione da avviare all'inizio, ma l'ho omessa):

[Sistema]
Nome=SID
Cliente=200
[Utente]
Nome=
Lingua=RU
Password=
[Funzione]
Titolo=
[Configurazione]
GuiSize=Massimizzato
[Opzioni]
Reuse=0

Sembra che ci sia tutto ciò di cui abbiamo bisogno: l'identificativo del sistema, il mandante, il nome utente e persino la password. E ci sono anche parametri aggiuntivi: Title — titolo della finestra, GuiSize — dimensione della finestra aperta (a schermo intero o meno) e Reuse — se aprire necessariamente una nuova finestra o utilizzare quella già aperta con lo stesso sistema. Ma subito è emerso un problema: nella SAP Logon non era possibile impostare la password, il campo era bloccato. Si è scoperto che è stato fatto per motivi di sicurezza: tutti i collegamenti creati nel SAP Logon vengono memorizzati in un file sapshortcut.ini (accanto a saplogon.ini nel profilo utente di Windows) e lì, anche se sono crittografati, non lo sono in modo eccessivo e con un po' di impegno possono essere decifrati. Ma è possibile abilitare questa opzione modificando il valore di un parametro nel registro (per impostazione predefinita il valore 0):

Editor del Registro di Windows Versione 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"AbilitaPassword"="1"

Sblocca il campo «Password» nel modulo di creazione del collegamento in SAP Logon:

Avvio di SAP GUI dal browser

E quando si inserisce la password in questo campo, verrà posizionata nella riga corrispondente.
sapshortcut.ini, ma se si trascina l'icona sul desktop, non appare lì — ma è possibile aggiungerla manualmente. La password è crittografata, per 111111 sarà del seguente tipo: PW_49B02219D1F6, per 222222 — PW_4AB3211AD2F5. Ma ci interessa di più il fatto che questa password viene crittografata in un modo che non dipende dal PC specifico e, se ripristiniamo la password iniziale, è possibile utilizzare un valore predefinito in questo campo. E se vogliamo utilizzare una password creata a caso — dovremo capire l'algoritmo di questa crittografia. Ma, a giudicare dagli esempi forniti, non sarà difficile farlo. A proposito, in SAP GUI 7.40 questo campo è completamente scomparso dal modulo, ma il file con la password compilata viene comunque riconosciuto correttamente.

Quindi, risulta che nel browser è sufficiente fare clic sul link a un file con estensione .sap e nel formato richiesto — e verrà proposto di aprirlo come un file di tipo SAP GUI Shortcut (naturalmente su un PC con SAP GUI installato) e ci aprirà la finestra di SAP GUI con i parametri specificati (se la coppia SID e mandante è presente nell'elenco di SAP Logon su questo PC).

Ma, è chiaro che nessuno creerà e copierà in anticipo i file sul sito — devono essere generati in base ai parametri richiesti. Ad esempio, è possibile creare uno script in PHP per generare le icone (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 = 'IT'; };
$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=Accesso al sistemarn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>

Se non si assegnano nome utente e password, otterremo la seguente finestra con la richiesta di login e password:

Avvio di SAP GUI dal browser

Se viene passato solo il login, il campo login sarà compilato e il campo password rimarrà vuoto. Se invece passiamo sia il login che la password, ma la chiave EnablePassword nel registro del PC dell'utente è impostata a 0 nella sezione [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity], otterremo lo stesso risultato. Solo se questa chiave è impostata a 1 e passiamo sia il nome che la password iniziale, il sistema richiederà immediatamente di inserire due volte una nuova password permanente. Questo era ciò che si doveva ottenere.

In definitiva, abbiamo il seguente insieme di opzioni esaminate come illustrazione di quanto 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', '');"/>Esempio 1: Esegui sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Esempio 2: Apri sapshcut.exe (URI)</a><br>
<a href='/it/sapshcut.php/?SID=SID&Client=200&User=test'>Esempio 3: Apri file .sap (Scorciatoia SAP GUI)</a><br>
</body>
</html>

L'ultima opzione è quella che più si adatta a me. Ma si possono anche usare, ad esempio, la generazione di file CMD invece di generare collegamenti SAP, che si apriranno anch'essi nell'interfaccia SAP GUI se aperti dal browser. Di seguito è riportato un esempio (sapguicmd.php) di avvio diretto di SAP GUI indicando la stringa di connessione completa, senza la necessità di avere SAP Logon configurato:

<?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 Accesso a ".$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";
?>

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS - ProHoster