Démarrage de SAP GUI à partir d'un navigateur

J'ai d'abord écrit cet article sur mon blog , pour que plus tard je ne regarde plus et ne me souvienne plus, mais comme personne ne lit le blog, je voulais partager cette information avec tout le monde, tout d'un coup je pouvais l'utiliser.

Tout en travaillant sur l'idée d'un service de réinitialisation de mot de passe dans les systèmes SAP R / 3, la question s'est posée - comment démarrer l'interface graphique SAP avec les paramètres nécessaires à partir du navigateur? Étant donné que cette idée impliquait l'utilisation d'un service Web qui répond d'abord à une demande SOAP de l'interface graphique SAP et envoie un e-mail avec un lien vers une page Web avec un script de réinitialisation de mot de passe à l'initial, puis affiche un message à l'utilisateur sur la réinitialisation réussie du mot de passe et affiche ce mot de passe très initial , alors je voudrais que sur cette page il y ait aussi un lien pour lancer SAP GUI. De plus, pour que ce lien ouvre le système souhaité, et même, de préférence, immédiatement avec les champs de login et de mot de passe renseignés: l'utilisateur n'aurait qu'à renseigner deux fois un mot de passe productif.

Le démarrage de SAP Logon n'était pas intéressant pour nous, et lors du démarrage de sapgui.exe, il était impossible de spécifier le client et le nom d'utilisateur, mais il était possible de démarrer le système non défini dans SAP Logon. D'un autre côté, le démarrage de SAP GUI avec des paramètres de serveur arbitraires n'était pas particulièrement pertinent: si nous résolvons le problème de réinitialisation du mot de passe de l'utilisateur, alors il a probablement déjà la bonne ligne dans SAP Logon, avec les paramètres dont il a besoin et n'a pas à se soucier des siens. Mais la technologie SAP GUI Shortcut et le programme réel sapshcut.exe, qui permettaient de démarrer SAP GUI à l'aide d'un certain «raccourci», répondaient aux exigences spécifiées.

La solution au problème sur le front: exécuter sapshcut.exe directement à partir du navigateur à l'aide de l'objet 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 solution est mauvaise: premièrement, cela ne fonctionne que dans Internet Explorer, et deuxièmement, cela nécessite des paramètres de sécurité appropriés dans le navigateur, ce qui peut être interdit au niveau du domaine dans l'organisation, et même s'il est activé, le navigateur donne à l'utilisateur une fenêtre avec un avertissement effrayant:



J'ai déterré la solution n ° 2 sur Internet: créer mon propre protocole web . Il vous permet d'exécuter l'application dont nous avons besoin en utilisant le lien indiquant le protocole que nous enregistrons nous-mêmes dans Windows dans le registre de la section HKEY_CLASSES_ROOT. Étant donné que le raccourci SAP GUI dans cette section a sa propre sous-section, vous pouvez ajouter le paramètre de chaîne de protocole URL avec une valeur vide:



Ce protocole lance sapgui.exe avec le paramètre / SHORTCUT , ce dont nous avons besoin:



Eh bien, ou si nous voulons créer un protocole arbitraire en général (par exemple, sapshcut ), vous pouvez l'enregistrer en utilisant le fichier reg suivant:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\sapshcut]
@="sapshcut Handler"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\sapshcut\DefaultIcon]
@="sapshcut.exe"
[HKEY_CLASSES_ROOT\sapshcut\shell]
[HKEY_CLASSES_ROOT\sapshcut\shell\open]
[HKEY_CLASSES_ROOT\sapshcut\shell\open\command]
@="sapshcut.exe \"%1\""

Maintenant, si nous faisons un lien sur la page Web indiquant le protocole Sapgui.Shortcut.File de la même manière:

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

nous devrions voir une fenêtre comme:



Et tout semble aller bien, mais lorsque vous cliquez sur le bouton "Autoriser", nous voyons:



