Lancer SAP GUI depuis un navigateur

J'ai d'abord écrit cet article dans mon Blog, pour ne pas chercher et mémoriser plus tard, mais comme personne ne lit le blog, j'ai voulu partager cette information avec tout le monde, au cas où quelqu'un la trouverait utile.

En travaillant sur l'idée d'un service de réinitialisation de mot de passe dans les systèmes SAP R/3, une question s'est posée : comment lancer SAP GUI avec les paramètres nécessaires depuis le navigateur ? Puisque cette idée impliquait l'utilisation d'un service Web, il fallait d'abord répondre à une requête SOAP de SAP GUI et envoyer une lettre avec un lien vers une page Web avec un script pour réinitialiser le mot de passe au mot de passe initial, puis l'afficher à l'utilisateur. un message sur la réinitialisation réussie du mot de passe et l'affichage de ce tout premier mot de passe, alors j'aimerais que cette page contienne également un lien pour lancer SAP GUI. De plus, ce lien devrait ouvrir le système souhaité, et, de préférence, avec les champs login et mot de passe renseignés en une seule fois : l'utilisateur n'aurait qu'à remplir deux fois le mot de passe productif.

Le lancement de SAP Logon n'était pas intéressant pour notre objectif, et lors de l'exécution de sapgui.exe, il était impossible de spécifier le client et le nom d'utilisateur, mais il était possible de lancer un système non défini dans SAP Logon. D'un autre côté, lancer SAP GUI avec des paramètres de serveur arbitraires n'était pas particulièrement pertinent : si nous résolvons le problème de la réinitialisation du mot de passe d'un utilisateur, alors il dispose très probablement déjà de la ligne nécessaire dans SAP Logon, avec les paramètres dont il a besoin, et là n'est pas nécessaire de jouer avec le sien. Mais les exigences spécifiées étaient remplies par la technologie SAP GUI Shortcut et le programme sapshcut.exe lui-même, qui permettaient de lancer SAP GUI à l'aide d'un « raccourci » spécifique.

Résoudre le problème de front : lancer sapshcut.exe directement depuis le navigateur à l'aide d'un 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, elle ne fonctionne que dans Internet Explorer, deuxièmement, elle nécessite des paramètres de sécurité appropriés dans le navigateur, ce qui dans une organisation peut être interdit au niveau du domaine, et même si cela est autorisé, le navigateur affiche une fenêtre avec un effrayant avertissement à l'utilisateur :

Lancer SAP GUI depuis un navigateur

J'ai trouvé la solution n°2 sur Internet : créer votre propre protocole Web. Nous permet de lancer l'application dont nous avons besoin à l'aide d'un lien indiquant le protocole, que nous enregistrons nous-mêmes sous Windows dans le registre dans la section HKEY_CLASSES_ROOT. Étant donné que SAP GUI Shortcut a sa propre sous-section dans cette section, vous pouvez y ajouter le paramètre de chaîne de protocole URL avec une valeur vide :

Lancer SAP GUI depuis un navigateur

Ce protocole démarre sapgui.exe avec paramètre /RACCOURCI, c'est exactement ce dont nous avons besoin :

Lancer SAP GUI depuis un navigateur

Eh bien, ou si nous voulons créer un protocole complètement arbitraire (par exemple, coupe de sève), vous pouvez alors l'enregistrer en utilisant le fichier reg suivant :

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

Maintenant, si on fait un lien sur une page web indiquant le protocole Sapgui.Shortcut.Fichier d'une manière similaire:

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

Nous devrions voir une fenêtre comme celle-ci :

Lancer SAP GUI depuis un navigateur

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

Lancer SAP GUI depuis un navigateur

Oups, le navigateur a transformé la barre d'espace en %20. Eh bien, d'autres caractères seront également codés dans leur propre 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 ici est fait selon la norme) - le navigateur n'aime pas de tels caractères et l'interpréteur de commandes Windows ne fonctionne pas avec de telles valeurs codées. Et encore un inconvénient - 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 peut supprimer tout ce qui n'est pas un paramètre pour lui (commence par le symbole « - », puis le nom, « = » et la valeur), c'est-à-dire une ligne comme "sapgui.shortcut.file : -system=SID"ça marchera quand même, alors sans espace"sapgui.shortcut.file:-system=SID"ne fonctionne plus.

