Uruchamianie GUI SAP z przeglądarki

Po raz pierwszy napisałem ten artykuł w moim blog, żeby później nie szukać i nie zapamiętywać, ale skoro nikt nie czyta bloga, to chciałam podzielić się tą informacją ze wszystkimi, na wypadek, gdyby komuś się przydała.

Pracując nad pomysłem usługi resetu hasła w systemach SAP R/3 pojawiło się pytanie - jak uruchomić SAP GUI z niezbędnymi parametrami z poziomu przeglądarki? Ponieważ pomysł ten zakładał wykorzystanie usługi internetowej, najpierw odpowiadanie na żądanie SOAP z GUI SAP i wysyłanie wiadomości e-mail z linkiem do strony internetowej ze skryptem resetującym hasło do początkowego, a następnie wyświetlającym się użytkownikowi komunikat o pomyślnym zresetowaniu hasła i wyświetleniu tego bardzo początkowego hasła, to chciałbym, aby ta strona zawierała również link do uruchomienia GUI SAP. Co więcej, link ten powinien otwierać żądany system i, najlepiej, z polami loginu i hasła wypełnionymi od razu: użytkownik musiałby jedynie dwukrotnie wpisać hasło produkcyjne.

Uruchomienie SAP Logon nie było dla nas interesujące, a podczas uruchamiania sapgui.exe nie można było określić klienta i nazwy użytkownika, ale możliwe było uruchomienie systemu niezdefiniowanego w SAP Logon. Z drugiej strony uruchomienie SAP GUI z dowolnymi parametrami serwera nie było szczególnie istotne: jeśli rozwiązujemy problem resetowania hasła użytkownika, to najprawdopodobniej ma on już niezbędną linię w SAP Logon z potrzebnymi mu ustawieniami i tam nie ma potrzeby zadzierać ze swoimi. Jednak określone wymagania spełniła technologia SAP GUI Shortcut oraz sam program sapshcut.exe, który umożliwił uruchomienie SAP GUI za pomocą określonego „skrótu”.

Rozwiązanie problemu bezpośrednio: uruchomienie programu sapshcut.exe bezpośrednio z przeglądarki przy użyciu obiektu 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');
}

Rozwiązanie jest złe: po pierwsze działa tylko w przeglądarce Internet Explorer, po drugie wymaga odpowiednich ustawień zabezpieczeń w przeglądarce, co w organizacji może być zabronione na poziomie domeny, a nawet jeśli jest dozwolone, przeglądarka wyświetla okno z przerażającym ostrzeżenie dla użytkownika:

Uruchamianie GUI SAP z przeglądarki

Znalazłem rozwiązanie nr 2 w Internecie: tworzenie własnego protokołu internetowego. Pozwala nam uruchomić potrzebną nam aplikację za pomocą odnośnika wskazującego protokół, który sami rejestrujemy w Windowsie w rejestrze w sekcji HKEY_CLASSES_ROOT. Ponieważ skrót SAP GUI ma w tej sekcji własną podsekcję, możesz dodać tam parametr ciągu protokołu URL z pustą wartością:

Uruchamianie GUI SAP z przeglądarki

Rozpoczyna się ten protokół sapgui.exe z parametrem /SKRÓT, czyli dokładnie to, czego potrzebujemy:

Uruchamianie GUI SAP z przeglądarki

No cóż, albo jeśli chcemy sporządzić całkowicie dowolny protokół (np. sapshcut), możesz go zarejestrować, korzystając z następującego pliku 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""

Teraz, jeśli utworzymy link na stronie internetowej wskazujący protokół Sapgui.Skrót.Plik W podobny sposób:

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

Powinniśmy zobaczyć takie okno:

Uruchamianie GUI SAP z przeglądarki

I wszystko wydaje się świetnie, ale po kliknięciu przycisku „Zezwalaj” widzimy:

Uruchamianie GUI SAP z przeglądarki