Oups, le navigateur a transformé l'espace en% 20. Eh bien, d'autres caractères seront également encodés dans leur code numérique avec un symbole de pourcentage. Et le plus désagréable est que rien ne peut être fait ici au niveau du navigateur (tout est fait selon la norme) - le navigateur n'aime pas ces caractères et le shell Windows ne fonctionne pas avec de telles valeurs codées. Et encore un moins - la chaîne entière est passée en paramètre, y compris le nom du protocole et même les deux points ( sapgui.shortcut.file :) . De plus, bien que le même sapshcut.exe puisse éliminer tout ce qui n'est pas un paramètre pour lui (il commence par le symbole «-», puis le nom, «=» et la valeur), c'est-à-dire une ligne de la forme " sapgui.shortcut.file: -system = SID " continue de rouler, puis sans espace " sapgui.shortcut.file: -system = SID " ne fonctionne plus.

Il s'avère que, en principe, il existe deux options pour utiliser le protocole URI:

  1. Utilisation sans paramètres: nous créons tout un tas de protocoles pour tous nos systèmes de type SIDMANDT , tels que AAA200 , BBB200 , etc. Si vous avez juste besoin de démarrer le système souhaité, l'option fonctionne tout à fait, mais dans notre cas, cela ne fonctionne pas, car au moins vous souhaitez également transférer la connexion de l'utilisateur, mais vous ne pouvez pas le faire de cette façon.
  2. Utilisation d'un wrapper pour appeler sapshcut.exe ou sapgui.exe . L'essence de ce programme est simple - il doit prendre la ligne que le navigateur lui transmettra via le protocole Web et le transformer en la représentation que Windows accepte, c'est-à-dire retour transforme tous les codes de caractères en caractères (peut-être même analyse la chaîne par paramètres) et appelle déjà l'interface graphique SAP garantie par la commande correcte. Dans notre cas, cela ne convient pas non plus (donc je ne l'ai même pas écrit), car il ne nous suffit pas d'ajouter un protocole sur tous les PC des utilisateurs (dans le domaine, cela ne va toujours nulle part, même s'il vaut mieux éviter cette pratique), mais ici il faudra en plus placez le programme sur un PC, et même surveillez-le constamment afin qu'il ne disparaisse pas lors de la réinstallation du logiciel sur un PC.

C'est-à-dire cette option est également rejetée car elle ne nous convient pas.

Ensuite, j'ai commencé à penser que je devrais dire au revoir à l'idée de démarrer l'interface graphique SAP avec les paramètres nécessaires à partir du navigateur, mais j'ai eu l'idée que vous pouvez créer un raccourci dans SAP Logon et le copier sur le bureau. J'ai utilisé cette méthode une fois, mais avant cela, je n'avais pas examiné spécifiquement le fichier de raccourci. Et il s'est avéré que ce raccourci est un fichier texte brut avec l'extension .sap . Et si vous l'exécutez sous Windows, l'interface graphique SAP démarre avec les paramètres spécifiés dans ce fichier. "Bingo!"

Le format de ce fichier est approximativement le suivant (il se peut qu'une transaction soit toujours lancée au démarrage, mais je l'ai omise):

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

Il semble que ce soit tout ce qui est nécessaire: un identifiant système, un client, un nom d'utilisateur et même un mot de passe. Et même des paramètres supplémentaires: Titre - le titre de la fenêtre, GuiSize - la taille de la fenêtre lancée (plein écran ou non) et Réutiliser - que ce soit pour ouvrir une nouvelle fenêtre ou utiliser une fenêtre déjà ouverte avec le même système. Mais immédiatement une nuance est sortie - il s'est avéré qu'il était impossible de définir un mot de passe dans SAP Logon, la ligne a été bloquée. Il s'est avéré que cela a été fait pour des raisons de sécurité: il stocke tous les raccourcis créés dans SAP Logon dans le fichier sapshortcut.ini (à côté de saplogon.ini dans le profil utilisateur Windows) et bien qu'ils y soient cryptés, ils peuvent être trop cryptés et si vous le souhaitez. décoder. Mais vous pouvez également résoudre ce problème en modifiant la valeur d'un paramètre dans le Registre (la valeur par défaut est 0 ):

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\SAP\SAPShortcut\Security]
"EnablePassword"="1"

Cela déverrouille le champ Mot de passe du formulaire de raccourci dans SAP Logon pour entrer:



Et lors de la saisie d'un mot de passe dans ce champ, il sera placé dans la ligne correspondante
sapshortcut.ini , mais lorsque vous faites glisser un raccourci vers le bureau, il n'y apparaît pas - mais vous pouvez l'ajouter manuellement. Le mot de passe est crypté, pour 111111 il sera de la forme suivante: PW_49B02219D1F6, pour 222222 - PW_4AB3211AD2F5. Mais nous sommes plus intéressés par le fait que ce mot de passe est crypté d'une manière indépendante du PC spécifique, et si nous réinitialisons le mot de passe au mot de passe initial, nous pouvons utiliser une valeur précédemment connue dans ce champ. Eh bien, si nous voulons utiliser un mot de passe généré aléatoirement, nous devrons comprendre l'algorithme de ce chiffre. Mais à en juger par les exemples ci-dessus, cela ne sera pas difficile. Soit dit en passant, dans SAP GUI 7.40, ce champ a généralement disparu du formulaire, mais il perçoit correctement le fichier avec le mot de passe rempli.

Autrement dit, il s'avère que dans le navigateur, il suffit de cliquer sur le lien vers le fichier avec l'extension .sap et avec le format souhaité - et il proposera de l'ouvrir en tant que fichier de type SAP GUI Shortcut (naturellement sur un PC avec SAP GUI installé) et ouvrira la fenêtre SAP GUI avec le spécifié (si le SID et la paire de clients figurent dans la liste de connexion SAP sur ce PC).

Mais il est clair que personne ne créera et ne stockera des fichiers sur le site simplement au préalable - ils doivent être générés en fonction des paramètres nécessaires. Par exemple, vous pouvez créer un script en PHP pour générer des raccourcis ( 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]\r\n"; echo "Name=".$SID."\r\n"; echo "Client=".$Client."\r\n"; echo "[User]\r\n"; echo "Name=".$Username."\r\n"; echo "Language=".$Lang."\r\n"; if($Password<>'') echo "Password=".$Password."\r\n"; echo "[Function]\r\n"; if($Title<>'') {echo "Title=".$Title."\r\n";} else {echo "Title=  \r\n";}; echo "[Configuration]\r\n"; if($Size=='max') { echo "GuiSize=Maximized\r\n"; }; echo "[Options]\r\n"; echo "Reuse=0\r\n"; ?> 

Si vous ne spécifiez pas de nom d'utilisateur et de mot de passe, nous obtenons la fenêtre suivante à partir des invites de connexion et de mot de passe:



Si vous transférez uniquement la connexion, le champ de connexion sera rempli et le champ de mot de passe est vide. Si nous donnons à l'utilisateur à la fois le nom d'utilisateur et le mot de passe, mais que la clé EnablePassword de l'utilisateur dans la section [HKEY_CURRENT_USER \ Software \ SAP \ SAPShortcut \ Security] est définie sur 0 sur le PC de l'utilisateur, nous obtiendrons la même chose. Et seulement si cette clé est définie sur 1 et que nous transférons à la fois le nom et le mot de passe initial, le système vous demandera immédiatement d'entrer deux fois le nouveau mot de passe permanent. Ce qui était nécessaire pour recevoir.

Par conséquent, nous avons l'ensemble d'options suivant considéré comme une illustration de tout ce qui précède:

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

La dernière option m'est venue. Mais vous pouvez également utiliser, par exemple, la génération de fichiers CMD au lieu de générer des raccourcis SAP qui, lorsqu'ils sont ouverts à partir d'un navigateur, ouvriront également la fenêtre SAP GUI. Voici un exemple ( sapguicmd.php ) de démarrage direct de l'interface graphique SAP avec la chaîne de connexion complète, sans avoir à configurer 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 off\r\n"; echo "chcp 1251\r\n"; echo "echo   ".$Title."\r\n"; echo "set SAP_CODEPAGE=1504\r\n"; echo 'if exist "%ProgramFiles(x86)%\SAP\FrontEnd\SapGui\sapgui.exe" set gui=%ProgramFiles(x86)%\SAP\FrontEnd\SapGui\sapgui.exe'."\r\n"; echo 'if exist "%ProgramFiles%\SAP\FrontEnd\SapGui\sapgui.exe" set gui=%ProgramFiles%\SAP\FrontEnd\SapGui\sapgui.exe'."\r\n"; 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 "\r\n"; echo '"%gui%" %logon%'."\r\n"; ?> 

Source: https://habr.com/ru/post/fr446998/


All Articles