Saya pertama kali menulis artikel ini di saya , agar tidak mencari dan mengingatnya lagi nanti, tetapi karena tidak ada yang membaca blog ini, saya ingin berbagi informasi ini dengan semua orang, kalau-kalau ada yang merasa bermanfaat.
Saat mengerjakan ide layanan pengaturan ulang kata sandi di sistem SAP R/3, muncul pertanyaan - bagaimana cara meluncurkan SAP GUI dengan parameter yang diperlukan dari browser? Karena ide ini menyiratkan penggunaan layanan web, pertama-tama tanggapi permintaan SOAP dari SAP GUI dan kirimkan surat dengan tautan ke halaman web dengan skrip untuk mengatur ulang kata sandi ke yang awal, dan kemudian menampilkannya kepada pengguna. pesan tentang penyetelan ulang kata sandi yang berhasil dan menampilkan kata sandi awal ini, maka saya ingin halaman ini juga memiliki tautan untuk meluncurkan SAP GUI. Selain itu, tautan ini akan membuka sistem yang diinginkan, dan, lebih disukai, dengan kolom login dan kata sandi diisi sekaligus: pengguna hanya perlu mengisi kata sandi produktif dua kali.
Meluncurkan SAP Logon tidak menarik untuk tujuan kami, dan saat menjalankan sapgui.exe tidak mungkin menentukan nama klien dan pengguna, tetapi dimungkinkan untuk meluncurkan sistem yang tidak ditentukan dalam SAP Logon. Di sisi lain, meluncurkan SAP GUI dengan parameter server sewenang-wenang tidak terlalu relevan: jika kita memecahkan masalah menyetel ulang kata sandi pengguna, kemungkinan besar dia sudah memiliki baris yang diperlukan di SAP Logon, dengan pengaturan yang dia perlukan, dan di sana tidak perlu main-main dengan miliknya sendiri. Namun persyaratan yang ditentukan dipenuhi oleh teknologi Pintasan SAP GUI dan program sapshcut.exe itu sendiri, yang memungkinkan peluncuran SAP GUI menggunakan "pintasan" tertentu.
Memecahkan masalah secara langsung: meluncurkan 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, ini hanya berfungsi di Internet Explorer, kedua, memerlukan pengaturan keamanan yang sesuai di browser, yang mungkin dilarang di tingkat domain dalam suatu organisasi, dan bahkan jika diizinkan, browser menampilkan jendela dengan jendela yang menakutkan. peringatan kepada pengguna:

Saya menemukan solusi #2 di Internet: Memungkinkan kita untuk meluncurkan aplikasi yang kita butuhkan menggunakan tautan yang menentukan protokol yang kita daftarkan. Windows Di registri, di bawah HKEY_CLASSES_ROOT. Karena SAP GUI Shortcut memiliki subkunci tersendiri di bagian ini, Anda dapat menambahkan parameter string Protokol URL dengan nilai kosong:

Protokol ini dimulai sapgui.exe dengan parameter /JALAN PINTAS, itulah yang kita perlukan:

Ya, atau jika kita ingin membuat protokol yang sepenuhnya sewenang-wenang (misalnya, sapshcut), lalu Anda dapat mendaftarkannya menggunakan file reg berikut:
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""
Sekarang, jika kita membuat link pada halaman web yang menunjukkan protokolnya Sapgui.Pintasan.File Dengan cara yang sama:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
Kita akan melihat jendela seperti ini:

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

