Diesen Artikel habe ich zuerst in mein , um ihn später nicht erneut suchen und sich daran erinnern zu müssen. Da jedoch niemand den Blog liest, wollte ich diese Informationen mit allen teilen, vielleicht wird es jemandem nützlich sein.
Bei der Arbeit an der Idee eines Passwort-Reset-Dienstes in SAP R/3 stellte sich die Frage — wie kann ich SAP GUI mit den benötigten Parametern aus dem Browser starten? Da in dieser Idee die Nutzung eines Webdienstes vorgesehen war, der zunächst auf einen SOAP-Anruf aus SAP GUI reagiert und dann eine E-Mail mit einem Link zur Webseite mit dem Passwort-Reset-Skript an den Anfang sendet, und erst danach dem Benutzer eine Nachricht über den erfolgreichen Passwort-Reset und das Anzeige dieses ursprünglichen Passworts gibt, wollte ich, dass auf dieser Seite auch ein Link zum Starten von SAP GUI vorhanden ist. Dieser Link sollte das gewünschte System öffnen, idealerweise sofort mit ausgefüllten Feldern für Benutzername und Passwort: der Benutzer müsste dann nur noch das produktive Passwort zweimal eingeben.
Das Starten von SAP Logon war für unser Ziel nicht interessant, und beim Start von sapgui.exe war es nicht möglich, Mandant und Benutzername anzugeben, außerdem konnte das System nicht über SAP Logon definiert werden. Andererseits war das Starten von SAP GUI mit beliebigen Serverparametern nicht besonders relevant: Wenn wir das Problem des Benutzerpasswort-Resets lösen, hat der Benutzer wahrscheinlich bereits die erforderliche Zeile in SAP Logon mit seinen benötigten Einstellungen und muss nicht mit seinen eigenen Parametern eingreifen. Die Technologie SAP GUI Shortcut und das Programm sapshcut.exe erfüllten jedoch die festgelegten Anforderungen, da sie die Möglichkeit boten, SAP GUI mithilfe eines bestimmten „Shortcuts“ zu starten.
Lösung des Problems direkt: Start von sapshcut.exe direkt aus dem Browser mit Hilfe des ActiveX-Objekts:
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');
}
Schlechte Lösung: Erstens, sie funktioniert nur im Internet Explorer, zweitens, sie erfordert entsprechende Sicherheitseinstellungen im Browser, die in der Organisation auf Domänenebene möglicherweise verboten sind, und selbst wenn sie erlaubt sind, zeigt der Browser dem Benutzer ein Fenster mit einer erschreckenden Warnung an:

Lösung Nr. 2 habe ich im Internet gefunden: . Erlaubt es uns, die benötigte Anwendung über einen Link zu starten, indem wir ein Protokoll angeben, das wir selbst in Windows im Registrierungsbereich HKEY_CLASSES_ROOT registrieren. Da der SAP GUI Shortcut in diesem Bereich ein eigenes Unterverzeichnis hat, kann man dort einen Zeichenparameter für das URL-Protokoll mit leerem Wert hinzufügen:

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