Ups, przeglądarka zmieniła spację na%20. Cóż, inne znaki również zostaną zakodowane we własnym kodzie numerycznym z symbolem procentu. A najbardziej nieprzyjemne jest to, że z poziomu przeglądarki nic nie da się tu zrobić (wszystko tutaj jest zrobione zgodnie ze standardem) - przeglądarka nie lubi takich znaków, a interpreter poleceń Windows nie współpracuje z tak zakodowanymi wartościami. I jeszcze jeden minus - jako parametr przekazywany jest cały ciąg znaków, łącznie z nazwą protokołu, a nawet dwukropkiem (plik.sapgui.shortcut.file:). Co więcej, chociaż to samo sapshcut.exe może odrzucić wszystko, co nie jest dla niego parametrem (zaczyna się od symbolu „-”, potem nazwa, „=” i wartość), tj. linijka typu „sapgui.shortcut.file: -system=SID„nadal będzie działać, ale bez spacji”sapgui.shortcut.file:-system=SID"nie działa.

Okazuje się, że w zasadzie istnieją dwie możliwości wykorzystania protokołu URI:

  1. Używanie bez parametrów: Tworzymy całą masę protokołów dla wszystkich naszych systemów tego typu SIDMANDT, typ AAA200, BBB200 i tak dalej. Jeśli potrzebujesz tylko uruchomić żądany system, opcja jest całkiem wykonalna, ale w naszym przypadku nie jest odpowiednia, ponieważ przynajmniej chciałbyś przenieść login użytkownika, ale nie można tego zrobić w ten sposób.
  2. Używanie programu opakowującego do wywoływania sapshcut.exe lub sapgui.exe. Istota tego programu jest prosta - musi on pobrać ciąg znaków, który przeglądarka przesyła do niego za pośrednictwem protokołu sieciowego, i przekształcić go w reprezentację, którą otrzymuje system Windows, tj. zamienia wszystkie kody znaków z powrotem na znaki (może nawet analizuje ciąg znaków według parametrów) i już wywołuje GUI SAP z gwarantowaną poprawną komendą. W naszym przypadku też nie jest to do końca odpowiednie (dlatego nawet tego nie pisałem), bo nie wystarczy, że dodamy protokół na wszystkich komputerach użytkowników (w obrębie domeny to i tak jest w porządku, chociaż lepiej też unikaj tej praktyki), ale tutaj będziemy potrzebować więcej miejsca na program na komputerze, a także stale pilnuj, aby nie zniknął po ponownej instalacji oprogramowania na komputerze.

Te. Tę opcję również odrzucamy jako dla nas nieodpowiednią.

W tym momencie już zaczynałem myśleć, że będę musiał pożegnać się z pomysłem uruchomienia SAP GUI z niezbędnymi parametrami z poziomu przeglądarki, ale wtedy przyszedł mi do głowy pomysł, że w SAP Logon można zrobić skrót i skopiuj go na pulpit. Użyłem tej metody raz, ale wcześniej nie patrzyłem specjalnie na plik skrótu. I okazało się, że ten skrót to zwykły plik tekstowy z rozszerzeniem .sok roślinny. Jeśli uruchomisz go w systemie Windows, interfejs GUI SAP zostanie uruchomiony z parametrami określonymi w tym pliku. „Bingo!”

Format tego pliku jest w przybliżeniu następujący (przy uruchomieniu może również zostać uruchomiona transakcja, ale ją pominąłem):

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

