Start af SAP GUI fra browseren

Jeg skrev oprindeligt denne artikel til mig selv blog, så jeg ikke skulle lede efter informationen igen. Men da bloggen ikke bliver læst af nogen, ville jeg dele denne information med alle, hvis nogen skulle få gavn af den.

Under arbejdet med idéen til en service til nulstilling af adgangskoder i SAP R/3-systemer opstod spørgsmålet — hvordan kan man starte SAP GUI med de nødvendige parametre fra en browser? Da denne idé involverede brugen af en webservice, der først skulle håndtere en SOAP-anmodning fra SAP GUI og derefter sende en e-mail med et link til en webside med scripts til nulstilling af adgangskoden, efterfulgt af en besked til brugeren om, at nulstillingen var succesfuld, ønskede jeg også, at denne side indeholdt et link til at starte SAP GUI. Desuden skulle dette link åbne det ønskede system og helst med brugernavn og adgangskode allerede udfyldt, så brugeren blot skulle indtaste produktionsadgangskoden to gange.

At starte SAP Logon var ikke interessant for vores formål, og når man startede sapgui.exe, kunne man ikke angive mandant og brugernavn, men man kunne starte et system, der ikke var defineret i SAP Logon. Omvendt var det ikke særlig relevant at starte SAP GUI med vilkårlige serverparametre: hvis vi skal løse opgaven med at nulstille en brugers adgangskode, så har de sandsynligvis allerede den ønskede linje i SAP Logon, med de indstillinger de har brug for, og man skal ikke blande sig med sine egne. Men teknologien SAP GUI Shortcut og programmet sapshcut.exe opfyldte de specificerede krav, da det gav mulighed for at starte SAP GUI ved hjælp af en bestemt "genvej".

Løsningen af opgaven direkte: at starte sapshcut.exe direkte fra browseren ved hjælp af et 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');
}

Løsningen er ikke god: For det første virker den kun i Internet Explorer, og for det andet kræver den de nødvendige sikkerhedsindstillinger i browseren, som i organisationen kan være forbudt på domæneniveau, og selv hvis de er tilladt, viser browseren en advarsel til brugeren med en skræmmende meddelelse:

Start af SAP GUI fra browseren

Løsning nr. 2 fandt jeg på internettet: oprettelse af en egen webprotokol. Gør det muligt at starte den nødvendige applikation ved hjælp af et link med angivelse af den protokol, som vi selv registrerer i Windows-registret i afsnittet HKEY_CLASSES_ROOT. Da SAP GUI Shortcut har sit eget underafsnit i dette afsnit, kan vi tilføje en strengparameter URL Protocol med en tom værdi der.

Start af SAP GUI fra browseren

Denne protokol starter sapgui.exe with the parameter /SHORTCUT, hvilket er lige hvad vi har brug for:

Start af SAP GUI fra browseren

Enten hvis vi ønsker at oprette en helt vilkårlig protokol (for eksempel, sapshcut), kan den registreres ved hjælp af følgende reg-fil:

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

Nu, hvis vi på en webside laver et link med angivelse af protokollen Sapgui.Shortcut.File på følgende måde:

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

bør vi se et vindue af denne type:

Start af SAP GUI fra browseren

Og det ser rigtig godt ud, men når vi trykker på knappen «Tillad», ser vi:

Start af SAP GUI fra browseren

Åh, browseren har konverteret mellemrum til . Og andre tegn vil også blive kodet i deres numeriske kodning med procenttegnet. Det mest irriterende er, at der ikke er noget, man kan gøre på browserniveau (det er alt sammen standardspecifikationer) — browseren kan ikke lide sådanne tegn, og Windows kommandotolk fungerer ikke med disse kodede værdier. En yderligere ulempe er, at hele strengen videregives som parameter, inklusive protokollens navn og selv kolon:sapgui.shortcut.file:). Selvom den samme sapshcut.exe kan ignorere alt, hvad der ikke er et parameter (starter med tegnet «-«, efterfulgt af navnet, «=» og værdien), så en streng som «sapgui.shortcut.file: -system=SID» vil stadig fungere, men uden mellemrummet «sapgui.shortcut.file:-system=SID» virker det ikke.

Det viser sig, at der i princippet er to muligheder for at bruge URI-protokollen:

  1. Brug uden parametre: Opretter en hel masse protokoller til alle vores systemer som SIDMANDT, såsom AAA200, BBB200 osv. Hvis det blot er nødvendigt at starte det ønskede system, er denne mulighed helt anvendelig, men i vores tilfælde er den ikke passende, da man i det mindste ønsker at overføre brugerens login, hvilket ikke kan gøres på denne måde.
  2. Brug af en wrapper-applikation til at kalde sapshcut.exe eller sapgui.exe. Ideen bag dette program er enkel - det skal tage den streng, som browseren sender via webprotokollen, og omdanne den til det format, som Windows accepterer, dvs. omdanne alle tegnkoder tilbage til symboler (det kan endda analysere strengen efter parametre) og derefter kalde SAP GUI med en korrekt kommando. Det er ikke helt passende i vores tilfælde (derfor blev den ikke engang skrevet), da vi allerede har svært ved blot at tilføje protokollen på alle bruger-PC'er (inden for domænet er det stadig acceptabelt, selvom det også er bedre at undgå sådan praksis), men det vil kræve, at vi også skal placere programmet på PC'en, og derudover konstant sørge for, at det ikke forsvinder ved geninstallation af software på PC'en.

Så denne mulighed forkaster vi også som uegnet for os.

