Avvio della GUI di SAP da un browser

Ho scritto questo articolo per la prima volta nel mio blog, per non cercarlo e ricordarlo di nuovo in seguito, ma poiché nessuno legge il blog, volevo condividere queste informazioni con tutti, nel caso qualcuno le trovasse utili.

Mentre lavoravo all'idea di un servizio di reimpostazione della password nei sistemi SAP R/3, è sorta una domanda: come avviare SAP GUI con i parametri necessari dal browser? Poiché questa idea prevedeva l'utilizzo di un servizio web, prima rispondendo a una richiesta SOAP dalla GUI SAP e inviando una lettera con un collegamento a una pagina web con uno script per reimpostare la password su quella iniziale, quindi visualizzarla all'utente un messaggio relativo alla corretta reimpostazione della password e alla visualizzazione di questa password iniziale, vorrei che questa pagina avesse anche un collegamento per avviare la GUI SAP. Inoltre, questo collegamento dovrebbe aprire il sistema desiderato e, preferibilmente, con i campi login e password compilati contemporaneamente: l'utente dovrebbe inserire solo due volte la password produttiva.

L'avvio di SAP Logon non era interessante per il nostro scopo e durante l'esecuzione di sapgui.exe era impossibile specificare il client 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 server arbitrari non era particolarmente rilevante: se stiamo risolvendo il problema di reimpostare la password di un utente, molto probabilmente ha già la riga necessaria in SAP Logon, con le impostazioni di cui ha bisogno, e lì non c'è bisogno di scherzare con i suoi. Ma i requisiti specificati sono stati soddisfatti dalla tecnologia SAP GUI Shortcut e dal programma sapshcut.exe stesso, che ha permesso di avviare la GUI SAP utilizzando uno specifico "scorciatoia".

Risolvere il problema direttamente: 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 è pessima: in primo luogo funziona solo in Internet Explorer, in secondo luogo richiede adeguate impostazioni di sicurezza nel browser, che in un'organizzazione possono essere vietate a livello di dominio e, anche se consentito, il browser visualizza una finestra con un'immagine spaventosa avviso per l'utente:

Avvio della GUI di SAP da un browser

Ho trovato la soluzione n. 2 su Internet: creando il tuo protocollo web. Ci consente di avviare l'applicazione di cui abbiamo bisogno utilizzando un collegamento che indica il protocollo, che noi stessi registriamo in Windows nel registro nella sezione HKEY_CLASSES_ROOT. Poiché SAP GUI Shortcut ha una propria sottosezione in questa sezione, puoi aggiungere lì il parametro stringa Protocollo URL con un valore vuoto:

Avvio della GUI di SAP da un browser

Questo protocollo inizia sapgui.exe con parametro /Scorciatoia, che è esattamente ciò di cui abbiamo bisogno:

Avvio della GUI di SAP da un browser

Bene, o se vogliamo creare un protocollo completamente arbitrario (ad esempio, sapshcut), quindi puoi registrarlo utilizzando il 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""

Ora, se creiamo un collegamento su una pagina web che indica il protocollo Sapgui.Shortcut.File In un modo simile:

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

Dovremmo vedere una finestra come questa:

Avvio della GUI di SAP da un browser

E tutto sembra fantastico, ma quando fai clic sul pulsante "Consenti" vediamo:

Avvio della GUI di SAP da un browser

Spiacenti, il browser ha trasformato la barra spaziatrice in %20. Bene, anche gli altri caratteri verranno codificati nel proprio codice numerico con un simbolo di percentuale. E la cosa più spiacevole è che qui non si può fare nulla a livello del browser (tutto qui è fatto secondo lo standard): al browser non piacciono questi caratteri e l'interprete dei comandi di Windows non funziona con tali valori codificati. E un altro aspetto negativo: l'intera stringa viene passata come parametro, incluso il nome del protocollo e persino i due punti (sapgui.shortcut.file:). Inoltre, sebbene lo stesso sapshcut.exe può scartare tutto ciò che non è un suo parametro (inizia con il simbolo "-", poi il nome, "=" e il valore), ad es. una riga come "sapgui.shortcut.file: -system=SID"funzionerà comunque, quindi senza spazio"sapgui.shortcut.file:-system=SID"non lavora più.

