Mulai SAP GUI dari browser

Saya pertama kali menulis artikel ini di blog saya, sehingga nantinya saya tidak akan melihat dan mengingat lagi, tetapi karena tidak ada yang membaca blog, saya ingin berbagi informasi ini dengan semua orang, tiba-tiba saya bisa menggunakannya.

Saat bekerja pada gagasan layanan reset kata sandi dalam sistem SAP R / 3, muncul pertanyaan - bagaimana cara memulai SAP GUI dengan parameter yang diperlukan dari browser? Karena ide ini menyiratkan penggunaan layanan web yang pertama memenuhi permintaan SOAP dari SAP GUI dan mengirim email dengan tautan ke halaman web dengan skrip pengaturan ulang kata sandi ke yang pertama, dan kemudian menampilkan pesan kepada pengguna tentang pengaturan ulang kata sandi yang berhasil dan menampilkan kata sandi awal ini , maka saya ingin itu di halaman ini juga ada tautan untuk meluncurkan SAP GUI. Selain itu, agar tautan ini dapat membuka sistem yang diinginkan, dan bahkan, lebih disukai, segera dengan isian login dan kata sandi yang diisi: pengguna hanya perlu mengisi kata sandi yang produktif dua kali.

Memulai SAP Logon tidak menarik untuk tujuan kami, dan ketika memulai sapgui.exe tidak mungkin untuk menentukan klien dan nama pengguna, tetapi dimungkinkan untuk memulai sistem yang tidak didefinisikan dalam SAP Logon. Di sisi lain, memulai SAP GUI dengan parameter server sewenang-wenang tidak terlalu relevan: jika kita memecahkan masalah pengaturan ulang kata sandi pengguna, maka kemungkinan besar dia sudah memiliki garis kanan dalam SAP Logon, dengan pengaturan yang dia butuhkan dan tidak perlu repot dengan miliknya. Tetapi teknologi SAP GUI Shortcut dan program aktual sapshcut.exe, yang memungkinkan untuk memulai SAP GUI menggunakan "pintasan" tertentu, memenuhi persyaratan yang ditentukan.

Solusi untuk masalah di dahi: menjalankan sapshcut.exe langsung dari browser menggunakan objek 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'); } 

Solusinya buruk: pertama, ia hanya bekerja di Internet Explorer, dan kedua, ia memerlukan pengaturan keamanan yang sesuai di browser, yang dapat dilarang di tingkat domain dalam organisasi, dan bahkan jika diaktifkan, browser memberi pengguna jendela dengan peringatan yang menakutkan:



Saya menggali solusi # 2 di Internet: membuat protokol web saya sendiri . Ini memungkinkan Anda untuk menjalankan aplikasi yang kami butuhkan menggunakan tautan yang menunjukkan protokol yang kami daftarkan di Windows di registri di bagian HKEY_CLASSES_ROOT. Karena Pintasan SAP GUI di bagian ini memiliki subbagiannya sendiri, Anda dapat menambahkan parameter string Protokol URL dengan nilai kosong:



Protokol ini meluncurkan sapgui.exe dengan parameter / SHORTCUT , yang kami butuhkan:



Baik, atau jika kita ingin membuat protokol arbitrer secara umum (misalnya, sapshcut ), maka Anda dapat mendaftarkannya menggunakan reg-file berikut:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\sapshcut]
@="sapshcut Handler"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\sapshcut\DefaultIcon]
@="sapshcut.exe"
[HKEY_CLASSES_ROOT\sapshcut\shell]
[HKEY_CLASSES_ROOT\sapshcut\shell\open]
[HKEY_CLASSES_ROOT\sapshcut\shell\open\command]
@="sapshcut.exe \"%1\""

Sekarang, jika kita membuat tautan pada halaman web yang menunjukkan protokol Sapgui.Shortcut.File dengan cara yang sama:

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

kita akan melihat jendela seperti:



Dan semuanya tampak baik-baik saja, tetapi ketika Anda mengklik tombol "Izinkan", kita melihat:



Ups, browser mengubah ruang menjadi% 20. Nah, karakter lain juga akan dikodekan dalam kode numerik mereka dengan simbol persen. Dan hal yang paling tidak menyenangkan adalah tidak ada yang dapat dilakukan di sini di level browser (semuanya dilakukan sesuai standar) - browser tidak menyukai karakter seperti itu, dan shell Windows tidak bekerja dengan nilai-nilai yang dikodekan. Dan satu lagi minus - seluruh string dilewatkan sebagai parameter, termasuk nama protokol dan bahkan titik dua ( sapgui.shortcut.file :) . Selain itu, meskipun sapshcut.exe yang sama dapat membuang semua yang bukan merupakan parameter untuk itu (dimulai dengan simbol "-", lalu nama, "=" dan nilainya), yaitu. sebuah baris dari bentuk " sapgui.shortcut.file: -system = SID " masih menggulung, maka tanpa spasi " sapgui.shortcut.file: -system = SID " tidak berfungsi lagi.

Ternyata, pada prinsipnya, ada dua opsi untuk menggunakan protokol URI:

  1. Gunakan tanpa parameter: Kami membuat sejumlah protokol untuk semua sistem kami dari tipe SIDMANDT , seperti AAA200 , BBB200 , dll. Jika Anda hanya perlu memulai sistem yang diinginkan, maka opsinya cukup berfungsi, tetapi dalam kasus kami itu tidak berfungsi, karena setidaknya Anda ingin mentransfer login pengguna juga, tetapi Anda tidak dapat melakukannya dengan cara ini.
  2. Menggunakan pembungkus untuk memanggil sapshcut.exe atau sapgui.exe . Inti dari program ini sederhana - harus mengambil garis yang akan ditransmisikan oleh browser melalui protokol web dan mengubahnya menjadi representasi yang diterima Windows, yaitu. kembali mengubah semua kode karakter menjadi karakter (bahkan mungkin mem-parsing string dengan parameter) dan sudah memanggil SAP GUI yang dijamin oleh perintah yang benar. Dalam kasus kami, itu juga tidak cukup cocok (oleh karena itu, saya bahkan tidak menulisnya), karena itu tidak cukup bagi kami untuk menambahkan protokol pada semua PC pengguna (dalam domain, ini masih belum ke mana-mana, meskipun lebih baik untuk menghindari praktik ini juga), tetapi akan memerlukan tambahan tempatkan program pada PC, dan bahkan terus-menerus memonitor agar tidak hilang ketika menginstal ulang perangkat lunak pada PC.

Yaitu opsi ini juga dibuang sebagai tidak layak untuk kita.

Kemudian saya mulai berpikir bahwa saya harus mengucapkan selamat tinggal pada ide memulai SAP GUI dengan parameter yang diperlukan dari browser, tetapi kemudian saya mendapat ide bahwa Anda dapat membuat jalan pintas dalam SAP Logon dan menyalinnya ke desktop. Saya menggunakan metode ini satu kali, tetapi sebelumnya saya tidak melihat file shortcut secara khusus. Dan ternyata pintasan ini adalah file teks biasa dengan ekstensi .sap . Dan jika Anda menjalankannya di Windows, SAP GUI memulai dengan parameter yang ditentukan dalam file ini. "Bingo!"

Format file ini kira-kira sebagai berikut (mungkin masih ada transaksi yang diluncurkan saat startup, tapi saya hilangkan):

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

Tampaknya hanya itu yang diperlukan: pengidentifikasi sistem, klien, nama pengguna, dan bahkan kata sandi. Dan bahkan parameter tambahan: Judul - judul jendela, GuiSize - ukuran jendela yang sedang berjalan (layar penuh atau tidak) dan Penggunaan Kembali - apakah akan membuka jendela baru atau menggunakan jendela yang sudah terbuka dengan sistem yang sama. Tapi segera nuansa keluar - ternyata tidak mungkin untuk mengatur kata sandi di SAP Logon, saluran diblokir. Ternyata ini dilakukan karena alasan keamanan: ia menyimpan semua pintasan yang dibuat dalam SAP Logon dalam file sapshortcut.ini (di sebelah saplogon.ini di profil pengguna Windows) dan meskipun mereka dienkripsi di sana, mereka dapat dienkripsi terlalu banyak dan jika diinginkan. memecahkan kode Tetapi Anda juga dapat menyelesaikan ini dengan mengubah nilai satu parameter dalam registri (nilai default adalah 0 ):

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\SAP\SAPShortcut\Security]
"EnablePassword"="1"

Ini membuka bidang Kata Sandi pada formulir pintas di SAP Logon untuk masuk:



Dan ketika memasukkan kata sandi di bidang ini, itu akan ditempatkan di baris yang sesuai
sapshortcut.ini , tetapi ketika Anda menyeret jalan pintas ke desktop, itu tidak muncul di sana - tetapi Anda dapat menambahkannya secara manual. Kata sandi dienkripsi, untuk 111111 akan berupa: PW_49B02219D1F6, untuk 222222 - PW_4AB3211AD2F5. Tetapi kami lebih tertarik pada kenyataan bahwa kata sandi ini dienkripsi dengan satu cara yang tidak tergantung pada PC tertentu, dan jika kami mereset kata sandi ke yang pertama, kami dapat menggunakan satu nilai yang sebelumnya diketahui dalam bidang ini. Nah, jika kita ingin menggunakan kata sandi yang dibuat secara acak, kita harus memahami algoritma cipher ini. Tetapi menilai dari contoh-contoh di atas, ini tidak akan sulit. Ngomong-ngomong, dalam SAP GUI 7.40 bidang ini umumnya hilang dari formulir, tetapi ia benar memahami file dengan kata sandi yang diisi.

Yaitu, ternyata di browser sudah cukup mengklik tautan ke file dengan ekstensi .sap dan dengan format yang diinginkan - dan ia akan menawarkan untuk membukanya sebagai file jenis Shortcut SAP GUI (tentu saja pada PC dengan SAP GUI terpasang) dan akan membuka jendela SAP GUI dengan yang ditentukan parameter (jika SID dan pasangan klien ada dalam daftar SAP Logon pada PC ini).

Tetapi jelas bahwa tidak ada yang akan membuat dan menyimpan file di situs sebelumnya - mereka harus dibuat berdasarkan parameter yang diperlukan. Misalnya, Anda dapat membuat skrip dalam PHP untuk menghasilkan pintasan ( 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]\r\n"; echo "Name=".$SID."\r\n"; echo "Client=".$Client."\r\n"; echo "[User]\r\n"; echo "Name=".$Username."\r\n"; echo "Language=".$Lang."\r\n"; if($Password<>'') echo "Password=".$Password."\r\n"; echo "[Function]\r\n"; if($Title<>'') {echo "Title=".$Title."\r\n";} else {echo "Title=  \r\n";}; echo "[Configuration]\r\n"; if($Size=='max') { echo "GuiSize=Maximized\r\n"; }; echo "[Options]\r\n"; echo "Reuse=0\r\n"; ?> 

Jika Anda tidak menentukan nama pengguna dan kata sandi, maka kami mendapatkan jendela berikut dari petunjuk masuk dan kata sandi:



Jika Anda hanya mentransfer login, maka bidang login akan diisi, dan bidang kata sandi kosong. Jika kami memberikan nama pengguna dan kata sandi kepada pengguna, tetapi kunci EnablePassword pengguna di bagian [HKEY_CURRENT_USER \ Software \ SAP \ SAPShortcut \ Security] diatur ke 0 pada PC pengguna, kami akan mendapatkan hal yang sama. Dan hanya jika kunci ini disetel ke 1 dan kami mentransfer nama dan kata sandi awal, maka sistem akan segera meminta Anda untuk memasukkan kata sandi permanen yang baru dua kali. Apa yang harus diterima.

Akibatnya, kami memiliki serangkaian opsi berikut yang dianggap sebagai ilustrasi dari semua hal di atas:

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

Opsi terakhir datang kepada saya. Tetapi Anda juga dapat menggunakan, misalnya, pembuatan file CMD alih-alih menghasilkan pintasan SAP, yang, ketika dibuka dari browser, juga akan membuka jendela SAP GUI. Berikut ini adalah contoh ( sapguicmd.php ) langsung memulai SAP GUI dengan string koneksi penuh, tanpa harus mengkonfigurasi 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 off\r\n"; echo "chcp 1251\r\n"; echo "echo   ".$Title."\r\n"; echo "set SAP_CODEPAGE=1504\r\n"; echo 'if exist "%ProgramFiles(x86)%\SAP\FrontEnd\SapGui\sapgui.exe" set gui=%ProgramFiles(x86)%\SAP\FrontEnd\SapGui\sapgui.exe'."\r\n"; echo 'if exist "%ProgramFiles%\SAP\FrontEnd\SapGui\sapgui.exe" set gui=%ProgramFiles%\SAP\FrontEnd\SapGui\sapgui.exe'."\r\n"; 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 "\r\n"; echo '"%gui%" %logon%'."\r\n"; ?> 

Source: https://habr.com/ru/post/id446998/


All Articles