Wydaje się, że wszystko, co jest potrzebne: identyfikator systemu, klient, nazwa użytkownika, a nawet hasło. A nawet dodatkowe parametry: Tytuł - tytuł okna, Rozmiar Gui — rozmiar działającego okna (pełny ekran lub nie) i Ponowne użycie — czy konieczne jest otwarcie nowego okna, czy skorzystanie z już otwartego w tym samym systemie. Ale od razu pojawił się niuans - okazało się, że nie można ustawić hasła w SAP Logon, linia została zablokowana. Okazało się, że zrobiono to ze względów bezpieczeństwa: przechowuje w pliku wszystkie skróty utworzone w SAP Logon sapshortcut.ini (W pobliżu saplogon.ini w profilu użytkownika Windows) i tam, choć są zaszyfrowane, to nie są one zbyt mocno zaszyfrowane i w razie potrzeby można je odszyfrować. Można jednak rozwiązać ten problem, zmieniając wartość jednego parametru w rejestrze (wartość domyślna to 0):

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

Spowoduje to odblokowanie pola Hasło do wpisania w formularzu tworzenia skrótu w SAP Logon:

Uruchamianie GUI SAP z przeglądarki

A kiedy wpiszesz hasło w tym polu, zostanie ono umieszczone w odpowiedniej linii
sapshortcut.ini, ale gdy przeciągniesz skrót na pulpit, nie pojawi się on tam - ale możesz go tam dodać ręcznie. Hasło jest szyfrowane, dla 111111 będzie wyglądało następująco: PW_49B02219D1F6, dla 222222 - PW_4AB3211AD2F5. Nas jednak bardziej interesuje fakt, że to hasło jest szyfrowane w jeden sposób, niezależny od konkretnego komputera i jeśli zresetujemy hasło do początkowego, to będziemy mogli zastosować w tym polu jedną, wcześniej znaną wartość. Cóż, jeśli będziemy chcieli skorzystać z losowo utworzonego hasła, będziemy musieli zrozumieć algorytm tego szyfru. Ale sądząc po podanych przykładach, nie będzie to trudne. Nawiasem mówiąc, w SAP GUI 7.40 to pole całkowicie zniknęło z formularza, ale poprawnie akceptuje plik z wprowadzonym hasłem.

Oznacza to, że w przeglądarce wystarczy kliknąć link do pliku z rozszerzeniem .sap i żądanym formatem - i zaproponuje otwarcie go jako pliku takiego jak skrót SAP GUI (oczywiście na komputerze PC z zainstalowanym interfejsem SAP GUI) i otworzy okno SAP GUI z określonymi parametrami (jeśli identyfikator SID i para klientów znajdują się na liście logowania SAP na tym komputerze).

Jasne jest jednak, że nikt nie będzie po prostu tworzył plików z wyprzedzeniem i przechowywał je na stronie - należy je wygenerować na podstawie niezbędnych parametrów. Na przykład możesz utworzyć skrypt PHP do generowania skrótów (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";
?>

Jeżeli nie podasz nazwy użytkownika i hasła, pojawi się następujące okno z prośbą o podanie loginu i hasła:

Uruchamianie GUI SAP z przeglądarki

Jeśli podasz tylko login, pole logowania zostanie wypełnione, a pole hasła będzie puste. Jeśli podamy użytkownikowi zarówno login, jak i hasło, ale użytkownik na komputerze PC ma klucz EnablePassword w rejestrze w sekcji [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] ustawiony na 0, to otrzymamy to samo. I tylko jeśli ten klucz jest ustawiony na 1 i podamy zarówno nazwę, jak i hasło początkowe, system natychmiast poprosi Cię o dwukrotne wprowadzenie nowego, stałego hasła. To właśnie musieliśmy zdobyć.

W rezultacie mamy następujący zestaw rozważanych opcji jako ilustrację wszystkich powyższych:

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

Ostatnia opcja mi odpowiadała. Ale zamiast generować skróty SAP, możesz też skorzystać np. z wygenerowania plików CMD, które po otwarciu z przeglądarki otworzą Ci także okno GUI SAP. Poniżej przykład (sapguicmd.php) bezpośrednio uruchom interfejs GUI SAP z pełnymi parametrami połączenia, bez konieczności konfigurowania logowania SAP:

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

Źródło: www.habr.com

Dodaj komentarz