Nun, wenn wir ein völlig beliebiges Protokoll erstellen möchten (zum Beispiel, sapshcut), dann kann man es mit der folgenden reg-Datei registrieren:
Windows Registry-Editor Version 5.00
[HKEY_CLASSES_ROOT\sapshcut]
@="sapshcut Handler"
"URL-Protokoll"=""
[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""
Jetzt, wenn wir auf einer Webseite einen Link mit dem Protokollnamen erstellen Sapgui.Shortcut.File ähnlich wie folgt:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
sollte ein Fenster erscheinen:

Und es scheint alles wunderbar zu sein, aber beim Klicken auf die Schaltfläche "Erlauben" sehen wir:

Oh, der Browser hat ein Leerzeichen in verwandelt. Auch andere Zeichen werden in ihren numerischen Code mit einem Prozentzeichen kodiert. Und das Unangenehmste ist, dass man auf Browserebene nichts dagegen tun kann (das ist alles nach Standard gemacht) – der Browser mag solche Zeichen nicht, und die Eingabeaufforderung von Windows arbeitet nicht mit solchen kodierten Werten. Ein weiterer Nachteil ist, dass die gesamte Zeichenfolge als Parameter übergeben wird, einschließlich des Protokollnamens und sogar des Kolons (:sapgui.shortcut.file:). Obwohl das gleiche sapshcut.exe alles abweist, was nicht als Parameter dient (beginnt mit dem Zeichen "-", dann der Name, "=" und der Wert), d.h. eine Zeile wie "sapgui.shortcut.file: -system=SID" funktioniert noch, ohne das Leerzeichen "sapgui.shortcut.file:-system=SID" funktioniert es jedoch nicht mehr.
Es gibt also grundsätzlich zwei Möglichkeiten zur Verwendung des URI-Protokolls:
- Verwendung ohne Parameter: Wir erstellen eine ganze Reihe von Protokollen für all unsere Systeme wie SIDMANDT, Typ AAA200, BBB200 usw. Wenn es nur darum geht, das benötigte System zu starten, ist dieser Ansatz durchaus praktikabel, passt jedoch in unserem Fall nicht, da wir zumindest den Benutzernamen auch übermitteln möchten, und das lässt sich so nicht umsetzen.
- Verwendung eines Wrapper-Programms zum Aufruf sapshcut.exe oder sapgui.exeDie Essenz dieses Programms ist einfach — es soll die von dem Browser über das Webprotokoll übermittelte Zeichenkette nehmen und sie in die Darstellung umwandeln, die Windows akzeptiert, d.h. es wandelt alle Zeichencodes wieder in Zeichen um (es kann sogar die Zeichenkette nach Parametern analysieren) und ruft dann garantiert den SAP GUI mit dem richtigen Befehl auf. In unserem Fall passt es auch nicht ganz (deshalb habe ich es nicht einmal geschrieben), denn es reicht uns nicht aus, das Protokoll auf allen Benutzer-PCs hinzuzufügen (innerhalb der Domäne ist das schon eher machbar, obwohl ich auch diese Praxis lieber vermeiden würde), aber hier müsste man zusätzlich ein Programm auf den PC installieren und dann ständig darauf achten, dass es bei der Neuinstallation der Software nicht verloren geht.
Das heißt, diese Variante lassen wir ebenfalls als ungeeignet für uns fallen.
Hier begann ich bereits zu denken, dass ich die Idee, den SAP GUI mit den erforderlichen Parametern aus dem Browser zu starten, aufgeben muss, aber dann kam mir der Gedanke, dass man im SAP Logon eine Verknüpfung erstellen kann, die man auf den Desktop kopieren kann. Ich hatte früher diese Methode genutzt, aber bis dahin hatte ich die Verknüpfungsdatei nicht genauer betrachtet. Und es stellte sich heraus, dass diese Verknüpfung eine ganz normale Textdatei mit der Erweiterung ist .sap. Und wenn man sie in Windows startet, öffnet sich der SAP GUI mit den in dieser Datei angegebenen Parametern. „Bingo!“
Das Format dieser Datei sieht ungefähr so aus (es kann auch eine zu startende Transaktion beim Start geben, aber die habe ich weggelassen):
[System]
Name=SID
Client=200
[User]
Name=
Language=RU
Password=
[Function]
Title=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0
Es scheint alles, was benötigt wird, enthalten zu sein: und die System-ID, und das Mandant, und der Benutzername und sogar das Passwort. Und sogar zusätzlich Parameter: Title — der Fenstertitel, GuiSize — die Größe des geöffneten Fensters (Vollbild oder nicht) und Reuse — ob unbedingt ein neues Fenster geöffnet werden soll oder ob ein bereits geöffnetes mit demselben System verwendet werden kann. Aber sofort trat das Problem auf — das Passwort im SAP Logon konnte anscheinend nicht eingegeben werden; das Feld war gesperrt. Es stellte sich heraus, dass dies aus Sicherheitsgründen so gemacht wurde: Alle im SAP Logon erstellten Verknüpfungen werden in einer Datei gespeichert sapshortcut.ini (neben saplogon.ini im Benutzerprofil von Windows) und dort sind sie zwar verschlüsselt, jedoch nicht sehr stark, und bei großer Mühe können sie entschlüsselt werden. Man kann dies aber auch ermöglichen, indem man den Wert eines Parameters in der Registrierung ändert (standardmäßig ist der Wert 0):
Windows Registry-Editor Version 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
Das schaltet das Eingabefeld „Passwort“ im Formular zur Erstellung einer Verknüpfung im SAP Logon frei:

Wenn Sie in dieses Feld ein Passwort eingeben, wird es in der entsprechenden Zeile gespeichert.
sapshortcut.ini, aber wenn Sie das Symbol auf den Desktop ziehen, erscheint es dort nicht – es kann jedoch manuell hinzugefügt werden. 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 eine Weise verschlüsselt wird, die nicht vom spezifischen PC abhängt, und wenn wir das Passwort auf den ursprünglichen Wert zurücksetzen, können wir in diesem Feld einen bereits bekannten Wert verwenden. Wenn wir jedoch ein beliebig erstelltes Passwort verwenden möchten, müssen wir den Algorithmus dieser Verschlüsselung verstehen. Aber, judging by the provided examples, wird es nicht schwierig sein, dies zu tun. Übrigens, in SAP GUI 7.40 ist dieses Feld überhaupt aus dem Formular 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 Erweiterung .sap und im benötigten Format zu klicken – und er wird anbieten, sie 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 dieses PCs vorhanden ist).
Aber es ist klar, dass niemand einfach Dateien im Voraus erstellen und auf die Website hochladen wird – sie müssen basierend auf den benötigten Parametern generiert werden. Zum Beispiel kann man ein Skript in PHP zur Erstellung 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 = '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=Anmeldungrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>
Wenn kein Benutzername und Passwort angegeben werden, erhalten wir folgendes Fenster zur Eingabe von Login und Passwort:

Wenn nur der Login übergeben wird, wird das Login-Feld ausgefüllt, während das Passwortfeld leer bleibt. Wenn wir jedoch sowohl den Login als auch das Passwort übergeben, aber der Schlüssel EnablePassword im Registry-Bereich [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] auf dem PC des Benutzers auf 0 gesetzt ist, erhalten wir dasselbe. Nur wenn dieser Schlüssel auf 1 gesetzt ist und wir sowohl den Benutzernamen als auch das initiale Passwort übergeben, wird das System sofort auffordern, das neue permanente Passwort zweimal einzugeben. Das war das Ziel.
Am Ende haben wir die folgende Sammlung von betrachteten Optionen als Illustration des oben Gesagten:
<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 aus (ActiveX)<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 SAP-Shortcuts zu generieren, könnte man zum Beispiel auch CMD-Dateien generieren, die beim Öffnen im Browser ein SAP GUI-Fenster öffnen. Im Folgenden ein Beispiel (sapguicmd.php) für den direkten Start von SAP GUI mit der Angabe der vollständigen Verbindungszeile, ohne dass eine konfigurierte SAP-Anmeldung 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
