Lanĉante SAP GUI de retumilo

Mi unue skribis ĉi tiun artikolon en mia блог, por ne serĉi kaj rememori poste, sed ĉar neniu legas la blogon, mi volis kunhavigi ĉi tiun informon kun ĉiuj, se iu trovos ĝin utila.

Laborante pri la ideo de pasvort-restariga servo en SAP R/3-sistemoj, aperis demando - kiel lanĉi SAP GUI kun la necesaj parametroj de la retumilo? Ĉar ĉi tiu ideo implicis la uzon de retservo, unue respondante al SOAP-peto de la SAP GUI kaj sendante leteron kun ligilo al retpaĝo kun skripto por restarigi la pasvorton al la komenca, kaj poste montri al la uzanto. mesaĝo pri la sukcesa pasvorto rekomencigita kaj montrado de ĉi tiu tre komenca pasvorto , tiam mi ŝatus ke ĉi tiu paĝo ankaŭ havu ligilon por lanĉi SAP GUI. Cetere, ĉi tiu ligilo devus malfermi la deziratan sistemon, kaj, prefere, kun la ensalutaj kaj pasvortaj kampoj tuj plenigitaj: la uzanto nur devus plenigi la produktivan pasvorton dufoje.

Lanĉi SAP Logon ne estis interesa por nia celo, kaj dum rulado de sapgui.exe estis neeble specifi la klienton kaj uzantnomon, sed eblis lanĉi sistemon ne difinitan en SAP Logon. Aliflanke, lanĉi SAP GUI kun arbitraj servilaj parametroj ne estis precipe grava: se ni solvas la problemon de restarigo de pasvorto de uzanto, tiam plej verŝajne li jam havas la necesan linion en SAP Logon, kun la agordoj, kiujn li bezonas, kaj tie ne necesas fuŝi kun sia propra. Sed la specifitaj postuloj estis plenumitaj de la teknologio SAP GUI Shortcut kaj la programo sapshcut.exe mem, kiuj ebligis lanĉi la SAP GUI per specifa "mallongigo".

Solvante la problemon rekte: lanĉante sapshcut.exe rekte de la retumilo uzante ActiveX-objekton:

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

La solvo estas malbona: unue, ĝi funkcias nur en Interreto Explorer, due, ĝi postulas taŭgajn sekurecajn agordojn en la retumilo, kiu en organizo povas esti malpermesita je la domajna nivelo, kaj eĉ se permesite, la retumilo montras fenestron kun timiga. averto al la uzanto:

Lanĉante SAP GUI de retumilo

Mi trovis solvon #2 en la Interreto: kreante vian propran TTT-protokolon. Permesas al ni lanĉi la aplikaĵon, kiun ni bezonas per ligilo indikanta la protokolon, kiun ni mem registras en Vindozo en la registro en la sekcio HKEY_CLASSES_ROOT. Ĉar SAP GUI Shortcut havas sian propran subfakon en ĉi tiu sekcio, vi povas aldoni la URL-Protokola ĉenparametron kun malplena valoro tie:

Lanĉante SAP GUI de retumilo

Ĉi tiu protokolo komenciĝas sapgui.exe kun parametro /Mallongigo, kio estas ĝuste tio, kion ni bezonas:

Lanĉante SAP GUI de retumilo

Nu, aŭ se ni volas fari tute arbitran protokolon (ekzemple, sapshcut), tiam vi povas registri ĝin uzante la sekvan regdosieron:

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

Nun, se ni faras ligilon sur retpaĝo indikante la protokolon Sapgui.Shortcut.Dosiero Simile:

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

Ni devus vidi fenestron kiel ĉi tio:

Lanĉante SAP GUI de retumilo

Kaj ĉio ŝajnas bonega, sed kiam vi alklakas la butonon "Permesi", ni vidas:

Lanĉante SAP GUI de retumilo

