Покретање САП ГУИ из претраживача

Први пут сам написао овај чланак у свом блог, да не бих касније поново тражио и памтио, али пошто нико не чита блог, хтео сам да поделим ову информацију са свима, у случају да некоме буде од користи.

Током рада на идеји услуге ресетовања лозинке у САП Р/3 системима, поставило се питање - како покренути САП ГУИ са потребним параметрима из претраживача? Пошто је ова идеја подразумевала коришћење веб сервиса, прво се одговори на СОАП захтев из САП ГУИ-а и пошаље писмо са линком до веб странице са скриптом за ресетовање лозинке на почетну, а затим се прикаже кориснику поруку о успешном ресетовању лозинке и приказивању ове почетне лозинке, онда бих желео да ова страница такође има везу за покретање САП ГУИ. Штавише, ова веза би требало да отвори жељени систем и, по могућности, са попуњеним пољима за пријаву и лозинку одједном: корисник би морао само два пута да унесе продуктивну лозинку.

Покретање САП Логон-а није било интересантно за нашу сврху, а приликом покретања сапгуи.еке није било могуће навести име клијента и корисника, али је било могуће покренути систем који није дефинисан у САП Логон-у. С друге стране, покретање САП ГУИ-а са произвољним параметрима сервера није било посебно релевантно: ако решавамо проблем ресетовања лозинке корисника, онда највероватније он већ има неопходну линију у САП Логон-у, са подешавањима која су му потребна, и тамо нема потребе да се петља са својим. Али наведене захтеве су испунили технологија САП ГУИ Схортцут и сам програм сапсхцут.еке, што је омогућило покретање САП ГУИ помоћу специфичне „пречице“.

Решавање проблема директно: покретање сапсхцут.еке директно из претраживача помоћу АцтивеКс објекта:

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

Решење је лоше: прво, ради само у Интернет Екплорер-у, друго, захтева одговарајућа безбедносна подешавања у претраживачу, што у организацији може бити забрањено на нивоу домена, а чак и ако је дозвољено, претраживач приказује прозор са застрашујућим упозорење за корисника:

Покретање САП ГУИ из претраживача

Нашао сам решење број 2 на интернету: креирање сопственог веб протокола. Омогућава нам да покренемо апликацију која нам је потребна помоћу везе која означава протокол, који сами региструјемо у Виндовс-у у регистру у одељку ХКЕИ_ЦЛАССЕС_РООТ. Пошто САП ГУИ Схортцут има свој пододељак у овом одељку, можете додати параметар стринга УРЛ протокола са празном вредношћу тамо:

Покретање САП ГУИ из претраживача

Овај протокол почиње сапгуи.еке са параметром /СХОРТЦУТ, што је управо оно што нам треба:

Покретање САП ГУИ из претраживача

Па, или ако желимо да направимо потпуно произвољан протокол (нпр. сапсхцут), онда га можете регистровати користећи следећу рег датотеку:

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

Сада, ако направимо везу на веб страници која означава протокол Сапгуи.Схортцут.Филе На сличан начин:

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

Требало би да видимо овакав прозор:

Покретање САП ГУИ из претраживача

И све изгледа одлично, али када кликнете на дугме „Дозволи“, видимо:

Покретање САП ГУИ из претраживача

Упс, прегледач је претворио размакницу у %20. Па, други знакови ће такође бити кодирани у сопствени нумерички код са симболом процента. А најнепријатније је то што се овде ништа не може урадити на нивоу претраживача (овде се све ради по стандарду) - претраживач не воли такве знакове, а тумач команди Виндовс не ради са таквим кодираним вредностима. И још један минус - цео стринг се прослеђује као параметар, укључујући име протокола, па чак и двотачку (сапгуи.схортцут.филе:). Штавише, иако исто сапсхцут.еке може да одбаци све што за њега није параметар (почиње симболом „-“, затим назив, „=“ и вредност), тј. ред као "сапгуи.схортцут.филе: -систем=СИД"и даље ће радити, онда без размака"сапгуи.схортцут.филе:-систем=СИД„више не ради.

Испоставило се да, у принципу, постоје две опције за коришћење УРИ протокола:

  1. Коришћење без параметара: Креирамо читав низ протокола за све наше системе овог типа СИДМАНДТ, као ААА200, БББ200 и тако даље. Ако само треба да покренете жељени систем, онда је опција прилично изводљива, али у нашем случају није прикладна, јер бисте бар желели да пренесете корисничку пријаву, али то се не може учинити на овај начин.
  2. Коришћење програма омотача за позивање сапсхцут.еке или сапгуи.еке. Суштина овог програма је једноставна – он мора узети стринг који му прегледач преноси преко веб протокола и претворити га у репрезентацију коју Виндовс прима, тј. претвара све кодове знакова назад у знакове (можда чак анализира стринг према параметрима) и већ позива САП ГУИ са гарантовано исправном командом. У нашем случају то такође није сасвим прикладно (зато га нисам ни написао), јер није довољно да додамо протокол на све корисничке рачунаре (унутар домена ово је и даље у реду, мада је такође боље да избегавајте ову праксу), али овде ће нам требати више постављања програма на рачунар, а такође и стално осигурати да не нестане када се софтвер поново инсталира на рачунар.

