Starta SAP GUI från en webbläsare

Jag skrev först den här artikeln i min blogg, för att inte söka och komma ihåg igen senare, men eftersom ingen läser bloggen så ville jag dela denna information med alla, ifall någon tycker att den är användbar.

Under arbetet med idén om en lösenordsåterställningstjänst i SAP R/3-system uppstod en fråga - hur man startar SAP GUI med nödvändiga parametrar från webbläsaren? Eftersom denna idé innebar användningen av en webbtjänst, först svara på en SOAP-förfrågan från SAP GUI och skicka ett e-postmeddelande med en länk till en webbsida med ett skript för att återställa lösenordet till det ursprungliga, och sedan visa det för användaren ett meddelande om lyckad lösenordsåterställning och visning av detta allra första lösenord, så vill jag att den här sidan också ska ha en länk för att starta SAP GUI. Dessutom bör denna länk öppna det önskade systemet, och helst med inloggnings- och lösenordsfälten ifyllda på en gång: användaren skulle bara behöva fylla i det produktiva lösenordet två gånger.

Att starta SAP Logon var inte intressant för vårt syfte, och när man körde sapgui.exe var det omöjligt att ange klient och användarnamn, men det var möjligt att starta ett system som inte definierades i SAP Logon. Å andra sidan var det inte särskilt relevant att starta SAP GUI med godtyckliga serverparametrar: om vi löser problemet med att återställa en användares lösenord, så har han troligen redan den nödvändiga raden i SAP Logon, med de inställningar han behöver, och där behöver inte bråka med sin egen. Men de specificerade kraven uppfylldes av SAP GUI-genvägstekniken och själva programmet sapshcut.exe, vilket gjorde det möjligt att starta SAP GUI med en specifik "genväg".

Att lösa problemet direkt: starta sapshcut.exe direkt från webbläsaren med ett 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 är dålig: för det första fungerar det bara i Internet Explorer, för det andra kräver det lämpliga säkerhetsinställningar i webbläsaren, vilket i en organisation kan vara förbjudet på domännivå, och även om det är tillåtet visar webbläsaren ett fönster med ett skrämmande varning till användaren:

Starta SAP GUI från en webbläsare

Jag hittade lösning #2 på Internet: skapa ditt eget webbprotokoll. Tillåter oss att starta applikationen vi behöver med hjälp av en länk som indikerar protokollet, som vi själva registrerar i Windows i registret i avsnittet HKEY_CLASSES_ROOT. Eftersom SAP GUI-genväg har ett eget underavsnitt i det här avsnittet kan du lägga till URL Protocol-strängparametern med ett tomt värde där:

Starta SAP GUI från en webbläsare

Detta protokoll startar sapgui.exe med parameter /GENVÄG, vilket är precis vad vi behöver:

Starta SAP GUI från en webbläsare

Tja, eller om vi vill göra ett helt godtyckligt protokoll (t.ex. sapshcut), då kan du registrera den med följande 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""

Nu, om vi gör en länk på en webbsida som anger protokollet Sapgui.Shortcut.File På ett liknande sätt:

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

Vi borde se ett fönster så här:

Starta SAP GUI från en webbläsare

Och allt verkar bra, men när du klickar på "Tillåt"-knappen ser vi:

Starta SAP GUI från en webbläsare

Hoppsan, webbläsaren gjorde mellanslagstangenten till %20. Nåväl, andra tecken kommer också att kodas till sin egen numeriska kod med en procentsymbol. Och det mest obehagliga är att ingenting kan göras här på webbläsarnivå (allt här görs enligt standarden) - webbläsaren gillar inte sådana tecken, och Windows-kommandotolken fungerar inte med sådana kodade värden. Och ett minus till - hela strängen skickas som en parameter, inklusive protokollnamnet och även kolon (sapgui.shortcut.file:). Dessutom, även om det är samma sapshcut.exe kan kassera allt som inte är en parameter för det (börjar med symbolen "-", sedan namnet, "=" och värde), d.v.s. en rad som "sapgui.shortcut.file: -system=SID"det kommer fortfarande att fungera, då utan ett mellanslag"sapgui.shortcut.file:-system=SID"fungerar inte längre.

Det visar sig att det i princip finns två alternativ för att använda URI-protokollet:

  1. Användning utan parametrar: Vi skapar en hel massa protokoll för alla våra system av denna typ SIDMANDT, typ AAA200, BBB200 och så vidare. Om du bara behöver starta det önskade systemet är alternativet ganska fungerande, men i vårt fall är det inte lämpligt, eftersom du åtminstone skulle vilja överföra användarinloggningen, men det kan inte göras på detta sätt.
  2. Använder ett omslagsprogram för att ringa sapshcut.exe eller sapgui.exe. Kärnan i detta program är enkel - det måste ta strängen som webbläsaren överför till den via webbprotokollet och förvandla den till representationen som Windows tar emot, d.v.s. gör tillbaka alla teckenkoder till tecken (kanske till och med analyserar strängen enligt parametrar) och anropar redan SAP GUI med ett garanterat korrekt kommando. I vårt fall är det inte heller helt lämpligt (det är därför jag inte ens skrev det), eftersom det inte räcker för oss att lägga till protokollet på alla användardatorer (inom en domän är det fortfarande okej, även om det också är bättre att undvika denna praxis), men här kommer vi att behöva mer placera programmet på datorn, och också ständigt se till att det inte försvinner när programvaran installeras om på datorn.

