Šo rakstu es sākotnēji uzrakstīju savam , lai vēlāk nepazustu un neaizmirstu, bet, tā kā blogu neviens nelasa, vēlējos ar šo informāciju dalīties ar visiem, varbūt kādam noderēs.
Strādājot pie servisa idejas par paroles atiestatīšanu SAP R/3 sistēmās, radās jautājums — kā palaist SAP GUI ar nepieciešamajiem parametriem no pārlūkprogrammas? Tā kā šajā idejā bija paredzēta tīmekļa pakalpojuma izmantošana, kas sākotnēji apstrādā SOAP pieprasījumu no SAP GUI un nosūta e-pastu ar saiti uz tīmekļa lapu ar paroles atiestatīšanas skriptu, un tikai tad pielieto lietotājam ziņojumu par veiksmīgu paroles atiestatīšanu, kā arī parāda pašu sākotnējo paroli, es vēlējos, lai šajā lapā būtu arī saite uz SAP GUI palaišanu. Turklāt, lai šī saite atvērtu pareizo sistēmu un, protams, vēlams, jau ar aizpildītiem lietotāja vārda un paroles laukiem: lietotājam paliktu tikai divas reizes aizpildīt produkta paroli.
SAP Logon palaišana — mūsu mērķiem nebija interesanta, bet, uzsākot sapgui.exe, nebija iespējams norādīt mandantu un lietotāja vārdu, taču oficiālu SAP Logon neiegūstamā sistēma varēja tikt palaista. No otras puses, SAP GUI palaišana ar izsniegtiem servera parametriem nebija īpaši aktuāla: ja mēs risinām lietotāja paroles atiestatīšanas uzdevumu, visticamāk, viņam SAP Logon jau ir pareizā rinda ar nepieciešamajiem iestatījumiem, un nav nepieciešams iejaukties ar savējiem. Tomēr bija tehnoloģija SAP GUI Shortcut un paša programma sapshcut.exe, kas ļāva palaist SAP GUI, izmantojot noteiktu „īsceļu”.
Uzdevuma risinājums: 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=LV');
}
Risinājums nav labs: pirmkārt, tas darbojas tikai Internet Explorer, otrkārt, tas prasa attiecīgus drošības iestatījumus pārlūkprogrammā, kuri organizācijā var tikt aizliegti domēnu līmenī, un pat ja tie ir atļauti, pārlūkprogramma parāda lietotājam briesmīgu brīdinājuma logu:

Risinājumu Nr.2 es atradu interneta ietvaros: . Ļauj palaist nepieciešamo lietotni, izmantojot saiti ar protokolu, kuru mēs reģistrējam Windows reģistrā sadaļā HKEY_CLASSES_ROOT. Tā kā SAP GUI Shortcut šajā sadaļā ir sava apakšsadaļa, mēs varam pievienot virknes parametru URL Protocol ar tukšu vērtību:

Šis protokols aktivizē sapgui.exe ar parametru /SHORTCUT, kas mums kā reiz ir nepieciešams:

Nu, ja vēlamies izveidot vispārēju protokolu (piemēram, sapshcut), tad to var reģistrēt, izmantojot sekojošo reg-failu:
Windows reģistra redaktors, versija 5.00
[HKEY_CLASSES_ROOTsapshcut]
@="sapshcut apstrādātājs"
"URL protokols"=""
[HKEY_CLASSES_ROOTsapshcutDefaultIcon]
@="sapshcut.exe"
[HKEY_CLASSES_ROOTsapshcutshell]
[HKEY_CLASSES_ROOTsapshcutshellopen]
[HKEY_CLASSES_ROOTsapshcutshellopencommand]
@="sapshcut.exe "%1""
Tagad, ja mēs tīmekļa lapā izveidosim saiti ar norādītu protokolu Sapgui.Shortcut.File šādā veidā:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
mums jāparādās logam ar šādu izskatu:

Un it kā viss ir lieliski, bet nospiežot pogu 'Atļaut', redzam:

O, pārlūkprogrammas atstarpe pārvērta par . Arī citi simboli būs kodēti savā ciparu kodā ar procentu zīmi. Un visnepatīkamākais ir tas, ka šeit neko nevar izdarīt pārlūkā (šie standarti ir izstrādāti saskaņā ar standartiem) — pārlūkprogramma nepatīk šādi simboli, un Windows komandrindas interpreters nestrādā ar šādiem kodētajiem vērtībām. Un vēl viens mīnuss — kā parametrs tiek nodota visa rinda, tostarp protokola nosaukums un pat kolons (sapgui.shortcut.file:). Pat ja tas pats sapshcut.exe spēj izmest visu, kas nav parametrs (sākas ar simbolu '-' , tad nosaukums, '=' un vērtība), t.i., rinda ar apzīmējumu 'sapgui.shortcut.file: -system=SID' vēl izdosies, bet bez atstarpes 'sapgui.shortcut.file:-system=SID' vairs nedarbosies.
Izrādās, ka principā ir divi URI protokola izmantošanas varianti:
- Izmantošana bez parametriem: Izveidojam veselu kaudzi protokolu visām mūsu sistēmām ar nosaukumiem SIDMANDT, piemēram, AAA200, BBB200 utml. Ja vienkārši nepieciešams palaist vajadzīgo sistēmu, tad variants ir pilnīgi derīgs, bet mūsu gadījumā tas neder, jo vismaz lietotāja pieslēgšanās vārdu arī vajag nodot, bet to tādā veidā nevar izdarīt.
- Izmantošana ar Wrapper programmu izsaukšanai sapshcut.exe vai sapgui.exeŠīs programmas būtība ir vienkārša — tā ņem virkni, ko pārsūta pārlūkprogramma caur tīmekļa protokolu, un pārvērš to formātā, kādu pieņem Windows, t.i., atgriež visus simbolu kodus par simboliem (iespējams pat analizē virkni pēc parametriem) un jau garantēti izsauc SAP GUI ar pareizo komandu. Mūsu gadījumā tas arī nepavisam nav piemērots (tāpēc pat negribēju to rakstīt), jo mums jau ir maz pievienot protokolu visiem lietotāju datoriem (tā kā domēna ietvaros tas vēl varētu darboties, kaut arī labāk šādu praksi izvairīties), taču šeit būs nepieciešams arī papildus programmu novietot uz datora, kā arī pastāvīgi pārbaudīt, lai tā nepazustu, atkārtoti instalējot programmatūru uz datora.
T.i., šo variantu arī noraidām kā mums nederīgu.
Šeit es jau sāku domāt, ka nāksies atteikties no idejas palaist SAP GUI ar nepieciešamajiem parametriem no pārlūkprogrammas, bet tad man ienāca prātā doma, ka SAP Logon var izveidot īsceļu un to var pārsūtīt uz darbvirsmu. Es kādreiz izmantoju tādu metodi, bet iepriekš nebiju īpaši paskatījies uz īsceļa failu. Un izrādījās, ka šis īsceļs ir parasts teksta fails ar paplašinājumu .sap. Un, ja to palaistu Windows — atvērtos SAP GUI ar parametriem, kas norādīti šajā failā. "Bingo!"
Šī faila formāts ir aptuveni šāds (vēl var būt palaidnē tranzakcija startā, bet to es izlaidu):
[System]
Nosaukums=SID
Klients=200
[User]
Nosaukums=
Valoda=LV
Parole=
[Function]
Virsraksts=
[Configuration]
GuiSize=Maksimizēts
[Options]
Atkārtot=0
Izskatās, ka viss nepieciešamais ir iekļauts: sistēmas identifikators, mantojums, lietotāja vārds un pat parole. Un pat papildu parametri: Title — loga virsraksts, GuiSize — atvērtā loga izmērs (pilnekrāna režīmā vai nē) un Reuse — vai obligāti atvērt jaunu logu vai izmantot jau atvērtu ar to pašu sistēmu. Bet tūlīt iznāca nianses — izrādījās, ka paroli SAP Logon nevarēja norādīt, rinda bija bloķēta. Izrādījās, ka tas izdarīts drošības apsvērumu dēļ: visus īsceļus, ko izveidojis SAP Logon, tas glabā failā sapshortcut.ini (blakus saplogon.ini Windows lietotāja profilā), un tur tie, kaut arī ir šifrēti, nav pārāk stipri un ar lielu vēlēšanos tos var atšifrēt. Bet to var atļaut, mainot vienas parametra vērtību reģistrā (noklusējuma vērtība 0):
Windows reģistra redaktors, versija 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
Tas atbloķēs parauga veidlapā "Parole" laukā, kad izveidojat īsceļu SAP Logon:

Un, ievadot paroli šajā laukā, tā tiks novietota atbilstošajā rindā.
sapshortcut.ini, taču, velkot saīsni uz darbvirsmas, tā tur neparādās — tomēr to var pievienot manuāli. Parole ir šifrēta, un 111111 būs šādā veidā: PW_49B02219D1F6, bet 222222 — PW_4AB3211AD2F5. Mūs vairāk interesē, ka šī parole tiek šifrēta vienā veidā, kas nav atkarīgs no konkrētā datora, un, ja mēs atkārtoti iestatām paroli uz sākotnējo, tad šajā laukā var izmantot iepriekš zināmu vērtību. Bet, ja vēlamies izmantot brīvi izveidotu paroli, tad būs jāizprot šifrēšanas algoritms. Taču, spriežot pēc sniegtajiem piemēriem, to nebūs grūti izdarīt. Starp citu, SAP GUI 7.40 šis lauks vispār ir izslēgts no formas, taču fails ar aizpildītu paroli tiek pareizi uztverts.
Tātad, iznāk, ka pārlūkprogrammā pietiek ar to, lai noklikšķinātu uz saites uz failu ar paplašinājumu .sap un nepieciešamo formātu — un tas piedāvās to atvērt kā failu veidu SAP GUI Shortcut (protams, datorā ar instalētu SAP GUI), un atvērs mums SAP GUI logu ar norādītajiem parametriem (ja SID un mands ir šajā datorā SAP Logon sarakstā).
Taču, saprotams, ka vienkārši failus neviens iepriekš neizveidos un neskries uz vietas — tie jādara, ņemot vērā nepieciešamos parametrus. Piemēram, var izveidot PHP skriptu saīsņu ģenerēšanai (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=Ienākšana sistēmārn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>
Ja neuzliekat lietotājvārdu un paroli, tad iegūsim šādu logu ar pieprasījumu pēc lietotājvārda un paroles:

Ja, ja pārraugām tikai lietotājvārdu — tad lietotājvārda lauks tiks aizpildīts, bet paroles lauks paliks tukšs. Ja mēs nododam gan lietotājvārdu, gan paroli, bet lietotāja datorā reģistrā ir atslēga EnablePassword sadaļā [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] iestatīta uz 0, tad iegūsim to pašu. Un tikai tad, ja šī atslēga ir iestatīta uz 1 un mēs nododam gan lietotājvārdu, gan sākotnējo paroli, sistēma nekavējoties pieprasīs divreiz ievadīt jauno pastāvīgo paroli. Kas bija iecerēts.
Tādējādi mēs iegūstam sekojošo variantu kopumu kā ilustrāciju iepriekš teiktajam:
<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', '');"/>Piemērs 1: Izpildīt sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Piemērs 2: Atvērt sapshcut.exe (URI)</a><br>
<a href='/lv/sapshcut.php/?SID=SID&Client=200&User=test'>Piemērs 3: Atvērt failu .sap (SAP GUI īsceļš)</a><br>
</body>
</html>
Man derēja pēdējais variants. Bet var arī vietā, lai ģenerētu SAP īsceļus, izmantot, piemēram, CMD failu ģenerēšanu, kas arī, atverot no pārlūkprogrammas, atvērs jums SAP GUI logu. Zemāk ir dots piemērs (sapguicmd.php) tiešai SAP GUI palaišanai ar pilnu savienojuma virkni, nepastāvot nepieciešamībai pēc konfigurēta 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 Ienākšana ".$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: habr.com
