J'ai d'abord écrit cet article dans mon , pour ne pas avoir à chercher et à me souvenir de nouveau, mais comme personne ne lit le blog, j'ai voulu partager cette information avec tout le monde, au cas où elle pourrait être utile.
Lors du travail 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 lancer SAP GUI avec les paramètres nécessaires depuis le navigateur ? Étant donné que cette idée impliquait l'utilisation d'un service web, d'abord exécuté sur demande SOAP depuis SAP GUI et envoyant un e-mail avec un lien vers la page web contenant le script de réinitialisation de mot de passe initial, puis l'affichage d'un message à l'utilisateur confirmant la réinitialisation réussie du mot de passe et montrant ce mot de passe initial, il était souhaitable que cette page contienne également un lien pour lancer SAP GUI. De plus, ce lien devait ouvrir le système voulu, de préférence avec les champs de connexion et de mot de passe déjà remplis : l'utilisateur n'aurait alors qu'à entrer deux fois le mot de passe de production.
Le lancement de SAP Logon ne nous intéressait pas pour notre objectif, et il était impossible de spécifier le mandant et le nom d'utilisateur lors du lancement de sapgui.exe, bien qu'il soit possible de lancer un système non défini dans SAP Logon. D'un autre côté, le lancement de SAP GUI avec des paramètres de serveur aléatoires n'était pas particulièrement pertinent : si nous résolvons le problème de réinitialisation du mot de passe d'un utilisateur, il est fort probable qu'il ait déjà la ligne nécessaire dans SAP Logon, avec les paramètres qui lui conviennent, et qu'il n'est pas nécessaire d'utiliser les nôtres. Cependant, la technologie SAP GUI Shortcut et le programme sapshcut.exe répondaient aux exigences : elle permettait de lancer SAP GUI à l'aide d'un « raccourci » spécifique.
Solution directe : 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 : d'une part, elle ne fonctionne que dans Internet Explorer, d'autre part, elle nécessite des paramètres de sécurité appropriés dans le navigateur, qui peuvent être interdits au niveau du domaine dans l'organisation, et même s'ils sont autorisés, le navigateur affiche à l'utilisateur une fenêtre avec un avertissement inquiétant :

J'ai trouvé la solution n°2 sur Internet : Permet de lancer l'application souhaitée via un lien en spécifiant un protocole que nous enregistrons nous-mêmes dans Windows dans le registre sous la clé HKEY_CLASSES_ROOT. Étant donné que le SAP GUI Shortcut a son propre sous-dossier dans cette clé, nous pouvons y ajouter un paramètre de chaîne URL Protocol avec une valeur vide :

Ce protocole lance sapgui.exe avec le paramètre /SHORTCUT, ce qui est précisément ce dont nous avons besoin :

Ou si nous souhaitons créer un protocole complètement arbitraire (par exemple, sapshcut), nous pouvons l'enregistrer à l'aide du fichier reg suivant :
Éditeur du Registre Windows Version 5.00
[HKEY_CLASSES_ROOTsapshcut]
@="Gestionnaire sapshcut"
"URL Protocol"=""
[HKEY_CLASSES_ROOTsapshcutDefaultIcon]
@="sapshcut.exe"
[HKEY_CLASSES_ROOTsapshcutshell]
[HKEY_CLASSES_ROOTsapshcutshellopen]
[HKEY_CLASSES_ROOTsapshcutshellopencommand]
@="sapshcut.exe "%1""
Maintenant, si nous créons un lien avec spécification du protocole sur une page web Sapgui.Shortcut.File de cette manière :
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
une fenêtre de ce type devrait s'afficher :

Et tout semble parfait, mais en cliquant sur le bouton « Autoriser », nous constatons :

