SAP GUI starten vanuit een browser

Ik schreef dit artikel eerst in mijn blog, om later niet opnieuw te zoeken en te onthouden, maar aangezien niemand de blog leest, wilde ik deze informatie met iedereen delen, voor het geval iemand het nuttig vindt.

Terwijl ik aan het idee werkte van een service voor het opnieuw instellen van wachtwoorden in SAP R/3-systemen, rees er een vraag: hoe start je SAP GUI met de nodige parameters vanuit de browser? Omdat dit idee het gebruik van een webservice impliceerde, moest eerst worden gereageerd op een SOAP-verzoek van de SAP GUI en een brief worden verzonden met een link naar een webpagina met een script om het wachtwoord opnieuw in te stellen naar het oorspronkelijke wachtwoord, en vervolgens aan de gebruiker worden weergegeven een bericht over de succesvolle wachtwoordreset en weergave van dit allereerste wachtwoord, dan zou ik graag willen dat deze pagina ook een link heeft om SAP GUI te starten. Bovendien zou deze link het gewenste systeem moeten openen, en bij voorkeur met de login- en wachtwoordvelden tegelijk ingevuld: de gebruiker hoeft het productieve wachtwoord slechts twee keer in te vullen.

Het starten van SAP Logon was niet interessant voor ons doel, en bij het uitvoeren van sapgui.exe was het onmogelijk om de client- en gebruikersnaam op te geven, maar het was mogelijk om een ​​systeem te starten dat niet gedefinieerd was in SAP Logon. Aan de andere kant was het starten van SAP GUI met willekeurige serverparameters niet bijzonder relevant: als we het probleem van het opnieuw instellen van het wachtwoord van een gebruiker oplossen, dan heeft hij hoogstwaarschijnlijk al de benodigde regel in SAP Logon, met de instellingen die hij nodig heeft, en daar het is niet nodig om met zijn eigen te knoeien. Maar aan de gespecificeerde vereisten werd voldaan door de SAP GUI Shortcut-technologie en het sapshcut.exe-programma zelf, waardoor het mogelijk werd om de SAP GUI te starten met behulp van een specifieke "snelkoppeling".

Het probleem rechtstreeks oplossen: sapshcut.exe rechtstreeks vanuit de browser starten met behulp van een ActiveX-object:

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');
}

De oplossing is slecht: ten eerste werkt het alleen in Internet Explorer, ten tweede vereist het de juiste beveiligingsinstellingen in de browser, wat in een organisatie mogelijk verboden is op domeinniveau, en zelfs als het wordt toegestaan, geeft de browser een venster weer met een angstaanjagend bericht waarschuwing aan de gebruiker:

SAP GUI starten vanuit een browser

Ik vond oplossing #2 op internet: uw eigen webprotocol maken. Hiermee kunnen we de applicatie starten die we nodig hebben met behulp van een link die het protocol aangeeft, dat we zelf in Windows registreren in het register in de sectie HKEY_CLASSES_ROOT. Omdat SAP GUI Shortcut in deze sectie een eigen subsectie heeft, kunt u daar de tekenreeksparameter URL Protocol met een lege waarde toevoegen:

SAP GUI starten vanuit een browser

Dit protocol begint sapgui.exe met parameters /SNELKOPPELING, en dat is precies wat we nodig hebben:

SAP GUI starten vanuit een browser

Nou ja, of als we een volledig willekeurig protocol willen maken (bijvoorbeeld sapshcut), dan kun je het registreren met het volgende reg-bestand:

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

Als we nu een link maken op een webpagina die het protocol aangeeft Sapgui.Snelkoppeling.Bestand Op een soortgelijke manier:

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

We zouden een venster als dit moeten zien:

SAP GUI starten vanuit een browser

En alles lijkt geweldig, maar als je op de knop “Toestaan” klikt, zien we:

SAP GUI starten vanuit een browser

