Starter SAP GUI fra en nettleser

Jeg skrev først denne artikkelen i min blogg, for ikke å søke og huske igjen senere, men siden ingen leser bloggen, ønsket jeg å dele denne informasjonen med alle, i tilfelle noen finner den nyttig.

Mens du jobbet med ideen om en tilbakestillingstjeneste for passord i SAP R/3-systemer, oppsto et spørsmål - hvordan starte SAP GUI med de nødvendige parameterne fra nettleseren? Siden denne ideen innebar bruk av en nettjeneste, først å svare på en SOAP-forespørsel fra SAP GUI og sende et brev med en lenke til en nettside med et skript for å tilbakestille passordet til det opprinnelige, og deretter vise til brukeren en melding om vellykket tilbakestilling av passord og visning av dette første passordet, så vil jeg at denne siden også skal ha en lenke for å starte SAP GUI. Dessuten bør denne koblingen åpne ønsket system, og helst med innloggings- og passordfeltene fylt ut samtidig: brukeren trenger bare å fylle ut det produktive passordet to ganger.

Å starte SAP Logon var ikke interessant for vårt formål, og når man kjørte sapgui.exe var det umulig å spesifisere klient og brukernavn, men det var mulig å starte et system som ikke var definert i SAP Logon. På den annen side var det ikke spesielt relevant å starte SAP GUI med vilkårlige serverparametere: hvis vi løser problemet med å tilbakestille en brukers passord, har han mest sannsynlig allerede den nødvendige linjen i SAP Logon, med innstillingene han trenger, og der er ingen grunn til å rote med sine egne. Men de spesifiserte kravene ble oppfylt av SAP GUI Shortcut-teknologien og selve sapshcut.exe-programmet, som gjorde det mulig å starte SAP GUI ved å bruke en spesifikk "snarvei".

Løse problemet direkte: starte sapshcut.exe direkte fra nettleseren ved å bruke 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 dårlig: for det første fungerer det bare i Internet Explorer, for det andre krever det passende sikkerhetsinnstillinger i nettleseren, noe som i en organisasjon kan være forbudt på domenenivå, og selv om det er tillatt, viser nettleseren et vindu med et skremmende advarsel til brukeren:

Starter SAP GUI fra en nettleser

Jeg fant løsning #2 på Internett: lage din egen nettprotokoll. Lar oss starte applikasjonen vi trenger ved å bruke en lenke som indikerer protokollen, som vi selv registrerer i Windows i registret i HKEY_CLASSES_ROOT-delen. Siden SAP GUI Shortcut har sin egen underseksjon i denne delen, kan du legge til URL Protocol-strengparameteren med en tom verdi der:

Starter SAP GUI fra en nettleser

Denne protokollen starter sapgui.exe med parameter /SNARTVEI, som er akkurat det vi trenger:

Starter SAP GUI fra en nettleser

Vel, eller hvis vi ønsker å lage en helt vilkårlig protokoll (f.eks. sapshcut), så kan du registrere den ved å bruke 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 på en nettside som indikerer protokollen Sapgui.Shortcut.File På lignende måte:

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

Vi bør se et vindu som dette:

Starter SAP GUI fra en nettleser

Og alt virker bra, men når du klikker på "Tillat"-knappen ser vi:

Starter SAP GUI fra en nettleser

Beklager, nettleseren gjorde mellomromstasten til %20. Vel, andre tegn vil også bli kodet inn i sin egen numeriske kode med et prosentsymbol. Og det mest ubehagelige er at ingenting kan gjøres her på nettlesernivå (alt her gjøres i henhold til standarden) - nettleseren liker ikke slike tegn, og Windows-kommandotolken fungerer ikke med slike kodede verdier. Og ett minus til - hele strengen sendes som en parameter, inkludert protokollnavnet og til og med kolon (sapgui.shortcut.file:). Dessuten, selv om det er det samme sapshcut.exe kan forkaste alt som ikke er en parameter for det (starter med symbolet "-", deretter navnet, "=" og verdi), dvs. en linje som "sapgui.shortcut.file: -system=SID"det vil fortsatt fungere, da uten mellomrom"sapgui.shortcut.file:-system=SID"fungerer ikke lenger.

Det viser seg at det i prinsippet er to alternativer for å bruke URI-protokollen:

  1. Bruke uten parametere: Vi lager en hel haug med protokoller for alle våre systemer av denne typen SIDMANDT, type AAA200, BBB200 og så videre. Hvis du bare trenger å starte ønsket system, er alternativet ganske brukbart, men i vårt tilfelle er det ikke egnet, siden du i det minste ønsker å overføre brukerinnloggingen, men dette kan ikke gjøres på denne måten.
  2. Bruke et wrapper-program for å ringe sapshcut.exe eller sapgui.exe. Essensen av dette programmet er enkelt - det må ta strengen som nettleseren overfører til den via nettprotokollen og gjøre den om til representasjonen som Windows mottar, dvs. gjør alle tegnkoder tilbake til tegn (kanskje til og med analyserer strengen i henhold til parametere) og kaller allerede SAP GUI med en garantert korrekt kommando. I vårt tilfelle er det heller ikke helt egnet (det er derfor jeg ikke engang skrev det), fordi det er ikke nok for oss å legge til protokollen på alle bruker-PCer (innenfor et domene er dette fortsatt greit, selv om det også er bedre å unngå denne praksisen), men her må vi mer plassere programmet på PC-en, og også hele tiden sørge for at det ikke forsvinner når programvaren reinstalleres på PC-en.

