Стартиране на 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 Shortcut има собствен подсекция в този раздел, можете да добавите параметъра на низа на 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 и копирайте го на вашия работен плот. Използвах този метод веднъж, но преди това не погледнах специално файла за бърз достъп. И се оказа, че този пряк път е обикновен текстов файл с разширение .sap. И ако го стартирате на 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, във файл sapshortcut.ini (Близо до saplogon.ini в потребителския профил на Windows) и там, въпреки че са криптирани, те не са твърде силно криптирани и при желание могат да бъдат декриптирани. Но можете да разрешите това, като промените стойността на един параметър в системния регистър (стойността по подразбиране е 0):

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

Това отключва полето за парола за въвеждане във формуляра за създаване на пряк път в SAP Logon:

Стартиране на SAP GUI от браузър

И когато въведете парола в това поле, тя ще бъде поставена в съответния ред
sapshortcut.ini, но когато плъзнете пряк път на работния плот, той не се появява там - но можете да го добавите там ръчно. Паролата е шифрована, за 111111 ще бъде както следва: PW_49B02219D1F6, за 222222 - PW_4AB3211AD2F5. Но ние сме по-заинтересовани от факта, че тази парола е криптирана по един начин, независимо от конкретния компютър, и ако възстановим паролата до първоначалната, тогава можем да използваме една предварително известна стойност в това поле. Е, ако искаме да използваме произволно създадена парола, ще трябва да разберем алгоритъма на този шифър. Но съдейки по дадените примери, това няма да е трудно да се направи. Между другото, в SAP GUI 7.40 това поле напълно изчезна от формата, но правилно приема файл с попълнена парола.

Тоест, оказва се, че в браузъра просто трябва да кликнете върху връзката към файл с разширение .sap и желания формат - и той ще предложи да го отворите като файл от типа SAP GUI Shortcut (естествено на компютър с инсталиран SAP GUI) и ще отвори прозорец на SAP GUI с посочените параметри (ако двойката SID и клиент са в списъка за влизане в SAP на този компютър).

Но е ясно, че никой няма просто да създава файлове предварително и да ги съхранява на сайта - те трябва да бъдат генерирани въз основа на необходимите параметри. Например, можете да създадете 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

Добавяне на нов коментар