Risulta che, in linea di principio, ci sono due opzioni per utilizzare il protocollo URI:

  1. Utilizzo senza parametri: creiamo un sacco di protocolli per tutti i nostri sistemi di questo tipo SIDMANDT, Come AAA200, BBB200 e così via. Se hai solo bisogno di avviare il sistema desiderato, l'opzione è abbastanza praticabile, ma nel nostro caso non è adatta, poiché almeno vorresti trasferire il login dell'utente, ma ciò non può essere fatto in questo modo.
  2. Utilizzando un programma wrapper per chiamare sapshcut.exe o sapgui.exe. L'essenza di questo programma è semplice: deve prendere la stringa che il browser gli trasmette tramite il protocollo web e trasformarla nella rappresentazione che riceve Windows, ad es. riconverte tutti i codici dei caratteri in caratteri (forse analizza anche la stringa in base ai parametri) e richiama già SAP GUI con un comando corretto garantito. Anche nel nostro caso non è del tutto adatto (ecco perché non l'ho nemmeno scritto), perché non ci basta aggiungere il protocollo su tutti i PC degli utenti (all'interno di un dominio va comunque bene, anche se è anche meglio evitare questa pratica), ma qui avremo bisogno di più posizionare il programma sul PC, e anche accertarci costantemente che non scompaia quando il software viene reinstallato sul PC.

Quelli. Scartiamo anche questa opzione in quanto non adatta a noi.

A questo punto stavo già iniziando a pensare che avrei dovuto dire addio all'idea di avviare SAP GUI con i parametri necessari dal browser, ma poi mi è venuta l'idea che in SAP Logon si possa creare una scorciatoia e copialo sul desktop. Ho usato questo metodo una volta, ma prima non avevo guardato specificamente il file di collegamento. E si è scoperto che questo collegamento è un normale file di testo con estensione .linfa. E se lo esegui su Windows, SAP GUI verrà avviato con i parametri specificati in questo file. "Bingo!"

Il formato di questo file è approssimativamente il seguente (potrebbe anche esserci una transazione avviata all'avvio, ma l'ho omessa):

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

Sembra che tutto ciò che serve: un identificatore di sistema, un client, un nome utente e persino una password. E anche parametri aggiuntivi: Titolo - titolo della finestra, GuiSize — dimensione della finestra in esecuzione (schermo intero o meno) e Riutilizzo — se sia necessario aprire una nuova finestra o utilizzarne una già aperta con lo stesso sistema. Ma è emersa immediatamente una sfumatura: si è scoperto che non era possibile impostare la password in SAP Logon, la linea era bloccata. Si è scoperto che ciò è stato fatto per motivi di sicurezza: memorizza tutti i collegamenti creati in SAP Logon in un file sapshortcut.ini (Vicino saplogon.ini nel profilo utente di Windows) e lì, sebbene siano crittografati, non sono crittografati troppo forte e, se lo si desidera, possono essere decrittografati. Ma puoi risolvere questo problema modificando il valore di un parametro nel registro (il valore predefinito è 0):

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

Ciò sblocca il campo Password per l'immissione nel modulo di creazione del collegamento in SAP Logon:

Avvio della GUI di SAP da un browser

E quando inserisci una password in questo campo, verrà inserita nella riga corrispondente
sapshortcut.ini, ma quando trascini un collegamento sul desktop, non viene visualizzato lì, ma puoi aggiungerlo manualmente. La password è crittografata, per 111111 sarà la seguente: PW_49B02219D1F6, per 222222 - PW_4AB3211AD2F5. Ma a noi interessa di più il fatto che questa password sia crittografata in un modo, indipendentemente dal PC specifico, e se reimpostiamo la password su quella iniziale, possiamo utilizzare un valore già noto in questo campo. Ebbene, se vogliamo utilizzare una password creata casualmente, dovremo comprendere l'algoritmo di questo codice. Ma a giudicare dagli esempi forniti, questo non sarà difficile da realizzare. A proposito, in SAP GUI 7.40 questo campo è completamente scomparso dal modulo, ma accetta correttamente un file con una password compilata.

Cioè, si scopre che nel browser devi solo fare clic sul collegamento a un file con l'estensione .sap e il formato desiderato - e ti offrirà di aprirlo come file come SAP GUI Shortcut (naturalmente su un PC con SAP GUI installata) e aprirà una finestra SAP GUI con i parametri specificati (se la coppia SID e client è nell'elenco di accesso SAP su questo PC).

Ma è chiaro che nessuno creerà semplicemente i file in anticipo e li memorizzerà sul sito: devono essere generati in base ai parametri necessari. Ad esempio, puoi creare uno script PHP per generare scorciatoie (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 non specifichi nome utente e password, verrà visualizzata la seguente finestra che richiede login e password:

Avvio della GUI di SAP da un browser

Se passi solo il login, il campo login verrà compilato e il campo password sarà vuoto. Se diamo all'utente sia un login che una password, ma l'utente sul PC ha la chiave EnablePassword nel registro nella sezione [HKEY_CURRENT_USERSoftwareSAPSAPSHortcutSecurity] impostata su 0, otteniamo la stessa cosa. E solo se questa chiave è impostata su 1 e passiamo sia il nome che la password iniziale, il sistema ti chiederà immediatamente di inserire due volte una nuova password permanente. Questo è ciò che dovevamo ottenere.

Di conseguenza, abbiamo la seguente serie di opzioni considerate come illustrazione di tutto 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', '');"/>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 andava bene. Ma invece di generare scorciatoie SAP, puoi anche utilizzare, ad esempio, la generazione di file CMD che, una volta aperti da un browser, apriranno anche la finestra della GUI SAP. Di seguito è riportato un esempio (sapguicmd.php) avvia direttamente la GUI SAP con la stringa di connessione completa, senza la necessità di configurare l'accesso 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";
?>

Fonte: habr.com

Aggiungi un commento