Oeps, de browser heeft de spatiebalk gewijzigd in %20. Welnu, andere tekens worden ook gecodeerd in hun eigen numerieke code met een procentteken. En het meest onaangename is dat hier op browserniveau niets kan worden gedaan (alles gebeurt hier volgens de standaard) - de browser houdt niet van dergelijke tekens en de Windows-opdrachtinterpreter werkt niet met dergelijke gecodeerde waarden. En nog een minpuntje: de hele string wordt doorgegeven als parameter, inclusief de protocolnaam en zelfs de dubbele punt (sapgui.shortcut.bestand:). Bovendien, hoewel hetzelfde sapshcut.exe kan alles weggooien wat er geen parameter voor is (begint met het symbool “-“, dan de naam, “=” en waarde), d.w.z. een regel als "sapgui.shortcut.file: -systeem=SID"het werkt nog steeds, dan zonder spatie"sapgui.shortcut.file:-system=SID"werkt niet meer.

Het blijkt dat er in principe twee opties zijn om het URI-protocol te gebruiken:

  1. Gebruik zonder parameters: we maken een hele reeks protocollen voor al onze systemen van dit type SIDMANDT, typen AAA200, BBB200 enzovoort. Als u alleen het gewenste systeem hoeft te starten, dan is de optie redelijk werkbaar, maar in ons geval is deze niet geschikt, omdat u in ieder geval de gebruikerslogin wilt overdragen, maar dit kan niet op deze manier worden gedaan.
  2. Een wrapperprogramma gebruiken om aan te roepen sapshcut.exe of sapgui.exe. De essentie van dit programma is eenvoudig: het moet de string die de browser ernaar verzendt via het webprotocol omzetten in de representatie die Windows ontvangt, d.w.z. verandert alle karaktercodes terug in karakters (parseert misschien zelfs de string volgens parameters) en roept SAP GUI al aan met een gegarandeerd correcte opdracht. In ons geval is het ook niet helemaal geschikt (daarom heb ik het niet eens geschreven), omdat het voor ons niet voldoende is om het protocol op alle gebruikers-pc's toe te voegen (binnen een domein is dit nog steeds in orde, hoewel het ook beter is om vermijd deze praktijk), maar hier moeten we het programma meer op de pc plaatsen en er ook voortdurend voor zorgen dat het niet verdwijnt wanneer de software opnieuw op de pc wordt geïnstalleerd.

Die. Ook deze optie wijzen wij af omdat deze voor ons niet geschikt is.

Op dit punt begon ik al te denken dat ik afscheid zou moeten nemen van het idee om SAP GUI te starten met de nodige parameters vanuit de browser, maar toen kwam het idee bij me op dat je een snelkoppeling kunt maken in SAP Logon en kopieer het naar uw bureaublad. Ik heb deze methode één keer gebruikt, maar daarvoor keek ik niet specifiek naar het snelkoppelingsbestand. En het bleek dat deze snelkoppeling een gewoon tekstbestand is met de extensie .sap. En als u het op Windows uitvoert, wordt SAP GUI gestart met de parameters die in dit bestand zijn opgegeven. "Bingo!"

Het formaat van dit bestand is ongeveer het volgende (er kan ook een transactie zijn gestart bij het opstarten, maar ik heb deze weggelaten):

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

Het lijkt erop dat alles nodig is: een systeem-ID, een client, een gebruikersnaam en zelfs een wachtwoord. En zelfs aanvullende parameters: Titel - venstertitel, GuiSize — grootte van het actieve venster (volledig scherm of niet) en visfuik — of het nodig is een nieuw venster te openen of een reeds geopend venster met hetzelfde systeem te gebruiken. Maar er kwam meteen een nuance naar voren: het bleek dat het wachtwoord in SAP Logon niet kon worden ingesteld, de lijn was geblokkeerd. Het bleek dat dit om veiligheidsredenen werd gedaan: alle snelkoppelingen die in SAP Logon zijn gemaakt, worden in een bestand opgeslagen sapshortcut.ini (In de buurt van saplogon.ini in het Windows-gebruikersprofiel) en daar zijn ze weliswaar gecodeerd, maar niet te sterk gecodeerd en kunnen ze desgewenst worden gedecodeerd. Maar u kunt dit oplossen door de waarde van één parameter in het register te wijzigen (de standaardwaarde is 0):

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