Оне. Ову опцију такође одбацујемо као неприкладну за нас.

У овом тренутку сам већ почео да размишљам да ћу морати да се опростим од идеје да покренем САП ГУИ са потребним параметрима из претраживача, али онда ми је пала на памет идеја да можете направити пречицу у САП Логон-у и копирајте га на радну површину. Једном сам користио ову методу, али пре тога нисам посебно гледао датотеку пречице. И испоставило се да је ова пречица обична текстуална датотека са екстензијом .биљни сок. А ако га покренете на Виндовс-у, САП ГУИ ће се покренути са параметрима наведеним у овој датотеци. "Бинго!"

Формат ове датотеке је отприлике следећи (можда постоји и трансакција покренута при покретању, али сам је изоставио):

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

Чини се да је све што је потребно: идентификатор система, клијент, корисничко име, па чак и лозинка. Па чак и додатни параметри: наслов - наслов прозора, ГуиСизе — величина прозора који се покреће (цео екран или не) и Поновна употреба — да ли је потребно отворити нови прозор или користити већ отворен са истим системом. Али одмах се појавила нијанса - испоставило се да се лозинка у САП Логон-у не може поставити, линија је блокирана. Испоставило се да је то учињено из безбедносних разлога: све пречице креиране у САП Логон-у чува у фајлу сапсхортцут.ини (Близу саплогон.ини у Виндовс корисничком профилу) и тамо, иако су шифровани, нису превише јако шифровани и по жељи се могу дешифровати. Али ово можете да решите променом вредности једног параметра у регистратору (подразумевана вредност је 0):

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

Ово откључава поље Лозинка за унос на обрасцу за креирање пречице у САП Логон-у:

Покретање САП ГУИ из претраживача

А када унесете лозинку у ово поље, она ће бити постављена у одговарајући ред
сапсхортцут.ини, али када превучете пречицу на радну површину, она се не појављује тамо - али можете је додати тамо ручно. Лозинка је шифрована, за 111111 ће бити следећа: ПВ_49Б02219Д1Ф6, за 222222 - ПВ_4АБ3211АД2Ф5. Али нас више интересује чињеница да је ова лозинка шифрована на један начин, независно од конкретног рачунара, и ако ресетујемо лозинку на почетну, онда можемо користити једну унапред познату вредност у овом пољу. Па, ако желимо да користимо насумично креирану лозинку, мораћемо да разумемо алгоритам ове шифре. Али, судећи по наведеним примерима, то неће бити тешко урадити. Иначе, у САП ГУИ 7.40 ово поље је потпуно нестало из обрасца, али исправно прихвата датотеку са попуњеном лозинком.

То јест, испоставило се да у претраживачу само треба да кликнете на везу до датотеке са екстензијом .сап и жељеним форматом - и он ће понудити да је отворите као датотеку као што је САП ГУИ Схортцут (природно на рачунару са инсталираним САП ГУИ) и отвориће прозор САП ГУИ са наведеним параметрима (ако се СИД и клијентски пар налазе на САП листи за пријаву на овом рачунару).

Али, јасно је да нико неће једноставно креирати фајлове унапред и чувати их на сајту - они морају бити генерисани на основу потребних параметара. На пример, можете креирати ПХП скрипту за генерисање пречица (сапсхцут.пхп):

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

Ако не наведете корисничко име и лозинку, добићете следећи прозор у коме ће се тражити логин и лозинка:

Покретање САП ГУИ из претраживача

Ако проследите само пријаву, поље за пријаву ће бити попуњено, а поље за лозинку ће бити празно. Ако кориснику дамо и логин и лозинку, али корисник на рачунару има кључ ЕнаблеПассворд у регистратору у одељку [ХКЕИ_ЦУРРЕНТ_УСЕРСофтвареСАПСАПСхортцутСецурити] постављен на 0, онда добијамо исту ствар. И само ако је овај кључ постављен на 1 и проследимо и име и почетну лозинку, систем ће одмах затражити да унесете нову трајну лозинку два пута. То је оно што смо требали да добијемо.

Као резултат тога, имамо следећи скуп разматраних опција као илустрацију свега горе наведеног:

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

Последња опција ми је одговарала. Али уместо генерисања САП пречица, можете користити и, на пример, генерисање ЦМД датотека, које ће, када се отворе из прегледача, такође отворити прозор САП ГУИ за вас. Испод је пример (сапгуицмд.пхп) директно покрените САП ГУИ са пуним низом везе, без потребе да конфигуришете САП пријаву:

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

Извор: ввв.хабр.цом

Додај коментар