De. Vi forkaster også dette alternativet som uegnet for oss.

På dette tidspunktet begynte jeg allerede å tenke at jeg måtte si farvel til ideen om å lansere SAP GUI med de nødvendige parameterne fra nettleseren, men så kom ideen opp for meg at du kan lage en snarvei i SAP Logon og kopier den til skrivebordet. Jeg brukte denne metoden en gang, men før det så jeg ikke spesifikt på snarveisfilen. Og det viste seg at denne snarveien er en vanlig tekstfil med utvidelsen .sevje. Og hvis du kjører det på Windows, vil SAP GUI starte med parameterne som er spesifisert i denne filen. "Bingo!"

Formatet til denne filen er omtrent som følgende (det kan også være en transaksjon som ble lansert ved oppstart, men jeg har utelatt den):

[System]
Name=SID
Client=200
[User]
Name=
Language=RU
Password=
[Function]
Title=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0

Det ser ut til at alt som trengs: en systemidentifikator, en klient, et brukernavn og til og med et passord. Og til og med flere parametere: Tittel - vindustittel, GuiSize — størrelsen på vinduet som kjører (fullskjerm eller ikke) og gjenbruk — om det er nødvendig å åpne et nytt vindu eller bruke et allerede åpent med samme system. Men en nyanse dukket umiddelbart opp - det viste seg at passordet i SAP Logon ikke kunne angis, linjen ble blokkert. Det viste seg at dette ble gjort av sikkerhetsmessige årsaker: den lagrer alle snarveier opprettet i SAP Logon i en fil sapshortcut.ini (Nær saplogon.ini i Windows-brukerprofilen) og der, selv om de er kryptert, er de ikke for sterkt krypterte, og om ønskelig kan de dekrypteres. Men du kan løse dette ved å endre verdien til én parameter i registret (standardverdien er 0):

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

Dette låser opp passordfeltet for oppføring på snarveiopprettingsskjemaet i SAP Logon:

Starter SAP GUI fra en nettleser

Og når du skriver inn et passord i dette feltet, vil det bli plassert i den tilsvarende linjen
sapshortcut.ini, men når du drar en snarvei til skrivebordet, vises den ikke der - men du kan legge den til der manuelt. Passordet er kryptert, for 111111 vil det være som følger: PW_49B02219D1F6, for 222222 - PW_4AB3211AD2F5. Men vi er mer interessert i det faktum at dette passordet er kryptert på én måte, uavhengig av den spesifikke PC-en, og hvis vi tilbakestiller passordet til det opprinnelige, kan vi bruke en forhåndskjent verdi i dette feltet. Vel, hvis vi vil bruke et tilfeldig opprettet passord, må vi forstå algoritmen til denne chifferen. Men å dømme etter eksemplene som er gitt, vil dette ikke være vanskelig å gjøre. Forresten, i SAP GUI 7.40 forsvant dette feltet helt fra skjemaet, men det godtar en fil med et utfylt passord på riktig måte.

Det vil si at det viser seg at du i nettleseren bare trenger å klikke på lenken til en fil med filtypen .sap og ønsket format - og den vil tilby å åpne den som en fil av typen SAP GUI-snarvei (naturligvis på en PC med SAP GUI installert) og vil åpne et SAP GUI-vindu med de spesifiserte parameterne (hvis SID-en og klientparet er i SAP-påloggingslisten på denne PC-en).

Men det er klart at ingen bare vil lage filer på forhånd og lagre dem på nettstedet - de må genereres basert på de nødvendige parameterne. Du kan for eksempel lage et PHP-skript for å generere 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=Вход в системуrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>

Hvis du ikke spesifiserer brukernavn og passord, får du opp følgende vindu som ber om pålogging og passord:

Starter SAP GUI fra en nettleser

Hvis du passerer kun påloggingen, vil påloggingsfeltet fylles ut og passordfeltet vil være tomt. Hvis vi gir brukeren både pålogging og passord, men brukeren på PC-en har EnablePassword-nøkkelen i registeret i [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]-delen satt til 0, så får vi det samme. Og bare hvis denne nøkkelen er satt til 1 og vi sender både navnet og det opprinnelige passordet, vil systemet umiddelbart be deg om å skrive inn et nytt permanent passord to ganger. Det var det vi trengte å få.

Som et resultat har vi følgende sett med vurderte alternativer som en illustrasjon av alle de ovennevnte:

<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', '');"/>Example 1: Execute sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Example 2: Open sapshcut.exe (URI)</a><br>
<a href='sapshcut.php?SID=SID&Client=200&User=test'>Example 3: Open file .sap (SAP GUI Shortcut)</a><br>
</body>
</html>

Det siste alternativet passet meg. Men i stedet for å generere SAP-snarveier, kan du også bruke for eksempel å generere CMD-filer, som, når de åpnes fra en nettleser, også vil åpne SAP GUI-vinduet for deg. Nedenfor er et eksempel (sapguicmd.php) start SAP GUI direkte med hele tilkoblingsstrengen, uten å måtte ha SAP-pålogging konfigurert:

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

Kilde: www.habr.com

Legg til en kommentar