De där. Vi förkastar också detta alternativ som olämpligt för oss.

Vid det här laget började jag redan tänka att jag skulle behöva säga adjö till idén att lansera SAP GUI med de nödvändiga parametrarna från webbläsaren, men då kom tanken upp för mig att du kan göra en genväg i SAP Logon och kopiera den till ditt skrivbord. Jag använde den här metoden en gång, men innan dess tittade jag inte specifikt på genvägsfilen. Och det visade sig att den här genvägen är en vanlig textfil med tillägget .sav. Och om du kör det på Windows kommer SAP GUI att starta med parametrarna som anges i den här filen. "Bingo!"

Formatet för den här filen är ungefär följande (det kan också finnas en transaktion som startas vid start, men jag har utelämnat den):

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

Det verkar som att allt som behövs: en systemidentifierare, en klient, ett användarnamn och till och med ett lösenord. Och även ytterligare parametrar: Titel - fönstertitel, GuiSize — storleken på det löpande fönstret (helskärm eller inte) och Återanvändning — om det är nödvändigt att öppna ett nytt fönster eller använda ett redan öppet med samma system. Men en nyans uppstod omedelbart - det visade sig att lösenordet i SAP Logon inte kunde ställas in, linjen var blockerad. Det visade sig att detta gjordes av säkerhetsskäl: det lagrar alla genvägar som skapats i SAP Logon i en fil sapshortcut.ini (Nära saplogon.ini i Windows användarprofil) och där, även om de är krypterade, är de inte alltför starkt krypterade och om så önskas kan de dekrypteras. Men du kan lösa detta genom att ändra värdet på en parameter i registret (standardvärdet är 0):

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

Detta låser upp fältet Lösenord för inmatning i formuläret för att skapa genvägar i SAP Logon:

Starta SAP GUI från en webbläsare

Och när du anger ett lösenord i det här fältet kommer det att placeras på motsvarande rad
sapshortcut.ini, men när du drar en genväg till skrivbordet visas den inte där – men du kan lägga till den där manuellt. Lösenordet är krypterat, för 111111 blir det som följer: PW_49B02219D1F6, för 222222 - PW_4AB3211AD2F5. Men vi är mer intresserade av det faktum att detta lösenord är krypterat på ett sätt, oberoende av den specifika datorn, och om vi återställer lösenordet till det ursprungliga, kan vi använda ett förkänt värde i det här fältet. Tja, om vi vill använda ett slumpmässigt skapat lösenord måste vi förstå algoritmen för detta chiffer. Men att döma av de exempel som ges kommer detta inte att vara svårt att göra. Förresten, i SAP GUI 7.40 försvann detta fält helt från formuläret, men det accepterar korrekt en fil med ett ifyllt lösenord.

Det vill säga, det visar sig att i webbläsaren behöver du bara klicka på länken till en fil med filtillägget .sap och det önskade formatet - och det kommer att erbjudas att öppna den som en fil som SAP GUI Shortcut (naturligtvis på en PC med SAP GUI installerat) och öppnar ett SAP GUI-fönster med de angivna parametrarna (om SID och klientpar finns i SAP-inloggningslistan på denna PC).

Men det är klart att ingen helt enkelt kommer att skapa filer i förväg och lagra dem på webbplatsen - de måste genereras baserat på nödvändiga parametrar. Till exempel kan du skapa ett PHP-skript för att generera genvägar (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";
?>

Om du inte anger ett användarnamn och lösenord kommer du att få följande fönster som ber om inloggning och lösenord:

Starta SAP GUI från en webbläsare

Om du bara klarar inloggningen kommer inloggningsfältet att fyllas i och lösenordsfältet kommer att vara tomt. Om vi ​​ger användaren både en inloggning och ett lösenord, men användaren på PC:n har EnablePassword-nyckeln i registret i avsnittet [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] satt till 0, så får vi samma sak. Och bara om denna nyckel är inställd på 1 och vi skickar både namnet och det ursprungliga lösenordet, kommer systemet omedelbart att uppmana dig att ange ett nytt permanent lösenord två gånger. Det var vad vi behövde få.

Som ett resultat har vi följande uppsättning övervägda alternativ som en illustration av allt ovan:

<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 sista alternativet passade mig. Men istället för att generera SAP-genvägar kan du också använda till exempel att generera CMD-filer, som när de öppnas från en webbläsare också öppnar SAP GUI-fönstret för dig. Nedan är ett exempel (sapguicmd.php) starta SAP GUI direkt med den fullständiga anslutningssträngen, utan att behöva ha SAP Logon konfigurerad:

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

Källa: will.com

Lägg en kommentar