Il s'avère qu'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 du type SIDMANDTtype AAA200, BBB200 et ainsi de suite. Si vous avez simplement besoin de démarrer le système souhaité, l'option est tout à fait réalisable, mais dans notre cas, elle ne convient pas, car au moins vous souhaiteriez transférer la connexion utilisateur, mais cela ne peut pas être fait de cette façon.
  2. Utiliser un programme wrapper pour appeler sapshcut.exe ou sapgui.exe. L'essence de ce programme est simple : il doit prendre la chaîne que le navigateur lui transmet via le protocole Web et la transformer en la représentation que Windows reçoit, c'est-à-dire transforme tous les codes de caractères en caractères (peut-être même analyse la chaîne en fonction des paramètres) et appelle déjà SAP GUI avec une commande correcte garantie. Dans notre cas, ce n'est pas non plus tout à fait adapté (c'est pourquoi je ne l'ai même pas écrit), car il ne suffit pas d'ajouter le protocole sur tous les PC des utilisateurs (au sein d'un domaine, cela reste toujours bien, même s'il est également préférable de évitez cette pratique), mais ici nous aurons besoin de placer davantage le programme sur le PC, et aussi de veiller constamment à ce qu'il ne disparaisse pas lorsque le logiciel est réinstallé sur le PC.

Ceux. Nous rejetons également cette option car elle ne nous convient pas.

À ce stade, je commençais déjà à penser que je devrais dire au revoir à l'idée de lancer SAP GUI avec les paramètres nécessaires à partir du navigateur, mais ensuite l'idée m'est venue que vous pouvez créer un raccourci dans SAP Logon et copiez-le sur votre bureau. J'ai utilisé cette méthode une fois, mais avant cela, je n'avais pas spécifiquement regardé le fichier de raccourci. Et il s'est avéré que ce raccourci est un fichier texte ordinaire avec l'extension .sève. Et si vous l'exécutez sous Windows, SAP GUI se lancera avec les paramètres spécifiés dans ce fichier. « Bingo ! »

Le format de ce fichier est approximativement le suivant (il peut aussi y avoir une transaction lancée au démarrage, mais je l'ai omis) :

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

Il semble que tout ce qu'il faut : 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, Taille Gui — taille de la fenêtre en cours d'exécution (plein écran ou non) et Réutilisation — s'il est nécessaire d'ouvrir une nouvelle fenêtre ou d'en utiliser une déjà ouverte avec le même système. Mais une nuance est immédiatement apparue : il s'est avéré que le mot de passe dans SAP Logon n'a pas pu être défini, la ligne a été bloquée. Il s'est avéré que cela avait été fait pour des raisons de sécurité : tous les raccourcis créés dans SAP Logon sont stockés dans un fichier. sapshortcut.ini (À proximité saplogon.ini dans le profil utilisateur Windows) et là, bien qu'ils soient cryptés, ils ne sont pas trop fortement cryptés et, si vous le souhaitez, ils peuvent être déchiffrés. Mais vous pouvez 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_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"

Cela déverrouille le champ Mot de passe pour la saisie sur le formulaire de création de raccourci dans SAP Logon :

Lancer SAP GUI depuis un navigateur

Et lorsque vous saisirez 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'y ajouter manuellement. Le mot de passe est crypté, pour 111111 il sera le suivant : 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 à celui initial, nous pouvons alors utiliser une valeur pré-connue dans ce champ. Eh bien, si nous voulons utiliser un mot de passe créé aléatoirement, nous devrons comprendre l'algorithme de ce chiffre. Mais à en juger par les exemples donnés, cela ne sera pas difficile à faire. D'ailleurs, dans SAP GUI 7.40, ce champ a complètement disparu du formulaire, mais il accepte correctement un fichier avec un mot de passe renseigné.

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

Mais il est clair que personne ne créera simplement des fichiers à l'avance et ne les stockera sur le site - ils doivent être générés en fonction des paramètres nécessaires. Par exemple, vous pouvez créer un script 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]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 vous ne spécifiez pas de nom d'utilisateur et de mot de passe, vous obtiendrez la fenêtre suivante vous demandant un identifiant et un mot de passe :

Lancer SAP GUI depuis un navigateur

Si vous transmettez uniquement le login, le champ login sera rempli et le champ mot de passe sera vide. Si nous donnons à l'utilisateur à la fois un identifiant et un mot de passe, mais que l'utilisateur sur le PC a la clé EnablePassword dans le registre de la section [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] définie sur 0, alors nous obtenons la même chose. Et seulement si cette clé est définie sur 1 et que nous transmettons à la fois le nom et le mot de passe initial, le système vous demandera immédiatement de saisir deux fois un nouveau mot de passe permanent. C'est ce qu'il nous fallait obtenir.

En conséquence, nous disposons de l’ensemble suivant d’options considérées pour illustrer 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 me convenait. Mais au lieu de générer des raccourcis SAP, vous pouvez également utiliser, par exemple, la génération de fichiers CMD qui, lorsqu'ils sont ouverts à partir d'un navigateur, ouvriront également pour vous la fenêtre SAP GUI. Ci-dessous un exemple (sapguicmd.php) lancez directement SAP GUI avec la chaîne de connexion complète, sans avoir besoin de 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 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: habr.com

Ajouter un commentaire