Oups, le navigateur a transformé l'espace en . D'autres symboles seront également codés dans leur code numérique avec le symbole pourcentage. Et le plus désagréable, c'est qu'il n'y a rien à faire au niveau du navigateur (tout cela est fait selon la norme) — le navigateur n'aime pas de tels symboles, et l'interpréteur de commandes Windows ne fonctionne pas avec ces valeurs encodées. Un autre inconvénient est qu'en tant que paramètre, toute la chaîne est transmise, y compris le nom du protocole et même les deux-points (sapgui.shortcut.file:). En fait, bien que le même sapshcut.exe sache écarter tout ce qui n'est pas un paramètre (commençant par le symbole « -«, suivi du nom, « = » et de la valeur), c'est-à-dire qu'une chaîne comme «sapgui.shortcut.file: -system=SID» fonctionnera encore, mais sans espace «sapgui.shortcut.file:-system=SID» cela ne fonctionnera plus.
Par conséquent, il existe en principe deux options pour utiliser le protocole URI :
- Utilisation sans paramètres : Nous créons une multitude de protocoles pour tous nos systèmes sous la forme de SIDMANDT, comme AAA200, BBB200 et ainsi de suite. Si l'objectif est de simplement lancer le système souhaité, cette option fonctionne très bien, mais dans notre cas, cela ne convient pas, car nous avons aussi envie de transmettre le login de l'utilisateur, ce qui ne peut pas être fait de cette manière.
- Utilisation d'un programme de wrapper pour l'appel sapshcut.exe ou sapgui.exe. Le principe de ce programme est simple : il doit prendre la chaîne qui lui est transmise par le navigateur via le protocole web et la convertir dans le format que Windows accepte, c'est-à-dire, il reconvertit tous les codes de caractères en caractères (il peut même analyser la chaîne par paramètres) et appelle déjà le SAP GUI avec la commande garantie de précision. Dans notre cas, cela ne convient pas non plus (c'est pourquoi je ne l'ai même pas écrit), car il est déjà insuffisant d'ajouter le protocole sur tous les PC des utilisateurs (dans le cadre du domaine, cela passe encore, bien que cela soit aussi une pratique à éviter), mais ici, il faudra également installer un programme supplémentaire sur le PC et veiller à ce qu'il ne disparaisse pas lors des réinstallations de logiciels sur le PC.
C'est-à-dire que nous rejetons également cette option comme inacceptable.
À ce stade, j'ai commencé à penser que je devrais renoncer à l'idée de lancer le SAP GUI avec les paramètres requis depuis le navigateur, mais là, une pensée m'est venue à l'esprit : dans SAP Logon, il est possible de créer un raccourci que l'on peut copier sur le bureau. J'avais utilisé cette méthode autrefois, mais je n'avais jamais regardé le fichier de raccourci spécialement. Il s'est avéré que ce raccourci est en fait un fichier texte ordinaire avec l'extension .sap. Et si je l'ouvre sous Windows, le SAP GUI se lancera avec les paramètres indiqués dans ce fichier. « Bingo ! »
Le format de ce fichier est à peu près le suivant (il peut y avoir aussi la transaction à lancer au démarrage, mais je l'ai omise) :
[System]
Nom=SID
Client=200
[User]
Nom=
Langue=RU
Mot de passe=
[Function]
Titre=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0
Il semble que tout soit nécessaire : l'identifiant du système, le mandant, le nom d'utilisateur et même le mot de passe. Et même des paramètres supplémentaires : Titre — le titre de la fenêtre, TailleGui — la taille de la fenêtre lancée (plein écran ou non) et Reuse — doit-on absolument ouvrir une nouvelle fenêtre ou utiliser celle déjà ouverte avec ce système. Mais un petit souci est apparu immédiatement : le mot de passe dans SAP Logon ne pouvait pas être saisi, le champ était bloqué. Il s'est avéré que cela a été fait pour des raisons de sécurité : tous les raccourcis créés dans SAP Logon sont stockés dans un fichier sapshortcut.ini (à côté de saplogon.ini dans le profil utilisateur Windows) et là, bien qu'ils soient chiffrés, ils ne le sont pas trop fortement, et avec un peu de volonté, ils peuvent être décodés. Mais on peut également le permettre en modifiant la valeur d'un paramètre dans le registre (la valeur par défaut est 0):
Éditeur du Registre Windows Version 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
Ce qui déverrouille le champ « Mot de passe » dans le formulaire de création de raccourci dans SAP Logon :

Et en entrant le mot de passe dans ce champ, il sera placé dans la ligne correspondante.
sapshortcut.ini, mais lorsque l'on glisse l'icône sur le bureau, elle n'apparaît pas là — mais on peut l'ajouter manuellement. Le mot de passe est chiffré, pour 111111 cela apparaîtra sous la forme : PW_49B02219D1F6, pour 222222 — PW_4AB3211AD2F5. Mais ce qui nous intéresse davantage, c'est que ce mot de passe est chiffré de manière unique, indépendante du PC spécifique, et si nous réinitialisons le mot de passe à sa valeur par défaut, nous pouvons utiliser une valeur connue d'avance dans ce champ. En revanche, si nous voulons utiliser un mot de passe créé de manière aléatoire, il faudra comprendre l'algorithme de ce chiffrement. Mais, d'après les exemples donnés, cela ne devrait pas être difficile. D'ailleurs, dans SAP GUI 7.40, ce champ a complètement disparu du formulaire, mais le fichier avec le mot de passe rempli est correctement interprété.
Cela signifie qu'il suffit de cliquer sur le lien vers un fichier avec l'extension .sap et dans le format requis dans le navigateur — et il proposera de l'ouvrir comme un fichier de type SAP GUI Shortcut (bien sûr sur un PC ayant installé SAP GUI) et ouvrira une fenêtre SAP GUI avec les paramètres indiqués (si la paire SID et mandant figure dans la liste SAP Logon sur ce PC).
Mais, il est évident que personne ne va créer et stocker des fichiers à l'avance sur le site — il faut les générer en fonction des paramètres nécessaires. Par exemple, on peut 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 = 'FR'; };
$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=Connexion au systèmern";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>
Si aucun nom d'utilisateur et mot de passe n'est spécifié, nous obtiendrons la fenêtre suivante avec la demande de connexion et de mot de passe :

Si l'on ne transmet que le nom d'utilisateur, le champ identifiant sera rempli, tandis que le champ mot de passe sera vide. En revanche, si nous transmettons à la fois le nom d'utilisateur et le mot de passe, mais que, sur l'ordinateur de l'utilisateur, la clé EnablePassword dans la section [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] est réglée sur 0, nous obtiendrons le même résultat. Ce n'est que si cette clé est réglée sur 1 et que nous transmettons à la fois le nom et le mot de passe initial que le système demandera immédiatement de saisir deux fois le nouveau mot de passe permanent. C'était bien cela que nous voulions obtenir.
En fin de compte, nous avons le jeu suivant d'options examinées comme illustration de 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', '');"/>Exemple 1 : Exécutez sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Exemple 2 : Ouvrez sapshcut.exe (URI)</a><br>
<a href='/fr/sapshcut.php/?SID=SID&Client=200&User=test'>Exemple 3 : Ouvrez le fichier .sap (Raccourci SAP GUI)</a><br>
</body>
</html>
La dernière option m'a convenu. Mais on peut aussi, au lieu de générer des raccourcis SAP, utiliser par exemple la génération de fichiers CMD, qui ouvriront également la fenêtre SAP GUI lorsqu'ils seront lancés depuis le navigateur. Voici un exemple (sapguicmd.php) pour un lancement direct de SAP GUI avec l'indication de la chaîne de connexion complète, sans avoir besoin d'un SAP Logon configuré :
<?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