Ho, la retumilo ŝanĝis la spacbreton en % 20. Nu, aliaj signoj ankaŭ estos koditaj en sian propran numeran kodon kun procenta simbolo. Kaj la plej malagrabla afero estas, ke nenio povas esti farita ĉi tie ĉe la retumila nivelo (ĉi tie ĉio estas farita laŭ la normo) - la retumilo ne ŝatas tiajn signojn, kaj la Vindoza komandinterpretilo ne funkcias kun tiaj koditaj valoroj. Kaj ankoraŭ unu minus - la tuta ĉeno estas pasita kiel parametro, inkluzive de la protokolonomo kaj eĉ la dupunkto (sapgui.shortcut.file:). Cetere, kvankam la sama sapshcut.exe povas forĵeti ĉion, kio ne estas parametro por ĝi (komencas per la simbolo “-“, poste la nomo, “=" kaj valoro), t.e. linio kiel "sapgui.shortcut.file: -system=SID"ĝi ankoraŭ funkcios, tiam sen spaco"sapgui.shortcut.file:-system=SID"ne plu funkcias.

Rezultas, ke principe ekzistas du ebloj por uzi la URI-protokolon:

  1. Uzado sen parametroj: Ni kreas tutan aron da protokoloj por ĉiuj niaj sistemoj de la tipo SIDMANDT, Ŝati AAA200, BBB200 kaj tiel plu. Se vi nur bezonas komenci la deziratan sistemon, tiam la opcio estas sufiĉe realigebla, sed en nia kazo ĝi ne taŭgas, ĉar almenaŭ vi ŝatus translokigi la uzantan ensaluton, sed ĉi tio ne povas esti farita tiel.
  2. Uzante envolvaĵan programon por voki sapshcut.exesapgui.exe. La esenco de ĉi tiu programo estas simpla - ĝi devas preni la ŝnuron, kiun la retumilo transdonas al ĝi per la TTT-protokolo kaj turni ĝin en la reprezenton, kiun Vindozo ricevas, t.e. turnas ĉiujn signajn kodojn reen en signojn (eble eĉ analizas la ĉenon laŭ parametroj) kaj jam vokas SAP GUI kun garantiita ĝusta komando. En nia kazo, ĝi ankaŭ ne tute taŭgas (tial mi eĉ ne skribis ĝin), ĉar ne sufiĉas por ni aldoni la protokolon en ĉiuj uzantaj komputiloj (ene de domajno tio ankoraŭ estas en ordo, kvankam ankaŭ estas pli bone evitu ĉi tiun praktikon), sed ĉi tie ni bezonos pli meti la programon sur la komputilon, kaj ankaŭ konstante certigi, ke ĝi ne malaperu kiam la programaro estas reinstalita en la komputilo.

Tiuj. Ni ankaŭ forĵetas ĉi tiun opcion kiel maltaŭga por ni.

Je ĉi tiu punkto mi jam ekpensis, ke mi devus adiaŭi la ideon lanĉi SAP GUI kun la necesaj parametroj de la retumilo, sed tiam venis al mi la ideo, ke vi povas fari ŝparvojon en SAP Logon kaj kopiu ĝin al via labortablo. Mi uzis ĉi tiun metodon unufoje, sed antaŭ tio mi ne specife rigardis la ŝparvojan dosieron. Kaj montriĝis, ke ĉi tiu ŝparvojo estas regula tekstdosiero kun la etendaĵo .suko. Kaj se vi funkciigas ĝin en Vindozo, SAP GUI lanĉos kun la parametroj specifitaj en ĉi tiu dosiero. "Bingo!"

La formato de ĉi tiu dosiero estas proksimume la sekva (eble ankaŭ estas transakcio lanĉita ĉe ekfunkciigo, sed mi preterlasis ĝin):

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

Ŝajnas, ke ĉio, kio necesas: sistemidentigilo, kliento, uzantnomo kaj eĉ pasvorto. Kaj eĉ pliaj parametroj: titolo - fenestro titolo, GuiSize — grandeco de la kuranta fenestro (plena ekrano aŭ ne) kaj Reuzo — ĉu necesas malfermi novan fenestron aŭ uzi jam malfermitan kun la sama sistemo. Sed tuj aperis nuanco - montriĝis, ke la pasvorto en SAP Logon ne povas esti agordita, la linio estis blokita. Montriĝis, ke tio estis farita pro sekurecaj kialoj: ĝi stokas ĉiujn ŝparvojojn kreitajn en SAP Logon en dosiero. sapshortcut.ini (Proksime saplogon.ini en la Vindoza uzantprofilo) kaj tie, kvankam ili estas ĉifritaj, ili ne estas tro forte ĉifritaj kaj, se oni volas, ili povas esti deĉifritaj. Sed vi povas solvi ĉi tion ŝanĝante la valoron de unu parametro en la registro (la defaŭlta valoro estas 0):

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

Ĉi tio malŝlosas la Pasvorton-kampon por enigo sur la ŝparvojo-kreadformularo en SAP-Ensaluto:

Lanĉante SAP GUI de retumilo

Kaj kiam vi enigas pasvorton en ĉi tiu kampo, ĝi estos metita en la respondan linion
sapshortcut.ini, sed kiam vi trenas ŝparvojon al la labortablo, ĝi ne aperas tie - sed vi povas aldoni ĝin mane. La pasvorto estas ĉifrita, por 111111 ĝi estos jena: PW_49B02219D1F6, por 222222 - PW_4AB3211AD2F5. Sed ni pli interesiĝas pri tio, ke ĉi tiu pasvorto estas ĉifrita unumaniere, sendepende de la specifa komputilo, kaj se ni restarigas la pasvorton al la komenca, tiam ni povas uzi unu antaŭkonatan valoron en ĉi tiu kampo. Nu, se ni volas uzi hazarde kreitan pasvorton, ni devos kompreni la algoritmon de ĉi tiu ĉifro. Sed se juĝante laŭ la ekzemploj donitaj, tio ne estos malfacile fari. Cetere, en SAP GUI 7.40 ĉi tiu kampo tute malaperis el la formularo, sed ĝi ĝuste akceptas dosieron kun plenigita pasvorto.

Tio estas, montriĝas, ke en la retumilo vi nur bezonas alklaki la ligilon al dosiero kun la etendo .sap kaj la dezirata formato - kaj ĝi proponos malfermi ĝin kiel dosieron kiel SAP GUI Shortcut (nature en komputilo). kun SAP GUI instalita) kaj malfermos SAP GUI-fenestron kun la specifitaj parametroj (se la SID kaj klientparo estas en la listo de SAP-Ensaluto sur ĉi tiu komputilo).