Her begyndte jeg allerede at tænke, at idéen om at starte SAP GUI med de nødvendige parametre fra browseren måtte opgives, men pludselig fik jeg den tanke, at man kan lave en genvej til SAP Logon, og den kan kopieres til skrivebordet. Jeg har brugt denne metode før, men havde aldrig set filen til genvejen specifikt. Og det viste sig, at denne genvej er en almindelig tekstfil med udvidelsen .sap. Og hvis man starter den i Windows - starter SAP GUI med de parametre, som er angivet i denne fil. "Bingo!"

Formatet af denne fil er omtrent som følger (der kan også være en transaktion som start, men jeg udelod den):

[System]
Navn=SID
Klient=200
[User]
Navn=
Sprog=RU
Adgangskode=
[Function]
Titel=
[Configuration]
GuiSize=Maksimeret
[Options]
Genbrug=0

Det ser ud til, at alt nødvendigt er der: både systemets identifikator, mandant, brugernavn og endda adgangskode. Og endda yderligere parametre: Title — vinduets overskrift, GuiSize — størrelsen på det åbne vindue (maksimeret eller ej) og Reuse — skal der åbnes et nyt vindue, eller skal der bruges et, der allerede er åbent med det samme system. Men straks dukkede et problem op - adgangskoden i SAP Logon kunne ikke sættes, feltet var låst. Det viste sig, at dette er lavet af sikkerhedsmæssige årsager: alle genveje oprettet i SAP Logon gemmes i en fil sapshortcut.ini (ved siden af saplogon.ini i Windows-brugerens profil) og selvom de er krypteret, er det ikke for meget og med lidt vilje kan de dekrypteres. Men det kan også tillades ved at ændre værdien af en parameter i registreringsdatabasen (som standard er værdien 0):

Windows Registreringseditor Version 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"

Dette låser feltet "Adgangskode" op i formularen for oprettelse af genvej i SAP Logon:

Start af SAP GUI fra browseren

Og når man indtaster en adgangskode i dette felt, vil den blive placeret i den tilsvarende række
sapshortcut.ini, men når man trækker genvejen til skrivebordet, vises den ikke der - men man kan tilføre den manuelt. Adgangskoden er krypteret, for 111111 vil den tage følgende form: PW_49B02219D1F6, for 222222 - PW_4AB3211AD2F5. Men vi er mere interesserede i det faktum, at denne adgangskode krypteres på én måde, uafhængig af den specifikke PC, og hvis vi skal nulstille adgangskoden til standard, kan vi bruge en forudkendt værdi i dette felt. Men hvis vi ønsker at bruge en vilkårligt skabt adgangskode - så skal vi forstå algoritmen for denne kryptering. Men, baseret på de givne eksempler, vil det ikke være svært at gøre. Forresten, i SAP GUI 7.40 er dette felt helt forsvundet fra formularen, men filen med den udfyldte adgangskode genkender den korrekt.

Det vil sige, at det i browseren er tilstrækkeligt at klikke på et link til en fil med udvidelsen .sap og det nødvendige format - og den vil tilbyde at åbne det som en filtype SAP GUI Shortcut (naturligvis på en PC med installeret SAP GUI) og åbne SAP GUI-vinduet med de specificerede parametre (hvis parret SID og mandant findes i SAP Logon-listen på denne PC).

Men det er klart, at ingen vil oprette og lagre filer på forhånd - de skal genereres ud fra de nødvendige parametre. For eksempel kan man oprette et PHP-script til at generere genveje (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=Login to the systemrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>

Hvis man ikke angiver brugernavn og adgangskode, får vi følgende vindue med anmodning om login og adgangskode:

Start af SAP GUI fra browseren

Hvis man kun sender login—vil login-feltet blive udfyldt, mens adgangskodefeltet forbliver tomt. Hvis vi dog sender både login og adgangskode til brugeren, men på brugerens PC er registreringsnøgle EnablePassword i sektionen [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] indstillet til 0, vil vi få det samme resultat. Og kun hvis denne nøgle er indstillet til 1, og vi sender både navn og initial adgangskode, vil systemet straks anmode om at indtaste en ny permanent adgangskode to gange. Hvilket var det ønskede resultat.

Som et resultat har vi følgende udvalg af overvejede muligheder som illustration af alt det ovenstående:

<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', '');"/>Eksempel 1: Kør sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Eksempel 2: Åben sapshcut.exe (URI)</a><br>
<a href='/da/sapshcut.php/?SID=SID&Client=200&User=test'>Eksempel 3: Åben fil .sap (SAP GUI genvej)</a><br>
</body>
</html>

Jeg valgte den sidste mulighed. Men man kan også bruge CMD-filgenerering i stedet for at generere SAP-genveje, hvilket også vil åbne SAP GUI-vinduet, når det åbnes fra browseren. Nedenfor er et eksempel (sapguicmd.php) på direkte start af SAP GUI med angivelse af den fulde forbindelse, uden behov for at have en konfigureret 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 Indlogging i ".$Title."\r\n";
echo "set SAP_CODEPAGE=1504\r\n";
echo 'if exist "%ProgramFiles(x86)%SAPFrontEndSapGuisapgui.exe" set gui=%ProgramFiles(x86)%SAPFrontEndSapGuisapgui.exe'."\r\n";
echo 'if exist "%ProgramFiles%SAPFrontEndSapGuisapgui.exe" set gui=%ProgramFiles%SAPFrontEndSapGuisapgui.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";
?>

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster