Ich habe diesen Artikel ursprünglich für meinen , um später nicht wieder suchen und mich erinnern zu müssen. Da der Blog jedoch niemand liest, möchte ich diese Informationen mit allen teilen, vielleicht kann es jemand nutzen.
Während ich an der Idee eines Passwort-Reset-Dienstes für SAP R/3 arbeitete, stellte sich die Frage – wie kann ich SAP GUI mit den benötigten Parametern aus dem Browser starten? Da diese Idee die Verwendung eines Webdienstes vorsah, der zunächst auf eine SOAP-Anfrage von SAP GUI reagiert und eine E-Mail mit einem Link zur Webseite mit dem Passwort-Reset-Skript sendet, gefiel mir der Gedanke, dass auf dieser Seite auch ein Link zum Start von SAP GUI vorhanden sein sollte. Dieser Link sollte das passende System öffnen und idealerweise direkt mit ausgefüllten Feldern für Benutzername und Passwort, sodass der Benutzer nur noch das Produktionspasswort zweimal eingeben müsste.
Der Start von SAP Logon war für unseren Zweck nicht interessant, und beim Start von sapgui.exe war es nicht möglich, den Mandanten und den Benutzernamen anzugeben. Dafür konnte jedoch ein nicht im SAP Logon definiertes System gestartet werden. Andererseits war der Start von SAP GUI mit beliebigen Serverparameter nicht wirklich relevant: Wenn wir die Aufgabe haben, das Passwort eines Benutzers zurückzusetzen, hat dieser wahrscheinlich bereits den erforderlichen Eintrag im SAP Logon mit den passenden Einstellungen und es ist nicht notwendig, eigene Einstellungen zu verwenden. Den Anforderungen entsprach jedoch die Technologie SAP GUI Shortcut sowie das eigentliche Programm sapshcut.exe, das die Möglichkeit bot, SAP GUI mit einem bestimmten "Shortcut" zu starten.
Direkte Lösung des Problems: Start von sapshcut.exe direkt aus dem Browser über ein ActiveX-Objekt:
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');
}
Die Lösung ist schlecht: Erstens funktioniert sie nur in Internet Explorer, zweitens erfordert sie entsprechende Sicherheitseinstellungen im Browser, die in der Organisation möglicherweise auf Domänenebene verboten sind. Selbst wenn sie erlaubt sind, zeigt der Browser dem Benutzer ein alarmierendes Warnfenster an:

Lösung Nr. 2 habe ich im Internet gefunden: . Es ermöglicht das Starten der benötigten Anwendung über einen Link, der das Protokoll angibt, welches wir selbst im Windows-Registry-Bereich HKEY_CLASSES_ROOT registrieren. Da der SAP GUI Shortcut in diesem Bereich einen eigenen Unterordner hat, können wir dort den Zeichenparameter URL Protocol mit leerem Wert hinzufügen:

Dieses Protokoll startet sapgui.exe mit dem Parameter /SHORTCUT, was wir eigentlich brauchen:

Oder, wenn wir ein beliebiges Protokoll erstellen möchten (zum Beispiel, sapshcut), dann kann man es mit folgender reg-Datei registrieren:
Windows-Registrierungs-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""
Jetzt, wenn wir auf einer Webseite einen Link mit dem Protokoll angeben, Sapgui.Shortcut.File in dieser Weise:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
sollte sich ein Fenster wie folgt anzeigen:

Und eigentlich ist alles großartig, aber wenn wir auf die Schaltfläche „Erlauben“ klicken, sehen wir:

Oh, der Browser hat das Leerzeichen in umgewandelt. Auch andere Zeichen werden in ihren numerischen Code mit einem Prozentzeichen kodiert. Das Unangenehmste ist, dass man auf Browserebene nichts dagegen tun kann (das ist alles standardisiert) – der Browser mag solche Zeichen nicht, und die Windows-Befehlszeile arbeitet nicht mit solchen kodierten Werten. Ein weiterer Nachteil ist, dass die gesamte Zeichenkette übergeben wird, einschließlich des Protokollnamens und sogar des Doppelpunkts.sapgui.shortcut.file:). Obwohl der gleiche sapshcut.exe alle nicht als Parameter geltenden Teile (die mit einem «-« beginnen, gefolgt vom Namen, «=» und dem Wert) ignorieren kann, d.h. eine Zeichenkette wie «sapgui.shortcut.file: -system=SID» funktioniert noch, aber ohne Leerzeichen «sapgui.shortcut.file:-system=SID» funktioniert nicht mehr.
Es gibt also grundsätzlich zwei Möglichkeiten, das URI-Protokoll zu verwenden:
- Verwendung ohne Parameter: Wir erstellen eine ganze Reihe von Protokollen für all unsere Systeme in der Form SIDMANDT, wie AAA200, BBB200 usw. Wenn man einfach nur das gewünschte System starten möchte, ist diese Variante durchaus brauchbar, aber in unserem Fall nicht geeignet, da wir zumindest auch den Benutzernamen übergeben möchten, was auf diese Weise nicht möglich ist.
- Die Verwendung eines Wrapper-Programms zur Ausführung sapshcut.exe oder sapgui.exe. Der Zweck dieses Programms ist einfach: Es soll die vom Browser über das Webprotokoll übermittelte Zeichenfolge aufnehmen und diese in ein für Windows verständliches Format umwandeln, d.h. es wandelt alle Zeichencodes wieder in Zeichen um (es könnte sogar die Zeichenfolge nach Parametern analysieren) und ruft dann die SAP GUI mit dem garantierten richtigen Befehl auf. In unserem Fall ist dies allerdings auch nicht ganz geeignet (deshalb habe ich es auch nicht geschrieben), da es uns nicht ausreicht, das Protokoll auf allen Benutzern PCs hinzuzufügen (innerhalb der Domäne wäre das noch akzeptabel, obwohl wir auch davon besser absehen sollten), aber es würde auch erforderlich sein, das Programm zusätzlich auf den PCs zu installieren und ständig darauf zu achten, dass es bei Software-Neuinstallationen nicht verloren geht.
Das heißt, diese Variante lassen wir ebenfalls als ungeeignet fallen.
Hier begann ich bereits zu denken, dass ich mich von der Idee verabschieden müsste, SAP GUI mit den benötigten Parametern aus dem Browser zu starten. Doch dann kam mir der Ged Gedanke, dass man in SAP Logon eine Verknüpfung erstellen kann, die man auf den Desktop kopieren kann. So eine Methode hatte ich früher schon einmal genutzt, aber ich hatte mir die Verknüpfungsdatei vorher nicht näher angeschaut. Und es stellte sich heraus, dass diese Verknüpfung eine ganz normale Textdatei mit der Erweiterung .sap. Und wenn man sie unter Windows startet, wird SAP GUI mit den Parametern geöffnet, die in dieser Datei angegeben sind. „Bingo!“
Das Format dieser Datei sieht etwa wie folgt aus (es könnte auch eine auszuführende Transaktion beim Start enthalten, aber ich habe sie weggelassen):
[System]
Name=SID
Client=200
[User]
Name=
Language=DE
Password=
[Function]
Title=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0
Es scheint alles Nötige enthalten zu sein: die System-ID, der Mandant, der Benutzername und sogar das Passwort. Sogar zusätzliche Parameter: Title — Fenstertitel, GuiSize — Größe des geöffneten Fensters (Vollbild oder nicht) und Reuse — Ob ein neues Fenster geöffnet werden muss oder ob das bereits geöffnete Fenster mit demselben System verwendet werden kann. Es gab jedoch sofort ein Problem — das Passwort im SAP Logon konnte nicht eingegeben werden, da das Feld gesperrt war. Das wurde aus Sicherheitsgründen so eingestellt: Alle in SAP Logon erstellten Verknüpfungen werden in einer Datei gespeichert. sapshortcut.ini Neben der saplogon.ini im Windows-Benutzerprofil) und obwohl sie dort verschlüsselt sind, ist die Verschlüsselung nicht sehr stark, sodass sie bei großem Willen entschlüsselt werden können. Aber es ist möglich, dies zu erlauben, indem man einen Parameter im Registrierungseditor ändert (standardmäßig hat dieser wert) 0):
Windows-Registrierungs-Editor Version 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
Dies entsperrt das Feld 'Passwort' im Erstellungsformular der Verknüpfung im SAP Logon:

Wenn das Passwort in dieses Feld eingegeben wird, wird es an der entsprechenden Stelle gespeichert.
sapshortcut.ini, aber wenn man das Symbol auf den Desktop zieht, erscheint es dort nicht – man kann es jedoch manuell hinzufügen. Das Passwort ist verschlüsselt, für 111111 wird es folgendermaßen aussehen: PW_49B02219D1F6, für 222222 – PW_4AB3211AD2F5. Uns interessiert jedoch mehr, dass dieses Passwort auf dieselbe Weise verschlüsselt wird, unabhängig vom jeweiligen PC. Wenn wir das Passwort auf den Standard zurücksetzen, können wir in diesem Feld einen vorab bekannten Wert verwenden. Wenn wir jedoch ein beliebig erstelltes Passwort verwenden möchten, müssen wir den Algorithmus dieser Verschlüsselung verstehen. Judging by the provided examples, sollte das nicht schwierig sein. Übrigens ist dieses Feld in SAP GUI 7.40 in der Oberfläche völlig verschwunden, aber die Datei mit dem ausgefüllten Passwort wird korrekt erkannt.
Das bedeutet, dass es im Browser ausreicht, auf den Link zu einer Datei mit der Endung .sap und im passenden Format zu klicken – und es schlägt vor, diese als Datei vom Typ SAP GUI Shortcut zu öffnen (natürlich auf einem PC mit installiertem SAP GUI), und öffnet uns das SAP GUI-Fenster mit den angegebenen Parametern (wenn die Kombination aus SID und Mandant in der SAP Logon-Liste auf diesem PC vorhanden ist).
Es ist jedoch klar, dass niemand im Voraus Dateien erstellen und auf der Website speichern wird – sie müssen basierend auf den erforderlichen Parametern generiert werden. Zum Beispiel könnte man ein PHP-Skript zur Generierung von Verknüpfungen erstellen (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 = 'DE'; };
$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=Login in das Systemrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>
Wenn kein Benutzername und Passwort angegeben werden, erhalten wir ein folgendes Fenster mit der Aufforderung zur Eingabe von Anmeldedaten:

Wenn nur der Login übergeben wird, wird das Login-Feld ausgefüllt, während das Passwortfeld leer bleibt. Sollten sowohl Benutzername als auch Passwort übergeben werden, aber im Registry-Schlüssel EnablePassword unter [HKEY_CURRENT_USER\Software\SAP\SAPShortcut\Security] auf dem PC des Benutzers auf 0 gesetzt sein, erhalten wir dasselbe Ergebnis. Nur wenn dieser Schlüssel auf 1 gesetzt ist und sowohl der Benutzername als auch das initiale Passwort übergeben werden, wird das System sofort auffordern, das neue permanente Passwort zweimal einzugeben. Das war unser Ziel.
Zusammenfassend haben wir die folgende Reihe von betrachteten Optionen als Illustration des Vorstehenden:
<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', '');"/>Beispiel 1: Führen Sie sapshcut.exe (ActiveX) aus<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Beispiel 2: Öffnen Sie sapshcut.exe (URI)</a><br>
<a href='/de/sapshcut.php/?SID=SID&Client=200&User=test'>Beispiel 3: Datei .sap öffnen (SAP GUI Verknüpfung)</a><br>
</body>
</html>
Die letzte Option hat mir gefallen. Statt der SAP-Shortcut-Generierung können beispielsweise auch CMD-Dateien erzeugt werden, die beim Öffnen im Browser das SAP GUI-Fenster öffnen. Nachfolgend ein Beispiel (sapguicmd.php) für den direkten Start von SAP GUI mit Angabe der vollständigen Verbindungszeile, ohne dass ein konfiguriertes SAP Logon erforderlich ist.
<?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 Einloggen in ".$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";
?>
Quelle: habr.com
