Стартување на SAP GUI од прелистувач

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

Додека работевте на идејата за услуга за ресетирање лозинка во системите SAP R/3, се појави прашање - како да го стартувате SAP GUI со потребните параметри од прелистувачот? Бидејќи оваа идеја подразбира употреба на веб-услуга, прво одговарање на барање SOAP од SAP GUI и испраќање писмо со линк до веб-страница со скрипта за ресетирање на лозинката на почетната, а потоа прикажување на корисникот порака за успешното ресетирање на лозинката и прикажување на оваа првична лозинка, тогаш би сакал оваа страница да има и врска за стартување на SAP GUI. Покрај тоа, оваа врска треба да го отвори саканиот систем и, по можност, со полето за најава и лозинка пополнети одеднаш: корисникот ќе треба само двапати да ја пополни продуктивната лозинка.

Стартувањето на SAP Logon не беше интересно за нашата цел, и кога се извршуваше sapgui.exe беше невозможно да се наведат клиентот и корисничкото име, но беше можно да се стартува систем што не е дефиниран во SAP Logon. Од друга страна, стартувањето на SAP GUI со произволни параметри на серверот не беше особено релевантно: ако го решаваме проблемот со ресетирање на лозинката на корисникот, тогаш најверојатно тој веќе ја има потребната линија во SAP Logon, со поставките што му се потребни и таму нема потреба да се плетка со своите. Но, наведените барања беа исполнети од технологијата SAP GUI Shortcut и самата програма sapshcut.exe, што овозможи да се стартува SAP GUI користејќи специфична „кратенка“.

Решавање на проблемот директно: стартување на sapshcut.exe директно од прелистувачот користејќи објект ActiveX:

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

Решението е лошо: прво, работи само во Internet Explorer, второ, бара соодветни безбедносни поставки во прелистувачот, што во организацијата може да биде забрането на ниво на домен, па дури и ако е дозволено, прелистувачот прикажува прозорец со застрашувачки предупредување до корисникот:

Стартување на SAP GUI од прелистувач

Најдов решение бр. 2 на Интернет: создавање на свој веб-протокол. Ни овозможува да ја стартуваме апликацијата што ни е потребна со помош на врска што го означува протоколот, кој ние самите го регистрираме во Windows во регистарот во делот HKEY_CLASSES_ROOT. Бидејќи кратенката на SAP GUI има своја потсекција во овој дел, можете да го додадете параметарот низа URL протокол со празна вредност таму:

Стартување на SAP GUI од прелистувач

Овој протокол започнува sapgui.exe со параметар /КРАТЕН, што е токму она што ни треба:

Стартување на SAP GUI од прелистувач

Па, или ако сакаме да направиме целосно произволен протокол (на пример, sapshcut), потоа можете да го регистрирате користејќи ја следната reg-датотека:

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

Сега, ако направиме врска на веб-страница што го означува протоколот Sapgui.Shortcut.File На сличен начин:

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

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

Стартување на SAP GUI од прелистувач

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

Стартување на SAP GUI од прелистувач

Упс, прелистувачот го претвори празно место во %20. Па, и другите знаци ќе бидат кодирани во сопствен нумерички код со симбол на проценти. И најнепријатното е што ништо не може да се направи овде на ниво на прелистувач (сè е направено според стандардот) - прелистувачот не сака такви знаци, а преведувачот на команди на Windows не работи со такви кодирани вредности. И уште еден минус - целата низа се пренесува како параметар, вклучувајќи го и името на протоколот, па дури и дебелото црево (sapgui.shortcut.file:). Згора на тоа, иако истото sapshcut.exe може да отфрли се што не е параметар за него (почнува со симболот „-“, потоа името, „=“ и вредноста), т.е. линија како "sapgui.shortcut.file: -system=SID„Сè уште ќе работи, тогаш без простор“sapgui.shortcut.file:-system=SID„повеќе не работи.

Излегува дека, во принцип, постојат две опции за користење на протоколот URI:

  1. Користење без параметри: Ние создаваме цел куп протоколи за сите наши системи од типот СИДМАНТ, тип AAA200, BBB200 и така натаму. Ако само треба да го стартувате саканиот систем, тогаш опцијата е доста изводлива, но во нашиот случај не е погодна, бидејќи барем би сакале да го префрлите корисничкото најавување, но тоа не може да се направи на овој начин.
  2. Користење на програма за обвивка за повик sapshcut.exe или sapgui.exe. Суштината на оваа програма е едноставна - мора да ја земе низата што прелистувачот му ја пренесува преку веб-протоколот и да ја претвори во претставата што ја добива Windows, т.е. ги претвора сите шифри на знаци назад во знаци (можеби дури и ја анализира низата според параметрите) и веќе го повикува SAP GUI со гарантирана точна команда. Во нашиот случај, тоа исто така не е сосема соодветно (затоа не го ни напишав), бидејќи не е доволно да го додадеме протоколот на сите кориснички компјутери (во домен сè уште е во ред, иако исто така е подобро да избегнувајте ја оваа практика), но овде ќе ни треба повеќе да ја поставиме програмата на компјутерот, а исто така постојано да се грижиме да не исчезне кога софтверот повторно ќе се инсталира на компјутерот.

Оние. Ние, исто така, ја отфрламе оваа опција како несоодветна за нас.

Во овој момент веќе почнав да размислувам дека ќе треба да се збогувам со идејата за лансирање на SAP GUI со потребните параметри од прелистувачот, но тогаш ми се појави идеја дека во SAP Logon можете да направите кратенка и копирајте го на вашиот десктоп. Го користев овој метод еднаш, но пред тоа конкретно не ја разгледав датотеката со кратенки. И се покажа дека оваа кратенка е обична текстуална датотека со наставката .сок. И ако го стартувате на Windows, SAP GUI ќе се стартува со параметрите што се наведени во оваа датотека. "Бинго!"

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

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

Се чини дека сè што е потребно: системски идентификатор, клиент, корисничко име, па дури и лозинка. Па дури и дополнителни параметри: Наслов - наслов на прозорецот, GuiSize — големината на прозорецот што работи (цел екран или не) и Повторна употреба — дали е потребно да се отвори нов прозорец или да се користи веќе отворен со истиот систем. Но, веднаш се појави нијанса - се покажа дека лозинката во SAP Logon не може да се постави, линијата е блокирана. Се испостави дека ова е направено од безбедносни причини: ги складира сите кратенки создадени во SAP Logon во датотека sapsshortcut.ini (Во близина саплогон.ини во корисничкиот профил на Windows) и таму, иако се шифрирани, тие не се премногу силно шифрирани и, по желба, може да се дешифрираат. Но, можете да го решите ова со менување на вредноста на еден параметар во регистарот (стандардната вредност е 0):

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

Ова го отклучува полето Лозинка за внесување на формуларот за креирање кратенки во SAP Logon:

Стартување на SAP GUI од прелистувач

И кога ќе внесете лозинка во ова поле, таа ќе биде ставена во соодветната линија
sapsshortcut.ini, но кога влечете кратенка на работната површина, таа не се појавува таму - но можете рачно да ја додадете таму. Лозинката е шифрирана, за 111111 ќе биде како што следува: PW_49B02219D1F6, за 222222 - PW_4AB3211AD2F5. Но, нас повеќе нè интересира фактот што оваа лозинка е шифрирана на еден начин, независно од конкретниот компјутер, и ако ја ресетираме лозинката на почетната, тогаш можеме да користиме една претходно позната вредност во ова поле. Па, ако сакаме да користиме случајно креирана лозинка, ќе треба да го разбереме алгоритмот на оваа шифра. Но, судејќи според дадените примери, ова нема да биде тешко да се направи. Патем, во SAP GUI 7.40 ова поле целосно исчезна од формуларот, но правилно прифаќа датотека со пополнета лозинка.

Односно, излегува дека во прелистувачот само треба да кликнете на врската до датотека со наставката .sap и саканиот формат - и ќе понуди да ја отворите како датотека како кратенка SAP GUI (природно на компјутер со инсталиран SAP GUI) и ќе отвори прозорец SAP GUI со наведените параметри (ако парот SID и клиентот се во списокот SAP Logon на овој компјутер).

Но, јасно е дека никој едноставно нема однапред да креира датотеки и да ги складира на страницата - тие мора да се генерираат врз основа на потребните параметри. На пример, можете да креирате PHP скрипта за да генерирате кратенки (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";
?>

Ако не наведете корисничко име и лозинка, ќе го добиете следниов прозорец со барање за најава и лозинка:

Стартување на SAP GUI од прелистувач

Ако го поминете само најавувањето, полето за најава ќе се пополни и полето за лозинка ќе биде празно. Ако на корисникот му дадеме и најавување и лозинка, но корисникот на компјутерот го има клучот EnablePassword во регистарот во делот [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] поставен на 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>

Последната опција ми одговараше. Но, наместо да генерирате SAP кратенки, можете исто така да користите, на пример, генерирање CMD-датотеки, кои, кога ќе се отворат од прелистувач, ќе ви го отворат и прозорецот SAP GUI. Подолу е пример (sapguicmd.php) директно стартувајте го SAP GUI со целосната низа за поврзување, без потреба да се конфигурира 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";
?>

Извор: www.habr.com

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