Ups, browser mengubah spasi menjadi %20. Dan karakter lain juga akan dikodekan ke dalam kode numerik mereka sendiri dengan tanda persen. Dan bagian terburuknya adalah tidak ada yang dapat Anda lakukan di tingkat browser (semuanya standar di sini)—browser tidak menyukai karakter seperti itu, dan penerjemah perintah juga tidak. Windows tidak berfungsi dengan nilai yang dikodekan seperti itu. Dan kelemahan lainnya adalah seluruh string dilewatkan sebagai parameter, termasuk nama protokol dan bahkan titik dua (sapgui.shortcut.file:). Apalagi meski sama sapshcut.exe dapat membuang segala sesuatu yang bukan merupakan parameternya (dimulai dengan simbol “-“, lalu nama, “=” dan nilai), mis. garis seperti "sapgui.shortcut.file: -system=SID"itu akan tetap berfungsi, lalu tanpa spasi"sapgui.shortcut.file:-system=SID"tidak berfungsi lagi.
Ternyata pada prinsipnya ada dua pilihan untuk menggunakan protokol URI:
- Menggunakan tanpa parameter: Kami membuat sejumlah besar protokol untuk semua jenis sistem kami SIDMANDT, menyukai AAA200, BBB200 dan seterusnya. Jika Anda hanya perlu memulai sistem yang diinginkan, maka opsi ini cukup bisa diterapkan, tetapi dalam kasus kami ini tidak cocok, karena setidaknya Anda ingin mentransfer login pengguna, tetapi ini tidak dapat dilakukan dengan cara ini.
- Menggunakan program pembungkus untuk menelepon sapshcut.exe или sapgui.exeInti dari program ini sederhana - program ini akan mengambil string yang dikirimkan browser melalui protokol web dan mengubahnya menjadi representasi yang diterima. WindowsArtinya, program tersebut mengkonversi semua kode karakter kembali menjadi karakter (mungkin bahkan mengurai string berdasarkan parameter) dan kemudian memanggil SAP GUI dengan perintah yang dijamin benar. Ini tidak sepenuhnya cocok untuk kasus kita (itulah sebabnya saya bahkan tidak repot-repot menulisnya), karena menambahkan protokol ke semua PC pengguna saja tidak cukup (masih oke dalam domain, meskipun sebaiknya dihindari juga). Kita juga perlu menginstal program di PC dan terus memantaunya untuk memastikan program tersebut tetap terpasang saat menginstal ulang perangkat lunak di PC.
Itu. Kami juga membuang opsi ini karena tidak cocok untuk kami.
Pada titik ini saya sudah mulai berpikir bahwa saya harus mengucapkan selamat tinggal pada gagasan meluncurkan SAP GUI dengan parameter yang diperlukan dari browser, tetapi kemudian terlintas di benak saya bahwa Anda dapat membuat pintasan di SAP Logon dan salin ke desktop Anda. Saya pernah menggunakan cara ini satu kali, namun sebelumnya saya tidak secara spesifik melihat file shortcutnya. Dan ternyata shortcut ini adalah file teks biasa dengan ekstensi .getahDan jika Anda menjalankannya di Windows — SAP GUI akan diluncurkan dengan parameter yang ditentukan dalam file ini. "Bingo!"
Format file ini kira-kira sebagai berikut (mungkin juga 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 semua yang diperlukan: pengidentifikasi sistem, klien, nama pengguna, dan bahkan kata sandi. Dan bahkan parameter tambahan: Judul - judul jendela, Ukuran Gui — ukuran jendela yang sedang berjalan (layar penuh atau tidak) dan Reuse — apakah perlu membuka jendela baru atau menggunakan jendela yang sudah terbuka dengan sistem yang sama. Namun nuansa langsung muncul - ternyata password di SAP Logon tidak bisa diatur, salurannya diblokir. Ternyata hal ini dilakukan untuk alasan keamanan: ia menyimpan semua pintasan yang dibuat di SAP Logon dalam sebuah file sapshortcut.ini (Di dekat saplogon.ini di profil pengguna Windows) dan meskipun dienkripsi di sana, enkripsinya tidak terlalu kuat dan dapat didekripsi jika Anda benar-benar menginginkannya. Tetapi Anda juga dapat mengatasi ini dengan mengubah nilai salah satu parameter di registri (nilai defaultnya adalah 0):
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
Ini membuka kunci bidang Kata Sandi untuk entri pada formulir pembuatan pintasan di SAP Logon:

Dan ketika Anda memasukkan kata sandi di bidang ini, kata sandi itu akan ditempatkan di baris yang sesuai
sapshortcut.ini, namun saat Anda menyeret pintasan ke desktop, pintasan tersebut tidak muncul di sana - namun Anda dapat menambahkannya di sana secara manual. Kata sandi dienkripsi, untuk 111111 adalah sebagai berikut: PW_49B02219D1F6, untuk 222222 - PW_4AB3211AD2F5. Namun kami lebih tertarik pada kenyataan bahwa kata sandi ini dienkripsi dengan satu cara, tidak bergantung pada PC tertentu, dan jika kami menyetel ulang kata sandi ke kata sandi awal, maka kami dapat menggunakan satu nilai yang telah diketahui sebelumnya di bidang ini. Nah, jika kita ingin menggunakan kata sandi yang dibuat secara acak, kita harus memahami algoritma sandi ini. Namun dilihat dari contoh yang diberikan, hal ini tidak akan sulit untuk dilakukan. Omong-omong, di SAP GUI 7.40 bidang ini benar-benar hilang dari formulir, tetapi menerima file dengan kata sandi yang diisi dengan benar.
Artinya, ternyata di browser Anda hanya perlu mengklik link ke file dengan ekstensi .sap dan format yang diinginkan - dan browser akan menawarkan untuk membukanya sebagai file seperti SAP GUI Shortcut (tentu saja di PC dengan SAP GUI terinstal) dan akan membuka jendela SAP GUI dengan parameter yang ditentukan (jika pasangan SID dan klien ada dalam daftar SAP Logon di PC ini).
Namun, jelas bahwa tidak ada seorang pun yang akan membuat file terlebih dahulu dan menyimpannya di situs - file tersebut harus dibuat berdasarkan parameter yang diperlukan. Misalnya, Anda dapat membuat skrip 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]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";
?>
Jika Anda tidak menentukan nama pengguna dan kata sandi, Anda akan mendapatkan jendela berikut yang meminta login dan kata sandi:

Jika Anda hanya memasukkan login, kolom login akan terisi dan kolom kata sandi akan kosong. Jika kami memberikan login dan kata sandi kepada pengguna, tetapi pengguna di PC memiliki kunci EnablePassword di registri di bagian [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] disetel ke 0, maka kami mendapatkan hal yang sama. Dan hanya jika kunci ini disetel ke 1 dan kami memberikan nama dan kata sandi awal, sistem akan segera meminta Anda memasukkan kata sandi permanen baru sebanyak dua kali. Itulah yang perlu kami dapatkan.
Hasilnya, kami memiliki serangkaian opsi yang dipertimbangkan 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 cocok untuk saya. Namun alih-alih membuat pintasan SAP, Anda juga dapat menggunakan, misalnya, membuat file CMD, yang jika dibuka dari browser, juga akan membuka jendela SAP GUI untuk Anda. Di bawah ini adalah contohnya (sapguicmd.php) langsung meluncurkan SAP GUI dengan string koneksi lengkap, tanpa perlu 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 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";
?>
Sumber: www.habr.com
