Paglulunsad ng SAP GUI mula sa isang browser

Una kong isinulat ang artikulong ito sa aking blog, upang hindi na maghanap at matandaan muli sa ibang pagkakataon, ngunit dahil walang nagbabasa ng blog, gusto kong ibahagi ang impormasyong ito sa lahat, kung sakaling may makitang kapaki-pakinabang ito.

Habang nagtatrabaho sa ideya ng isang serbisyo sa pag-reset ng password sa mga sistema ng SAP R/3, lumitaw ang isang tanong - paano ilunsad ang SAP GUI na may mga kinakailangang parameter mula sa browser? Dahil ang ideyang ito ay nagpapahiwatig ng paggamit ng isang serbisyo sa web, tumugon muna sa isang SOAP na kahilingan mula sa SAP GUI at nagpapadala ng isang sulat na may link sa isang web page na may script para sa pag-reset ng password sa una, at pagkatapos ay ipinapakita sa user. isang mensahe tungkol sa matagumpay na pag-reset ng password at pagpapakita ng pinakaunang password na ito , pagkatapos ay gusto kong magkaroon din ang page na ito ng link para ilunsad ang SAP GUI. Higit pa rito, dapat buksan ng link na ito ang nais na sistema, at, mas mabuti, nang sabay-sabay na napunan ang mga patlang sa pag-login at password: kakailanganin lamang ng user na punan ang produktibong password nang dalawang beses.

Ang paglulunsad ng SAP Logon ay hindi kawili-wili para sa aming layunin, at kapag nagpapatakbo ng sapgui.exe imposibleng tukuyin ang client at user name, ngunit posible na maglunsad ng isang sistema na hindi tinukoy sa SAP Logon. Sa kabilang banda, ang paglulunsad ng SAP GUI na may mga di-makatwirang mga parameter ng server ay hindi partikular na nauugnay: kung nilulutas natin ang problema ng pag-reset ng password ng isang user, malamang na mayroon na siyang kinakailangang linya sa SAP Logon, kasama ang mga setting na kailangan niya, at doon. ay hindi na kailangang gulo sa kanyang sarili. Ngunit ang tinukoy na mga kinakailangan ay natugunan ng SAP GUI Shortcut na teknolohiya at ang sapshcut.exe program mismo, na naging posible upang ilunsad ang SAP GUI gamit ang isang tiyak na "shortcut".

Paglutas ng problema nang direkta: paglulunsad ng sapshcut.exe nang direkta mula sa browser gamit ang isang 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');
}

Ang solusyon ay masama: una, ito ay gumagana lamang sa Internet Explorer, pangalawa, ito ay nangangailangan ng naaangkop na mga setting ng seguridad sa browser, na sa isang organisasyon ay maaaring ipinagbabawal sa antas ng domain, at kahit na pinapayagan, ang browser ay nagpapakita ng isang window na may nakakatakot. babala sa gumagamit:

Paglulunsad ng SAP GUI mula sa isang browser

Nakakita ako ng solusyon #2 sa Internet: paglikha ng iyong sariling web protocol. Nagbibigay-daan sa amin na ilunsad ang application na kailangan namin gamit ang isang link na nagsasaad ng protocol, na kami mismo ang nagrerehistro sa Windows sa registry sa seksyong HKEY_CLASSES_ROOT. Dahil may sariling subsection ang SAP GUI Shortcut sa seksyong ito, maaari mong idagdag ang parameter ng string ng URL Protocol na may walang laman na value doon:

Paglulunsad ng SAP GUI mula sa isang browser

Magsisimula ang protocol na ito sapgui.exe may parameter /SHORTCUT, na kung ano mismo ang kailangan namin:

Paglulunsad ng SAP GUI mula sa isang browser

Well, o kung gusto naming gumawa ng ganap na arbitrary na protocol (halimbawa, sapshcut), pagkatapos ay maaari mo itong irehistro gamit ang sumusunod na reg file:

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

Ngayon, kung gumawa kami ng isang link sa isang web page na nagpapahiwatig ng protocol Sapgui.Shortcut.File Sa parehong paraan:

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

Dapat nating makita ang isang window tulad nito:

Paglulunsad ng SAP GUI mula sa isang browser

At mukhang mahusay ang lahat, ngunit kapag nag-click ka sa pindutang "Payagan" makikita namin:

Paglulunsad ng SAP GUI mula sa isang browser

Oops, ginawang %20 ng browser ang spacebar. Well, ang ibang mga character ay ie-encode din sa sarili nilang numeric code na may simbolo ng porsyento. At ang pinaka-hindi kasiya-siyang bagay ay walang magagawa dito sa antas ng browser (lahat dito ay ginagawa ayon sa pamantayan) - hindi gusto ng browser ang mga naturang character, at ang Windows command interpreter ay hindi gumagana sa mga naka-encode na halaga. At isa pang minus - ang buong string ay ipinasa bilang isang parameter, kasama ang pangalan ng protocol at maging ang colon (sapgui.shortcut.file:). Bukod dito, bagaman pareho sapshcut.exe maaaring itapon ang lahat na hindi isang parameter para dito (nagsisimula sa simbolo na "-", pagkatapos ay ang pangalan, "=" at halaga), i.e. isang linya tulad ng"sapgui.shortcut.file: -system=SID"ito ay gagana pa rin, pagkatapos ay walang puwang"sapgui.shortcut.file:-system=SID"hindi na gumagana.

Lumalabas na, sa prinsipyo, mayroong dalawang pagpipilian para sa paggamit ng URI protocol:

  1. Paggamit nang walang mga parameter: Gumagawa kami ng isang buong bungkos ng mga protocol para sa lahat ng aming uri ng system SIDMANDT, gusto AAA200, BBB200 at iba pa. Kung kailangan mo lamang simulan ang nais na sistema, kung gayon ang pagpipilian ay lubos na magagawa, ngunit sa aming kaso ay hindi ito angkop, dahil hindi bababa sa nais mong ilipat ang pag-login ng gumagamit, ngunit hindi ito magagawa sa ganitong paraan.
  2. Paggamit ng isang wrapper program para tumawag sapshcut.exe o sapgui.exe. Ang kakanyahan ng program na ito ay simple - dapat itong kunin ang string na ipinadala ng browser dito sa pamamagitan ng web protocol at i-on ito sa representasyon na natatanggap ng Windows, i.e. ibinalik sa mga character ang lahat ng mga code ng character (maaaring i-parse pa ang string ayon sa mga parameter) at tinatawag na ang SAP GUI na may garantisadong tamang command. Sa aming kaso, hindi rin ito ganap na angkop (kaya hindi ko man lang isinulat ito), dahil hindi sapat para sa amin na idagdag ang protocol sa lahat ng mga PC ng gumagamit (sa loob ng isang domain ay ayos pa rin ito, bagaman mas mahusay din na iwasan ang pagsasanay na ito), ngunit dito kakailanganin namin ng higit pang ilagay ang program sa PC, at patuloy ding tiyakin na hindi ito mawawala kapag na-install muli ang software sa PC.

Yung. Itatapon din namin ang opsyong ito bilang hindi angkop para sa amin.

Sa puntong ito nagsimula na akong mag-isip na kailangan kong magpaalam sa ideya ng paglulunsad ng SAP GUI na may mga kinakailangang parameter mula sa browser, ngunit pagkatapos ay naisip ko na maaari kang gumawa ng isang shortcut sa SAP Logon at kopyahin ito sa iyong desktop. Ginamit ko ang pamamaraang ito nang isang beses, ngunit bago iyon ay hindi ko partikular na tiningnan ang shortcut file. At lumabas na ang shortcut na ito ay isang regular na text file na may extension .sap. At kung patakbuhin mo ito sa Windows, ilulunsad ang SAP GUI kasama ang mga parameter na tinukoy sa file na ito. "Bingo!"

Ang format ng file na ito ay humigit-kumulang sa sumusunod (maaaring mayroon ding transaksyon na inilunsad sa pagsisimula, ngunit tinanggal ko ito):

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

Tila lahat ng kailangan: isang system identifier, isang kliyente, isang username at kahit isang password. At kahit na karagdagang mga parameter: Pamagat - pamagat ng window, GuiSize β€” laki ng tumatakbong window (full screen o hindi) at Muling gumamit β€” kung kinakailangan na magbukas ng bagong window o gumamit ng nakabukas na na may parehong sistema. Ngunit agad na lumitaw ang isang nuance - lumabas na ang password sa SAP Logon ay hindi maitakda, ang linya ay naharang. Ito ay lumabas na ginawa ito para sa mga kadahilanang pangseguridad: iniimbak nito ang lahat ng mga shortcut na ginawa sa SAP Logon sa isang file sapshortcut.ini (Malapit saplogon.ini sa profile ng gumagamit ng Windows) at doon, kahit na naka-encrypt ang mga ito, hindi sila masyadong naka-encrypt at, kung ninanais, maaari silang ma-decrypt. Ngunit maaari mong lutasin ito sa pamamagitan ng pagbabago ng halaga ng isang parameter sa registry (ang default na halaga ay 0):

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

Ina-unlock nito ang field ng Password para sa pagpasok sa form ng paggawa ng shortcut sa SAP Logon:

Paglulunsad ng SAP GUI mula sa isang browser

At kapag nagpasok ka ng password sa field na ito, ilalagay ito sa kaukulang linya
sapshortcut.ini, ngunit kapag nag-drag ka ng shortcut sa desktop, hindi ito lilitaw doon - ngunit maaari mo itong idagdag nang manu-mano. Ang password ay naka-encrypt, para sa 111111 ito ay magiging tulad ng sumusunod: PW_49B02219D1F6, para sa 222222 - PW_4AB3211AD2F5. Ngunit mas interesado kami sa katotohanan na ang password na ito ay naka-encrypt sa isang paraan, independiyente sa partikular na PC, at kung i-reset namin ang password sa paunang isa, maaari naming gamitin ang isang pre-kilalang halaga sa larangang ito. Well, kung gusto naming gumamit ng random na nilikhang password, kailangan naming maunawaan ang algorithm ng cipher na ito. Ngunit sa paghusga sa mga halimbawang ibinigay, hindi ito magiging mahirap gawin. Sa pamamagitan ng paraan, sa SAP GUI 7.40 ang patlang na ito ay ganap na nawala mula sa form, ngunit tama itong tumatanggap ng isang file na may napunan na password.

Iyon ay, lumalabas na sa browser kailangan mo lamang mag-click sa link sa isang file na may extension na .sap at ang nais na format - at mag-aalok ito upang buksan ito bilang isang file tulad ng SAP GUI Shortcut (natural sa isang PC na may naka-install na SAP GUI) at magbubukas ng window ng SAP GUI na may mga tinukoy na parameter (kung ang pares ng SID at kliyente ay nasa listahan ng SAP Logon sa PC na ito).

Ngunit, malinaw na walang sinuman ang gagawa ng mga file nang maaga at iimbak ang mga ito sa site - dapat silang mabuo batay sa mga kinakailangang parameter. Halimbawa, maaari kang lumikha ng PHP script upang makabuo ng mga shortcut (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";
?>

Kung hindi ka tumukoy ng username at password, makukuha mo ang sumusunod na window na humihingi ng login at password:

Paglulunsad ng SAP GUI mula sa isang browser

Kung ipapasa mo lamang ang pag-login, ang field sa pag-login ay mapupunan at ang field ng password ay walang laman. Kung bibigyan namin ang user ng parehong login at password, ngunit ang user sa PC ay mayroong EnablePassword key sa registry sa [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] na seksyong nakatakda sa 0, pagkatapos ay makukuha namin ang parehong bagay. At kung ang key na ito ay nakatakda sa 1 at ipinasa namin ang parehong pangalan at ang paunang password, agad na ipo-prompt ka ng system na magpasok ng bagong permanenteng password nang dalawang beses. Iyon ang kailangan naming makuha.

Bilang resulta, mayroon kaming sumusunod na hanay ng mga isinasaalang-alang na opsyon bilang isang paglalarawan ng lahat ng nasa itaas:

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

Ang huling pagpipilian ay nababagay sa akin. Ngunit sa halip na bumuo ng mga shortcut ng SAP, maaari mo ring gamitin, halimbawa, ang pagbuo ng mga CMD file, na, kapag binuksan mula sa isang browser, ay magbubukas din ng window ng SAP GUI para sa iyo. Nasa ibaba ang isang halimbawa (sapguicmd.php) direktang ilunsad ang SAP GUI na may buong string ng koneksyon, nang hindi kailangang i-configure ang 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 Π’Ρ…ΠΎΠ΄ Π² ".$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";
?>

Pinagmulan: www.habr.com

Magdagdag ng komento