Kjøring av SAP GUI fra nettleseren

Denne artikkelen skrev jeg først for min egen blogg, for ikke å måtte lete etter den igjen, men siden ingen leser bloggen, ville jeg dele denne informasjonen med alle, kanskje det kan være nyttig for noen.

Under arbeidet med idéen om en tjeneste for tilbakestilling av passord i SAP R/3-systemer oppstod spørsmålet — hvordan starte SAP GUI med de nødvendige parameterne fra nettleseren? Ettersom denne idéen involverte bruk av en webtjeneste, først som håndterer en SOAP-forespørsel fra SAP GUI og sender en e-post med lenke til en nettside med skript for tilbakestilling av passordet til den opprinnelige, og så vise en melding til brukeren om vellykket tilbakestilling av passordet samt vise det opprinnelige passordet, så ønsket jeg at denne siden også skulle ha en lenke for å starte SAP GUI. Og at denne lenken skulle åpne det nødvendige systemet, helst med utfylte felter for brukernavn og passord, så brukeren bare måtte fylle ut produksjonspassordet to ganger.

Starting SAP Logon var ikke av interesse for vårt formål, og når man startet sapgui.exe kunne man ikke spesifisere mandant og brukernavn. Men man kunne starte et system som ikke var definert i SAP Logon. På den annen side var det ikke særlig aktuelt å starte SAP GUI med vilkårlige serverparametere: hvis vi løser oppgaven med å tilbakestille brukerpassordet, så har de sannsynligvis allerede den riktige linjen i SAP Logon med de nødvendige innstillingene, så det er ikke nødvendig å rote med egne. Men teknologien SAP GUI Shortcut, og programmet sapshcut.exe, oppfylte de stilte kravene, da det ga mulighet til å starte SAP GUI med bruk av en spesifikk "genvei".

Løsning på problemet direkte: kjøring av sapshcut.exe fra nettleseren ved hjelp av ActiveX-objektet:

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 dårlig: for det første fungerer den bare i Internet Explorer, for det andre krever den spesiifikke sikkerhetsinnstillinger i nettleseren, som kan være forbudt på domenenivå i organisasjonen, og selv om de er tillatt, vil nettleseren gi brukeren et vindu med en skremmende advarsel:

Kjøring av SAP GUI fra nettleseren

Løsning nr. 2 fant jeg på internett: opprettelse av eget webprotokoll. Lar deg starte den aktuelle applikasjonen ved hjelp av en lenke som spesifiserer protokollen vi registrerer selv i Windows-registret under HKEY_CLASSES_ROOT. Siden SAP GUI Shortcut har sin egen underseksjon i dette området, kan vi legge til en strengparameter for URL Protocol med en tom verdi:

Kjøring av SAP GUI fra nettleseren

Denne protokollen starter sapgui.exe med parameteren /SHORTCUT, som vi egentlig trenger:

Kjøring av SAP GUI fra nettleseren

Eller hvis vi ønsker å lage en helt vilkårlig protokoll (for eksempel, sapshcut), kan den registreres ved hjelp av følgende reg-fil:

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

Nå, hvis vi lager en lenke med spesifikasjonen av protokollen på en nettside, Sapgui.Shortcut.File på tilsvarende måte:

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

bør vi se et vindu som dette:

Kjøring av SAP GUI fra nettleseren

Og alt det ser bra ut, men når vi trykker på «Tillat»-knappen ser vi:

Kjøring av SAP GUI fra nettleseren

Oho, nettleseren har omgjort mellomrom til . Og andre symboler vil også bli kodet til sitt numeriske kode med prosenttegnet. Det mest ubehagelige er at det ikke er noe du kan gjøre på nettlesernivå (alt er gjort etter standard) — nettleseren liker ikke slike symboler, og kommandotolkeren i Windows fungerer ikke med disse kodede verdiene. En annen ulempe er at hele strengen sendes som parameter, inkludert navnet på protokollen og til og med kolon:sapgui.shortcut.file:). Selv om den samme sapshcut.exe kan forkaste alt som ikke er en parameter for den (starter med symbolen «-«, deretter navnet, «=» og verdien), så en streng som «sapgui.shortcut.file: -system=SID» går fortsatt, men uten mellomrom «sapgui.shortcut.file:-system=SID» fungerer allerede ikke.

Det viser seg at det i prinsippet er to bruksområder for URI-protokollen:

  1. Bruke uten parametere: Vi lager en hel haug av protokoller for alle våre systemer som har formen SIDMANDT, som AAA200, BBB200 og så videre. Hvis man bare ønsker å starte det aktuelle systemet, så er dette alternativet fullt fungerende, men i vårt tilfelle passer det ikke, siden vi minst ville sende brukernavnet også, og det kan ikke gjøres på denne måten.
  2. Bruk av et wrapper-program for å kalle sapshcut.exe eller sapgui.exeEssensen i dette programmet er enkel — det skal ta den strengen som nettleseren sender via webprotokollen og gjøre den om til det formatet som Windows aksepterer, det vil si at den konverterer alle symbolkoder tilbake til tegn (kanskje til og med analyserer strengen etter parametere) og deretter kaller SAP GUI med en garantert korrekt kommando. I vårt tilfelle passer det heller ikke helt (derfor valgte jeg å ikke skrive det), fordi det er ikke tilstrekkelig bare å legge til protokollen på alle bruker-PCer (innenfor domenet er det akseptabelt, selv om man bør unngå en slik praksis), men det vil også kreve å plassere et ytterligere program på PC-en, og i tillegg konstant overvåke at det ikke forsvinner ved reinstallasjon av programvare på PC-en.

Det vil si at denne varianten også forkastes som ubrukelig for oss.

Her begynte jeg allerede å tenke at jeg måtte gi opp ideen om å starte SAP GUI med de nødvendige parameterne fra nettleseren, men så kom jeg på at i SAP Logon kan man lage en snarvei, og denne kan kopieres til skrivebordet. Jeg har brukt en slik metode før, men før dette hadde jeg ikke sett spesifikt på snarveifilen. Og det viste seg at denne snarveien faktisk er en vanlig tekstfil med utvidelsen .sap. Og hvis man starter den i Windows — vil SAP GUI starte med de parameterne som er angitt i denne filen. "Bingo!"

Formatet på denne filen er omtrent slik (det kan også være en transaksjon som startes, men jeg har utelatt den):

[System]
Navn=SID
Kunde=200
[User]
Navn=
Språk=RU
Passord=
[Function]
Tittel=
[Configuration]
GuiStørrelse=Maksimal
[Options]
Gjenbruk=0

Det ser ut til at alt er nødvendig: både systemidentifikator, mandant, brukernavn og til og med passord. Og selv ekstra parametere: Title — vinduets tittel, GuiSize — størrelsen på det åpne vinduet (fult skjerm eller ikke) og Reuse — om man nødvendigvis skal åpne et nytt vindu eller bruke et allerede åpnet vindu med samme system. Men et problem dukket opp — i SAP Logon kunne man ikke oppgi passord, feltet var låst. Det viste seg at dette er gjort av sikkerhetsgrunner: alle snarveier laget i SAP Logon lagres i en fil sapshortcut.ini (ved siden av saplogon.ini i Windows-brukerprofilen) og der er de, selv om de er kryptert, ikke veldig sterkt, og med stor vilje kan de dekodes. Men man kan også tillate dette ved å endre verdien av en parameter i registeret (som standard er verdien 0):

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"

Dette låser opp feltet "Passord" på opprettingsskjemaet for snarveien i SAP Logon:

Kjøring av SAP GUI fra nettleseren

Når du skriver inn passordet i dette feltet, vil det bli plassert i den tilsvarende linjen.
sapshortcut.ini, men når du drar snarveien til skrivebordet, vises den ikke der — men du kan legge den til manuelt. Passordet er kryptert, for 111111 vil det være som følger: PW_49B02219D1F6, for 222222 — PW_4AB3211AD2F5. Men det som interesserer oss mer, er at dette passordet krypteres på en måte som ikke avhenger av den spesifikke PC-en, og hvis vi tilbakestiller passordet til standard, kan vi bruke en forhåndsinstallert verdi i dette feltet. Hvis vi derimot ønsker å bruke et tilfeldig opprettet passord, må vi forstå algoritmen for denne krypteringen. Men ifølge de gitte eksemplene, bør det ikke være vanskelig å gjøre. Forresten, i SAP GUI 7.40 har dette feltet forsvunnet fra skjemaet, men filen med det utfylte passordet håndteres korrekt.

Det vil si at i nettleseren er det tilstrekkelig å klikke på lenken til filen med .sap-utvidelsen og med det nødvendige formatet — så vil den be om å åpne det som en SAP GUI Snarvei-fil (selvfølgelig på PC-en med installert SAP GUI) og åpne SAP GUI-vinduet med angitte parametere (hvis SID- og mandant-parret er i listen over SAP Logon på denne PC-en).

Men det er klart at ingen vil på forhånd lage og lagre filer på nettstedet — de må genereres basert på de nødvendige parameterne. For eksempel kan du lage et PHP-skript for generering av snarveier (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=Logg innrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>

Hvis du ikke angir brukernavn og passord, vil vi få følgende vindu med forespørsel om innlogging og passord:

Kjøring av SAP GUI fra nettleseren

Hvis du kun sender brukernavnet, vil brukernavnsfeltet bli fylt ut, mens passordfeltet forblir tomt. Dersom vi sender både brukernavn og passord, men brukerens registreringsnøkkel EnablePassword i [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] er satt til 0, får vi det samme resultatet. Og bare hvis denne nøkkelen er satt til 1, og vi sender både navn og startpassord, vil systemet straks be om å skrive inn et nytt permanent passord to ganger. Dette var det vi ønsket å oppnå.

Som et resultat har vi følgende sett med vurderte muligheter som illustrasjon av 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: Kjør sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Eksempel 2: Åpne sapshcut.exe (URI)</a><br>
<a href='/no/sapshcut.php/?SID=SID&Client=200&User=test'>Eksempel 3: Åpne filen .sap (SAP GUI-snarvei)</a><br>
</body>
</html>

Den siste muligheten passet meg. Men det er også mulig å bruke generering av CMD-filer i stedet for SAP-snarveier, som også vil åpne SAP GUI-vinduet når de åpnes fra nettleseren. Nedenfor er et eksempel (sapguicmd.php) for direkte oppstart av SAP GUI med en fullstendig tilkoblingsstreng, uten behov for en konfigurert 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 Inngang i ".$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";
?>

Kilde: habr.com

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster