SAP GUI palaišana no pārlūkprogrammas

Pirmo reizi es uzrakstīju šo rakstu manā blog, lai vēlāk vairs nemeklētu un neatcerētos, bet tā kā blogu neviens nelasa, gribēju padalīties ar šo informāciju ar visiem, ja nu kādam noder.

Strādājot pie idejas par paroles atiestatīšanas pakalpojumu SAP R/3 sistēmās, radās jautājums - kā palaist SAP GUI ar nepieciešamajiem parametriem no pārlūkprogrammas? Tā kā šī ideja paredzēja tīmekļa pakalpojuma izmantošanu, vispirms jāatbild uz SOAP pieprasījumu no SAP GUI un jānosūta vēstule ar saiti uz tīmekļa lapu ar skriptu sākotnējās paroles atiestatīšanai un pēc tam parādīta lietotājam. ziņojumu par veiksmīgu paroles atiestatīšanu un šīs pašas sākotnējās paroles parādīšanu , tad es vēlētos, lai šajā lapā būtu arī saite uz SAP GUI palaišanu. Turklāt šai saitei vajadzētu atvērt vajadzīgo sistēmu un, vēlams, uzreiz aizpildīt pieteikšanās un paroles laukus: lietotājam produktīvā parole būtu jāievada tikai divas reizes.

SAP Logon palaišana mūsu mērķim nebija interesanta, un, palaižot sapgui.exe, nebija iespējams norādīt klientu un lietotājvārdu, taču bija iespējams palaist sistēmu, kas nebija definēta SAP Logon. No otras puses, SAP GUI palaišana ar patvaļīgiem servera parametriem nebija īpaši aktuāla: ja mēs risinām lietotāja paroles atiestatīšanas problēmu, tad visticamāk viņam jau ir vajadzīgā rinda SAP Logon ar nepieciešamajiem iestatījumiem un tur nav jājaucas ar savējo. Bet norādītajām prasībām atbilda SAP GUI Shortcut tehnoloģija un pati programma sapshcut.exe, kas ļāva palaist SAP GUI, izmantojot īpašu “saīsni”.

Problēmas risināšana: sapshcut.exe palaišana tieši no pārlūkprogrammas, izmantojot ActiveX objektu:

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

Risinājums ir slikts: pirmkārt, tas darbojas tikai pārlūkprogrammā Internet Explorer, otrkārt, ir nepieciešami atbilstoši drošības iestatījumi pārlūkprogrammā, kas organizācijā var būt aizliegti domēna līmenī, un pat tad, ja tas ir atļauts, pārlūkprogramma parāda logu ar biedējošu brīdinājums lietotājam:

SAP GUI palaišana no pārlūkprogrammas

Internetā atradu risinājumu #2: izveidot savu tīmekļa protokoluĻauj mums palaist nepieciešamo lietojumprogrammu, izmantojot saiti, kas norāda protokolu, kurā mēs reģistrējamies. Windows Reģistrā, sadaļā HKEY_CLASSES_ROOT. Tā kā SAP GUI saīsnei šajā sadaļā ir sava apakšatslēga, varat pievienot URL protokola virknes parametru ar tukšu vērtību:

SAP GUI palaišana no pārlūkprogrammas

Šis protokols sākas sapgui.exe ar parametru /ĪSCEĻA, kas ir tieši tas, kas mums vajadzīgs:

SAP GUI palaišana no pārlūkprogrammas

Nu, vai arī mēs vēlamies izveidot pilnīgi patvaļīgu protokolu (piemēram, sapshcut), varat to reģistrēt, izmantojot šādu reg failu:

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

Tagad, ja mēs izveidojam saiti tīmekļa lapā, kas norāda protokolu Sapgui.Īsceļš.Fails Līdzīgā veidā:

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

Mums vajadzētu redzēt šādu logu:

SAP GUI palaišana no pārlūkprogrammas

Un viss šķiet lieliski, bet, noklikšķinot uz pogas “Atļaut”, mēs redzam:

SAP GUI palaišana no pārlūkprogrammas

Ups, pārlūkprogramma atstarpi pārvērta par %20. Arī citas rakstzīmes tiks iekodētas savā ciparu kodā ar procentu zīmi. Un vissliktākais ir tas, ka pārlūkprogrammas līmenī neko nevar darīt (šeit viss ir standarta režīmā) — pārlūkprogrammai šādas rakstzīmes nepatīk, un komandu interpretētājam arī nepatīk. Windows nedarbojas ar šādām kodētām vērtībām. Vēl viens trūkums ir tas, ka visa virkne tiek nodota kā parametrs, ieskaitot protokola nosaukumu un pat kolu (sapgui.shortcut.file:). Turklāt, lai gan tas pats sapshcut.exe var izmest visu, kas tam nav parametrs (sākas ar simbolu “-”, pēc tam nosaukumu, “=” un vērtību), t.i. tāda rinda kā "sapgui.shortcut.file: -system=SID"tas joprojām darbosies, tad bez atstarpes"sapgui.shortcut.file:-system=SID"vairs nedarbojas.

Izrādās, ka principā ir divas URI protokola izmantošanas iespējas:

  1. Izmantojot bez parametriem: mēs izveidojam veselu virkni protokolu visām mūsu šāda veida sistēmām SIDMANDS, tips AAA200, BBB200 un tā tālāk. Ja jums vienkārši jāstartē vēlamā sistēma, opcija ir diezgan funkcionāla, taču mūsu gadījumā tā nav piemērota, jo jūs vismaz vēlaties pārsūtīt lietotāja pieteikšanos, taču to nevar izdarīt šādā veidā.
  2. Izmantojot iesaiņojuma programmu, lai izsauktu sapshcut.exe vai sapgui.exeŠīs programmas būtība ir vienkārša — tai jāņem virkne, ko pārlūkprogramma tai nosūta, izmantojot tīmekļa protokolu, un jāpārveido tā par pieņemamu attēlojumu. Windows, t. i., tas pārveido visus rakstzīmju kodus atpakaļ rakstzīmēs (varbūt pat parsē virkni pēc parametriem) un pēc tam izsauc SAP GUI ar garantēti pareizu komandu. Tas nav pilnībā piemērots mūsu gadījumam (tāpēc es pat neuztraucos to rakstīt), jo protokola pievienošana visiem lietotāju datoriem nav pietiekama (domēna ietvaros tas joprojām ir pieņemami, lai gan no šīs prakses vislabāk ir izvairīties). Mums būs arī jāinstalē programma datorā un pastāvīgi jāuzrauga, lai nodrošinātu, ka tā paliek savā vietā, atkārtoti instalējot programmatūru datorā.

Tie. Mēs arī atmetam šo iespēju kā mums nepiemērotu.

Šajā brīdī jau sāku domāt, ka būs jāatvadās no domas palaist SAP GUI ar nepieciešamajiem parametriem no pārlūkprogrammas, bet tad man ienāca prātā doma, ka var izveidot saīsni SAP Logon un kopējiet to uz darbvirsmu. Es vienu reizi izmantoju šo metodi, bet pirms tam es īpaši neskatījos uz saīsnes failu. Un izrādījās, ka šī saīsne ir parasts teksta fails ar paplašinājumu .sapUn, ja jūs to palaižat Windows — SAP GUI tiks palaists ar šajā failā norādītajiem parametriem. "Bingo!"

Šī faila formāts ir aptuveni šāds (var būt arī kāds darījums, kas tika palaists startēšanas laikā, bet es to izlaidu):

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

Šķiet, ka viss nepieciešamais: sistēmas identifikators, klients, lietotājvārds un pat parole. Un pat papildu parametri: Uzruna - loga nosaukums, GuiSize — darbojas loga lielums (pilnekrāna režīmā vai ne) un Atkārtota izmantošana — vai ir jāatver jauns logs vai jāizmanto jau atvērts logs ar to pašu sistēmu. Taču uzreiz parādījās nianse - izrādījās, ka SAP Logon paroli nevarēja iestatīt, līnija bija bloķēta. Izrādījās, ka tas tika darīts drošības apsvērumu dēļ: tas saglabā visus SAP Logon izveidotos saīsnes failā sapshortcut.ini (Netālu saplogon.ini lietotāja profilā Windows) un, lai gan tie tur ir šifrēti, tie nav pārāk spēcīgi šifrēti un tos var atšifrēt, ja patiešām vēlaties. Bet to var atrisināt arī, mainot viena parametra vērtību reģistrā (noklusējuma vērtība ir 0):

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

Tādējādi tiek atbloķēts paroles lauks ievadīšanai saīsnes izveides veidlapā SAP pieteikšanās programmā:

SAP GUI palaišana no pārlūkprogrammas

Un, ievadot paroli šajā laukā, tā tiks ievietota attiecīgajā rindā
sapshortcut.ini, bet, velkot saīsni uz darbvirsmu, tas tur neparādās, taču varat to pievienot manuāli. Parole ir šifrēta, numuram 111111 tā būs šāda: PW_49B02219D1F6, 222222 - PW_4AB3211AD2F5. Bet mūs vairāk interesē tas, ka šī parole tiek šifrēta vienā veidā, neatkarīgi no konkrētā datora, un, ja mēs atiestatām paroli uz sākotnējo, tad šajā laukā varam izmantot vienu iepriekš zināmu vērtību. Nu, ja mēs vēlamies izmantot nejauši izveidotu paroli, mums būs jāsaprot šī šifra algoritms. Bet, spriežot pēc sniegtajiem piemēriem, to izdarīt nebūs grūti. Starp citu, SAP GUI 7.40 šis lauks pilnībā pazuda no veidlapas, taču tas pareizi pieņem failu ar aizpildītu paroli.

Tas ir, izrādās, ka pārlūkprogrammā jums vienkārši jānoklikšķina uz saites uz failu ar paplašinājumu .sap un vēlamo formātu - un tas piedāvās to atvērt kā failu, piemēram, SAP GUI Shortcut (proti, datorā ar instalētu SAP GUI) un tiks atvērts SAP GUI logs ar norādītajiem parametriem (ja SID un klienta pāris ir šī datora SAP pieteikšanās sarakstā).

Bet ir skaidrs, ka neviens vienkārši neizveidos failus iepriekš un neuzglabās tos vietnē - tie ir jāģenerē, pamatojoties uz nepieciešamajiem parametriem. Piemēram, varat izveidot PHP skriptu, lai ģenerētu saīsnes (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";
?>

Ja nenorādīsiet lietotājvārdu un paroli, tiks parādīts šāds logs, kurā tiks prasīts ievadīt pieteikumvārdu un paroli:

SAP GUI palaišana no pārlūkprogrammas

Ja nododat tikai pieteikšanos, pieteikšanās lauks tiks aizpildīts un paroles lauks būs tukšs. Ja lietotājam piešķiram gan pieteikumvārdu, gan paroli, bet lietotājam datorā reģistra sadaļā [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] ir iestatīta atslēga EnablePassword uz 0, mēs iegūstam to pašu. Un tikai tad, ja šī atslēga ir iestatīta uz 1 un mēs nododam gan vārdu, gan sākotnējo paroli, sistēma nekavējoties liks jums divreiz ievadīt jaunu pastāvīgo paroli. Tas ir tas, ko mums vajadzēja iegūt.

Tā rezultātā mums ir šāda apsvērto iespēju kopa, kas ilustrē visu iepriekš minēto:

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

Pēdējais variants man derēja. Taču SAP īsceļu ģenerēšanas vietā varat izmantot arī, piemēram, CMD failu ģenerēšanu, kurus atverot no pārlūkprogrammas, jums tiks atvērts arī SAP GUI logs. Zemāk ir piemērs (sapguicmd.php) tieši palaidiet SAP GUI ar pilnu savienojuma virkni, bez nepieciešamības konfigurēt SAP pieteikšanos:

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

Avots: www.habr.com

Iegādājieties uzticamu mitināšanu vietnēm ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa vietņu mitināšanu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster