Ta članek sem najprej napisal v svoj , da ga ne bi moral ponovno iskati in se spominjati, vendar ker noben ne bere bloga, sem se odločil, da to informacijo delim z vsemi, morda bo komu koristila.
Med delom na ideji storitve za ponastavitev gesla v sistemih SAP R/3 se je pojavilo vprašanje — kako zagnati SAP GUI z želenimi parametri iz brskalnika? Ker je bila v tej ideji predvidena uporaba spletne storitve, ki prvotno deluje na zahtevo SOAP iz SAP GUI in pošlje e-pošto s povezavo na spletno stran s skripto za ponastavitev gesla na začetno, potem pa še prikaže sporočilo o uspešni ponastavitvi gesla in prikaže to začetno geslo, sem želel, da je na tej strani tudi povezava za zagon SAP GUI. Pri tem bi ta povezava odprla želeni sistem in, čim bolje, takoj z izpolnjenimi polji za prijavo in geslo: uporabniku bi ostalo le, da dvakrat vnese produktivno geslo.
Zagon SAP Logon — za naš cilj ni bil zanimiv, ob zagonu sapgui.exe pa ni bilo mogoče navesti mandanta in uporabniškega imena, je pa bilo mogoče zagnati sistem, ki ni bil določen v SAP Logon. Po drugi strani pa zagon SAP GUI z poljubnimi parametri strežnika ni bil posebej aktualen: če že rešujemo problem, kako ponastaviti geslo uporabnika, ima verjetno v SAP Logon že potrebno vrstico z njemu ustreznimi nastavitvami in ni treba posegati s svojimi. Zato je tehnologija SAP GUI Shortcut in sama program sapshcut.exe zadostila danim zahtevam, saj omogoča zagon SAP GUI z uporabo določenega „bližnjice“.
Rešitev problema na hitro: zagon sapshcut.exe neposredno iz brskalnika s pomočjo objekta ActiveX:
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');
}
Rešitev ni dobra: najprej deluje samo v Internet Explorerju, drugič pa zahteva ustrezne varnostne nastavitve v brskalniku, ki so lahko v organizaciji na ravni domene prepovedane, in tudi če so dovoljene, brskalnik uporabniku prikaže okno s zastrašujočim opozorilom:

Rešitev št. 2 sem našel na internetu: . Omogoča zagon želenega programa prek povezave z navedbo protokola, ki ga sami registriramo v Windows v registru pod HKEY_CLASSES_ROOT. Ker ima SAP GUI Shortcut v tem razdelku svoj pododdelek, lahko dodamo nizovni parameter URL Protocol z prazno vrednostjo:

Ta protokol zažene sapgui.exe s parametrom /SHORTCUT, kar pravzaprav potrebujemo:

Ali pa, če želimo ustvariti povsem poljuben protokol (na primer, sapshcut), ga lahko registriramo s pomočjo naslednje reg datoteke:
Uređivač registra sustava Windows verzija 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""
Zdaj, če na spletni strani ustvarimo povezavo z navedbo protokola Sapgui.Shortcut.File na naslednji način:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
moralo bi se prikazati okno, ki izgleda takole:

In vse se zdi odlično, vendar ob pritisku na gumb 'Dovoli' vidimo:

Oops, the browser turned the space into . Other characters will also be encoded in their numerical code with the percent sign. The most frustrating part is that there's nothing that can be done at the browser level (this is all done according to the standard) — browsers don't like such characters, and the Windows command interpreter doesn't work with these encoded values. One more downside is that the entire string is passed as a parameter, including the protocol name and even the colon.sapgui.shortcut.file:). Čeprav sapshcut.exe lahko ignorira vse, kar ni parameter (se začne z znakom '- ', nato ime, '=', in vrednost), tj. vrstica oblike 'sapgui.shortcut.file: -system=SID' še deluje, toda brez presledka 'sapgui.shortcut.file:-system=SID' že ne deluje.
Izkaže se, da sta torej na voljo dve možnosti uporabe URI protokola:
- Uporaba brez parametrov: Ustvarimo celo kup protokolov za vse naše sisteme v obliki SIDMANDT, tipa AAA200, BBB200 in tako naprej. Če potrebujemo samo zagnati želeno sistemo, potem je ta možnost povsem delujoča, vendar v našem primeru ne ustreza, saj bi radi tudi prenesli uporabniško ime, kar na ta način ni mogoče.
- Uporaba obratne aplikacije za klic sapshcut.exe ili sapgui.exeOsnova te программы je preprosta — vzela bo niz, ki ji ga bo posredoval brskalnik prek spletnega protokola, in ga pretvorila v obliko, kot jo prejme Windows, t.j. nazaj pretvori vse kodirane znake v znake (morda celo analizira niz po parametrih) in že pokliče SAP GUI z zagotovljeno pravilno ukazno vrstico. V našem primeru to tudi ni čisto primerno (zato je niti nisem napisal), ker nam že malo zanimivo dodati protokol na vseh uporabniških računalnikih (v okviru domene je to še lahko, čeprav je tudi bolje, da se takšni praksi izognemo), vendar bo treba še dodatno aplikacijo namestiti na računalnik, pa še nenehno paziti, da se ne izgubi ob ponovni namestitvi programske opreme na računalniku.
T.j. ta različica se prav tako zavrže kot neprimerna za nas.
Tukaj sem že začel razmišljati, da bom moral odstopiti od ideje o zagonu SAP GUI s potrebnimi parametri iz brskalnika, toda takrat mi je prišla na misel ideja, da lahko v SAP Logon naredim bližnjico in jo skopiram na namizje. Tudi sam sem že uporabljal to metodo, toda prej tega datoteke bližnjice nisem posebej gledal. In izkazalo se je, da ta bližnjica predstavlja običajno besedilno datoteko z razširjenjem .sap. In če jo zagnamo v Windows — se zažene SAP GUI s parametri, ki so navedeni v tej datoteki. "Bingo!"
Format te datoteke je približno naslednji (morda je še zagonska transakcija ob zagonu, ampak sem jo izpustil):
[System]
Ime=SID
Stranka=200
[User]
Ime=
Jezik=RU
Geslo=
[Function]
Naslov=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0
Zdi se, da je vse, kar je potrebno: identifikator sistema, in mandant, in uporabniško ime, celo geslo. In celo dodatni parametri: Naslov — naslov okna, VelikostGui — velikost odprtega okna (čez celo zaslon ali ne) in PonovnaUporaba — ali je nujno odpreti novo okno ali uporabiti že odprto s tem sistemom. Toda takoj se pojavi težava — gesla v SAP Logon ni bilo mogoče nastavitev, polje je bilo zaklenjeno. Izkazalo se je, da je to bilo storjeno iz varnostnih razlogov: vse bližnjice, ustvarjene v SAP Logon, hrani v datoteki sapshortcut.ini (poleg saplogon.ini v uporabniškem profilu Windows) in tam, čeprav so šifrirane, niso preveč močno in ob velikih željah jih je mogoče dešifrirati. Ampak to lahko tudi omogočimo z spremembo vrednosti enega parametra v registru (privzeto vrednost 0):
Uređivač registra sustava Windows verzija 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
To odklene polje „Geslo“ na obrazcu za ustvarjanje bližnjice v SAP Logon:

In this field, when entering a password, it will be placed in the corresponding line.
sapshortcut.ini, but when dragging the shortcut to the desktop, it does not appear there — however, it can be added manually. The password is encrypted; for 111111 it will look like this: PW_49B02219D1F6, for 222222 — PW_4AB3211AD2F5. What interests us more is that this password is encrypted in a way that is independent of the specific PC, and if we reset the password to the initial one, we can use a known value in this field. And if we want to use a randomly generated password — we will have to understand the algorithm of this encryption. But, judging by the examples provided, it should not be difficult to do. By the way, in SAP GUI 7.40 this field has completely disappeared from the form, but it correctly perceives the file with the filled password.
So it turns out that in the browser, it is sufficient to click on a link to a file with the .sap extension and the required format — it will offer to open it as a SAP GUI Shortcut file (naturally on a PC with SAP GUI installed) and will open the SAP GUI window with the specified parameters (if the SID and client pair is in the SAP Logon list on this PC).
However, it is clear that no one will create files in advance and store them on the site — they need to be generated based on the required parameters. For example, you can create a PHP script to generate shortcuts (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=Loginrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>
If no username and password are provided, we will get the following window prompting for login and password:

Če predamo le prijavo, bo polje prijava izpolnjeno, medtem ko bo polje geslo prazno. Če pa uporabniku predamo tako prijavo kot geslo, vendar je ključ EnablePassword v registru na računalniku uporabnika v razdelku [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] nastavljen na 0, bomo dobili enako. Le če je ta ključ nastavljen na 1 in predamo tako ime kot začetno geslo, bo sistem takoj zahteval, da dvakrat vnesemo novo trajno geslo. Kar smo želeli doseči.
Na koncu imamo naslednji nabor obravnavanih možnosti kot ilustracijo vsega zgoraj navedenega:
<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', '');"/>Primer 1: Izvedite sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Primer 2: Odprite sapshcut.exe (URI)</a><br>
<a href='/sl/sapshcut.php/?SID=SID&Client=200&User=test'>Primer 3: Odprite datoteko .sap (SAP GUI bližnjica)</a><br>
</body>
</html>
Zadnja možnost mi je ustrezala. Lahko pa namesto generiranja bližnjic SAP uporabite na primer generiranje CMD datotek, ki bodo ob odprtju iz brskalnika prav tako odprle okno SAP GUI. Spodaj je prikazan primer (sapguicmd.php) neposrednega zagon SAP GUI z navedbo polne povezovalne vrstice, brez potrebe po nastavljeni 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 Vhod v ".$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";
?>
Izvor: habr.com