Hierdoor wordt het veld Wachtwoord ontgrendeld voor invoer op het formulier voor het maken van snelkoppelingen in SAP Logon:

SAP GUI starten vanuit een browser

En wanneer u in dit veld een wachtwoord invoert, wordt dit op de overeenkomstige regel geplaatst
sapshortcut.ini, maar wanneer u een snelkoppeling naar het bureaublad sleept, verschijnt deze daar niet, maar u kunt deze daar handmatig toevoegen. Het wachtwoord is gecodeerd, voor 111111 is het als volgt: PW_49B02219D1F6, voor 222222 - PW_4AB3211AD2F5. Maar we zijn meer geïnteresseerd in het feit dat dit wachtwoord op één manier is gecodeerd, onafhankelijk van de specifieke pc, en als we het wachtwoord opnieuw instellen op het oorspronkelijke wachtwoord, kunnen we één vooraf bekende waarde in dit veld gebruiken. Als we een willekeurig aangemaakt wachtwoord willen gebruiken, zullen we het algoritme van dit cijfer moeten begrijpen. Maar afgaande op de gegeven voorbeelden zal dit niet moeilijk zijn. Trouwens, in SAP GUI 7.40 is dit veld volledig uit het formulier verdwenen, maar het accepteert correct een bestand met een ingevuld wachtwoord.

Dat wil zeggen, het blijkt dat je in de browser gewoon op de link naar een bestand met de .sap-extensie en het gewenste formaat hoeft te klikken - en het zal aanbieden om het te openen als een bestand zoals SAP GUI Shortcut (uiteraard op een pc met SAP GUI geïnstalleerd) en opent een SAP GUI-venster met de opgegeven parameters (als de SID en het clientpaar in de SAP-aanmeldingslijst op deze pc staan).

Maar het is duidelijk dat niemand eenvoudigweg vooraf bestanden zal maken en deze op de site zal opslaan - ze moeten worden gegenereerd op basis van de noodzakelijke parameters. U kunt bijvoorbeeld een PHP-script maken om snelkoppelingen te genereren (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";
?>

Als u geen gebruikersnaam en wachtwoord opgeeft, krijgt u het volgende venster waarin om login en wachtwoord wordt gevraagd:

SAP GUI starten vanuit een browser

Als u alleen de login doorgeeft, wordt het loginveld ingevuld en het wachtwoordveld leeg. Als we de gebruiker zowel een login als een wachtwoord geven, maar de gebruiker op de pc de EnablePassword-sleutel in het register in de sectie [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] heeft ingesteld op 0, dan krijgen we hetzelfde. En alleen als deze sleutel op 1 staat en we zowel de naam als het initiële wachtwoord doorgeven, zal het systeem u onmiddellijk vragen om tweemaal een nieuw permanent wachtwoord in te voeren. Dat is wat we moesten krijgen.

Als gevolg hiervan hebben we de volgende reeks overwogen opties ter illustratie van al het bovenstaande:

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

De laatste optie beviel mij. Maar in plaats van het genereren van SAP-snelkoppelingen kunt u bijvoorbeeld ook CMD-bestanden genereren, die, wanneer ze vanuit een browser worden geopend, ook het SAP GUI-venster voor u openen. Hieronder ziet u een voorbeeld (sapguicmd.php) start de SAP GUI rechtstreeks met de volledige verbindingsreeks, zonder dat SAP-aanmelding hoeft te worden geconfigureerd:

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

Bron: www.habr.com

Voeg een reactie