Begin SAP GUI vanaf 'n blaaier

Ek het eers hierdie artikel in my blog, om nie later weer te soek en te onthou nie, maar aangesien niemand die blog lees nie, wou ek hierdie inligting met almal deel, ingeval iemand dit nuttig vind.

Terwyl u gewerk het aan die idee van 'n wagwoordterugsteldiens in SAP R/3-stelsels, het 'n vraag ontstaan ​​- hoe om SAP GUI met die nodige parameters vanaf die blaaier te begin? Aangesien hierdie idee die gebruik van 'n webdiens geïmpliseer het, reageer eers op 'n SOAP-versoek vanaf die SAP GUI en stuur 'n e-pos met 'n skakel na 'n webblad met 'n skrip om die wagwoord terug te stel na die aanvanklike een, en dan aan die gebruiker te vertoon 'n boodskap oor die suksesvolle wagwoordterugstelling en die vertoon van hierdie aanvanklike wagwoord, dan wil ek graag hê dat hierdie bladsy ook 'n skakel het om SAP GUI te begin. Boonop moet hierdie skakel die verlangde stelsel oopmaak, en verkieslik met die aanmeld- en wagwoordvelde gelyktydig ingevul: die gebruiker hoef slegs die produktiewe wagwoord twee keer in te vul.

Die bekendstelling van SAP Logon was nie interessant vir ons doel nie, en wanneer sapgui.exe bestuur word, was dit onmoontlik om die kliënt en gebruikersnaam te spesifiseer, maar dit was moontlik om 'n stelsel te begin wat nie in SAP Logon gedefinieer is nie. Aan die ander kant was die bekendstelling van SAP GUI met arbitrêre bedienerparameters nie besonder relevant nie: as ons die probleem oplos om 'n gebruiker se wagwoord terug te stel, dan het hy heel waarskynlik reeds die nodige lyn in SAP Logon, met die instellings wat hy nodig het, en daar is nie nodig om met sy eie te mors nie. Maar die gespesifiseerde vereistes is nagekom deur die SAP GUI Shortcut-tegnologie en die sapshcut.exe-program self, wat dit moontlik gemaak het om die SAP GUI met behulp van 'n spesifieke "kortpad" te begin.

Los die probleem kop op: Begin sapshcut.exe direk vanaf die blaaier met behulp van 'n ActiveX-voorwerp:

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

Die oplossing is sleg: eerstens werk dit net in Internet Explorer, tweedens vereis dit toepaslike sekuriteitsinstellings in die blaaier, wat in 'n organisasie op domeinvlak verbied kan word, en selfs as dit toegelaat word, vertoon die blaaier 'n venster met 'n skrikwekkende waarskuwing aan die gebruiker:

Begin SAP GUI vanaf 'n blaaier

Ek het oplossing #2 op die internet gevind: skep jou eie webprotokol. Laat ons toe om die toepassing te begin wat ons benodig deur 'n skakel aan te dui wat die protokol aandui, wat ons self in Windows registreer in die register in die HKEY_CLASSES_ROOT-afdeling. Aangesien SAP GUI Shortcut sy eie onderafdeling in hierdie afdeling het, kan jy die URL Protocol string parameter met 'n leë waarde daar byvoeg:

Begin SAP GUI vanaf 'n blaaier

Hierdie protokol begin sapgui.exe met parameter /KORTPAD, wat presies is wat ons nodig het:

Begin SAP GUI vanaf 'n blaaier

Wel, of as ons 'n heeltemal arbitrêre protokol wil maak (byvoorbeeld, sapshcut), dan kan jy dit registreer deur die volgende reg-lêer te gebruik:

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

Nou, as ons 'n skakel op 'n webblad maak wat die protokol aandui Sapgui.Shortcut.File Op soortgelyke wyse:

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

Ons behoort 'n venster soos hierdie te sien:

Begin SAP GUI vanaf 'n blaaier

En alles lyk wonderlik, maar as jy op die "Laat toe"-knoppie klik, sien ons:

Begin SAP GUI vanaf 'n blaaier

Oeps, die blaaier het die spasiebalk in %20 verander. Wel, ander karakters sal ook geënkodeer word in hul eie numeriese kode met 'n persentasie simbool. En die onaangenaamste ding is dat niks hier op blaaiervlak gedoen kan word nie (alles hier word volgens die standaard gedoen) - die blaaier hou nie van sulke karakters nie, en die Windows-opdragvertolker werk nie met sulke geënkodeerde waardes nie. En nog een minus - die hele string word as 'n parameter deurgegee, insluitend die protokolnaam en selfs die dubbelpunt (sapgui.shortcut.file:). Verder, hoewel dieselfde sapshcut.exe kan alles weggooi wat nie 'n parameter daarvoor is nie (begin met die simbool "-", dan die naam, "=" en waarde), m.a.w. 'n reël soos "sapgui.shortcut.file: -system=SID"dit sal steeds werk, dan sonder 'n spasie"sapgui.shortcut.file:-system=SID"werk nie meer nie.

Dit blyk dat daar in beginsel twee opsies is om die URI-protokol te gebruik:

  1. Gebruik sonder parameters: Ons skep 'n hele klomp protokolle vir al ons stelsels van die tipe SIDMANDT, soos AAA200, BBB200 en so aan. As u net die verlangde stelsel moet begin, is die opsie redelik werkbaar, maar in ons geval is dit nie geskik nie, aangesien u ten minste die gebruikersaanmelding wil oordra, maar dit kan nie op hierdie manier gedoen word nie.
  2. Gebruik 'n omhulprogram om te bel sapshcut.exe of sapgui.exe. Die kern van hierdie program is eenvoudig - dit moet die string neem wat die blaaier via die webprotokol na hom stuur en dit verander in die voorstelling wat Windows ontvang, d.w.s. verander alle karakterkodes terug in karakters (miskien ontleed selfs die string volgens parameters) en roep reeds SAP GUI met 'n gewaarborgde korrekte opdrag. In ons geval is dit ook nie heeltemal geskik nie (dit is hoekom ek dit nie eers geskryf het nie), want dit is nie genoeg vir ons om die protokol op alle gebruikersrekenaars by te voeg nie (binne 'n domein is dit steeds in orde, alhoewel dit ook beter is om vermy hierdie praktyk), maar hier sal ons meer die program op die rekenaar moet plaas, en ook voortdurend verseker dat dit nie verdwyn wanneer die sagteware weer op die rekenaar geïnstalleer word nie.

Dié. Ons verwerp ook hierdie opsie as ongeskik vir ons.

Op hierdie stadium het ek al begin dink dat ek totsiens sou moes sê vir die idee om SAP GUI met die nodige parameters vanaf die blaaier te begin, maar toe kom die idee by my op dat jy 'n kortpad in SAP Logon en kopieer dit na jou lessenaar. Ek het hierdie metode een keer gebruik, maar voor dit het ek nie spesifiek na die kortpadlêer gekyk nie. En dit het geblyk dat hierdie kortpad 'n gewone tekslêer met die uitbreiding is .sap. En as jy dit op Windows laat loop, sal SAP GUI begin met die parameters wat in hierdie lêer gespesifiseer word. "Bingo!"

Die formaat van hierdie lêer is ongeveer die volgende (daar kan ook 'n transaksie wees wat by opstart begin is, maar ek het dit weggelaat):

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

Dit blyk dat alles wat nodig is: 'n stelsel identifiseerder, 'n kliënt, 'n gebruikersnaam en selfs 'n wagwoord. En selfs bykomende parameters: Titel - venster titel, GuiSize — grootte van die lopende venster (volskerm of nie) en hergebruik — of dit nodig is om 'n nuwe venster oop te maak of 'n reeds oop een met dieselfde stelsel te gebruik. Maar 'n nuanse het dadelik na vore gekom - dit het geblyk dat die wagwoord in SAP Logon nie ingestel kon word nie, die lyn is geblokkeer. Dit het geblyk dat dit om sekuriteitsredes gedoen is: dit stoor alle kortpaaie wat in SAP Logon geskep is in 'n lêer sapshortcut.ini (Naby saplogon.ini in die Windows-gebruikersprofiel) en daar, alhoewel hulle geïnkripteer is, is hulle nie te sterk geïnkripteer nie en, indien verlang, kan hulle gedekripteer word. Maar jy kan dit oplos deur die waarde van een parameter in die register te verander (die verstekwaarde is 0):

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

Dit ontsluit die Wagwoord-veld vir inskrywing op die kortpadskeppingsvorm in SAP Logon:

Begin SAP GUI vanaf 'n blaaier

En wanneer u 'n wagwoord in hierdie veld invoer, sal dit in die ooreenstemmende reël geplaas word
sapshortcut.ini, maar wanneer jy 'n kortpad na die lessenaar sleep, verskyn dit nie daar nie - maar jy kan dit met die hand daar byvoeg. Die wagwoord is geïnkripteer, vir 111111 sal dit soos volg wees: PW_49B02219D1F6, vir 222222 - PW_4AB3211AD2F5. Maar ons stel meer belang in die feit dat hierdie wagwoord op een manier geïnkripteer is, onafhanklik van die spesifieke rekenaar, en as ons die wagwoord na die aanvanklike een terugstel, kan ons een voorafbekende waarde in hierdie veld gebruik. Wel, as ons 'n lukraak geskepde wagwoord wil gebruik, sal ons die algoritme van hierdie syfer moet verstaan. Maar te oordeel aan die voorbeelde wat gegee word, sal dit nie moeilik wees om te doen nie. Terloops, in SAP GUI 7.40 het hierdie veld heeltemal van die vorm verdwyn, maar dit aanvaar korrek 'n lêer met 'n ingevulde wagwoord.

Dit wil sê, dit blyk dat jy in die blaaier net op die skakel na 'n lêer met die .sap-uitbreiding en die verlangde formaat hoef te klik - en dit sal bied om dit oop te maak as 'n lêer soos SAP GUI Shortcut (natuurlik op 'n rekenaar) met SAP GUI geïnstalleer) en sal 'n SAP GUI-venster oopmaak met die gespesifiseerde parameters (indien die SID en kliëntpaar in die SAP-aanmeldinglys op hierdie rekenaar is).

Maar dit is duidelik dat niemand eenvoudig vooraf lêers sal skep en dit op die webwerf sal stoor nie - dit moet gegenereer word op grond van die nodige parameters. Byvoorbeeld, jy kan 'n PHP-skrip skep om kortpaaie te genereer (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";
?>

As jy nie 'n gebruikersnaam en wagwoord spesifiseer nie, sal jy die volgende venster kry wat vir aanmelding en wagwoord vra:

Begin SAP GUI vanaf 'n blaaier

As jy slegs die aanmelding slaag, sal die aanmeldveld ingevul word en die wagwoordveld sal leeg wees. As ons die gebruiker beide 'n aanmelding en 'n wagwoord gee, maar die gebruiker op die rekenaar het die EnablePassword-sleutel in die register in die [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]-afdeling op 0 gestel, dan kry ons dieselfde ding. En slegs as hierdie sleutel op 1 gestel is en ons beide die naam en die aanvanklike wagwoord deurgee, sal die stelsel jou dadelik vra om 'n nuwe permanente wagwoord twee keer in te voer. Dit is wat ons moes kry.

As gevolg hiervan het ons die volgende stel oorweegde opsies as 'n illustrasie van al die bogenoemde:

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

Die laaste opsie het my gepas. Maar in plaas daarvan om SAP-kortpaaie te genereer, kan jy ook byvoorbeeld die generering van CMD-lêers gebruik, wat, wanneer dit vanaf 'n blaaier oopgemaak word, ook die SAP GUI-venster vir jou sal oopmaak. Hieronder is 'n voorbeeld (sapguicmd.php) loods die SAP GUI direk met die volledige verbindingstring, sonder dat SAP Logon gekonfigureer hoef te word:

<?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: will.com

Voeg 'n opmerking