Sed, estas klare, ke neniu simple kreos dosierojn anticipe kaj stokos ilin en la retejo - ili devas esti generitaj surbaze de la necesaj parametroj. Ekzemple, vi povas krei PHP-skripton por generi ŝparvojojn (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";
?>

Se vi ne specifas uzantnomon kaj pasvorton, vi ricevos la jenan fenestron petante ensaluton kaj pasvorton:

Lanĉante SAP GUI de retumilo

Se vi pasas nur la ensaluton, la ensaluta kampo estos plenigita kaj la pasvorta kampo estos malplena. Se ni donas al la uzanto kaj ensaluton kaj pasvorton, sed la uzanto en la komputilo havas la EnablePassword-ŝlosilon en la registro en la sekcio [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] fiksita al 0, tiam ni ricevas la samon. Kaj nur se ĉi tiu ŝlosilo estas agordita al 1 kaj ni pasas kaj la nomon kaj la komencan pasvorton, la sistemo tuj petos vin enigi novan konstantan pasvorton dufoje. Tion ni bezonis akiri.

Kiel rezulto, ni havas la sekvan aron de pripensitaj elektoj kiel ilustraĵo de ĉio ĉi-supra:

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

La lasta opcio konvenis al mi. Sed anstataŭ generi SAP-mallongigojn, vi ankaŭ povas uzi, ekzemple, generi CMD-dosierojn, kiuj, kiam malfermitaj de retumilo, ankaŭ malfermos la SAP GUI-fenestron por vi. Malsupre estas ekzemplo (sapguicmd.php) rekte lanĉu la SAP GUI kun la plena konektoŝnuro, sen la bezono havi SAP-Ensalutu agordita:

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

fonto: www.habr.com

Aldoni komenton