การเปิดตัว SAP GUI จากเบราว์เซอร์

ฉันเขียนบทความนี้ครั้งแรกในของฉัน บล็อกเพื่อไม่ให้ค้นหาแล้วจำอีกในภายหลังแต่เนื่องจากไม่มีใครอ่านบล็อกจึงอยากแบ่งปันข้อมูลนี้กับทุกคนเผื่อมีคนเห็นว่ามีประโยชน์

ในขณะที่ทำงานเกี่ยวกับแนวคิดของบริการรีเซ็ตรหัสผ่านในระบบ SAP R/3 มีคำถามเกิดขึ้น - จะเปิด SAP GUI ด้วยพารามิเตอร์ที่จำเป็นจากเบราว์เซอร์ได้อย่างไร เนื่องจากแนวคิดนี้บ่งบอกถึงการใช้บริการเว็บ ขั้นแรกให้ตอบกลับคำขอ SOAP จาก SAP GUI และส่งจดหมายพร้อมลิงก์ไปยังหน้าเว็บพร้อมสคริปต์เพื่อรีเซ็ตรหัสผ่านเป็นรหัสผ่านเริ่มต้น จากนั้นจึงแสดงให้ผู้ใช้เห็น ข้อความเกี่ยวกับการรีเซ็ตรหัสผ่านสำเร็จและการแสดงรหัสผ่านเริ่มต้นนี้ ฉันต้องการให้หน้านี้มีลิงก์สำหรับเปิดใช้ SAP GUI นอกจากนี้ ลิงก์นี้ควรเปิดระบบที่ต้องการ และควรกรอกช่องเข้าสู่ระบบและรหัสผ่านพร้อมกัน: ผู้ใช้จะต้องกรอกรหัสผ่านที่ใช้งานจริงสองครั้งเท่านั้น

การเปิดตัว SAP Logon นั้นไม่น่าสนใจสำหรับจุดประสงค์ของเรา และเมื่อรัน sapgui.exe มันเป็นไปไม่ได้ที่จะระบุไคลเอนต์และชื่อผู้ใช้ แต่เป็นไปได้ที่จะเปิดตัวระบบที่ไม่ได้กำหนดไว้ใน SAP Logon ในทางกลับกันการเปิดตัว SAP GUI ด้วยพารามิเตอร์เซิร์ฟเวอร์ที่กำหนดเองนั้นไม่เกี่ยวข้องเป็นพิเศษ: หากเรากำลังแก้ไขปัญหาในการรีเซ็ตรหัสผ่านของผู้ใช้เป็นไปได้มากว่าเขามีบรรทัดที่จำเป็นใน SAP Logon อยู่แล้วพร้อมการตั้งค่าที่เขาต้องการและมี ไม่จำเป็นต้องไปยุ่งกับเรื่องของตัวเอง แต่เทคโนโลยีทางลัด SAP GUI และโปรแกรม 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 จากเบราว์เซอร์

หรือถ้าเราต้องการสร้างโปรโตคอลโดยพลการอย่างสมบูรณ์ (เช่น แซปช์คัท) จากนั้นคุณสามารถลงทะเบียนได้โดยใช้ไฟล์ 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. การใช้โปรแกรม wrapper ในการโทร 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 ไว้ในไฟล์ sapshortcut.ini (ใกล้ saplogon.ini ในโปรไฟล์ผู้ใช้ Windows) และถึงแม้ว่าจะถูกเข้ารหัส แต่ก็ไม่ได้เข้ารหัสอย่างแน่นหนาเกินไปและสามารถถอดรหัสได้หากต้องการ แต่คุณสามารถแก้ไขได้โดยการเปลี่ยนค่าของพารามิเตอร์หนึ่งรายการในรีจิสทรี (ค่าเริ่มต้นคือ 0):

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

สิ่งนี้จะปลดล็อคฟิลด์รหัสผ่านสำหรับการป้อนในแบบฟอร์มการสร้างทางลัดในการเข้าสู่ระบบ SAP:

การเปิดตัว SAP GUI จากเบราว์เซอร์

และเมื่อคุณป้อนรหัสผ่านในช่องนี้ รหัสนั้นจะอยู่ในบรรทัดที่เกี่ยวข้อง
sapshortcut.iniแต่เมื่อคุณลากทางลัดไปยังเดสก์ท็อป ทางลัดนั้นจะไม่ปรากฏที่นั่น - แต่คุณสามารถเพิ่มทางลัดลงไปที่นั่นได้ด้วยตนเอง รหัสผ่านถูกเข้ารหัสสำหรับ 111111 จะเป็นดังนี้: PW_49B02219D1F6 สำหรับ 222222 - PW_4AB3211AD2F5 แต่เราสนใจมากกว่าว่ารหัสผ่านนี้ได้รับการเข้ารหัสด้วยวิธีเดียว โดยไม่ขึ้นอยู่กับพีซีเฉพาะ และหากเรารีเซ็ตรหัสผ่านเป็นรหัสผ่านเริ่มต้น เราก็สามารถใช้ค่าที่รู้จักล่วงหน้าหนึ่งค่าในฟิลด์นี้ ถ้าเราต้องการใช้รหัสผ่านที่สร้างขึ้นแบบสุ่ม เราจะต้องเข้าใจอัลกอริธึมของรหัสนี้ แต่การตัดสินจากตัวอย่างที่ให้มาก็ทำได้ไม่ยาก อย่างไรก็ตามใน SAP GUI 7.40 ฟิลด์นี้หายไปจากแบบฟอร์มโดยสิ้นเชิง แต่ยอมรับไฟล์ที่กรอกรหัสผ่านอย่างถูกต้อง

นั่นคือปรากฎว่าในเบราว์เซอร์คุณเพียงแค่ต้องคลิกลิงก์ไปยังไฟล์ที่มีนามสกุล .sap และรูปแบบที่ต้องการ - และจะเสนอให้เปิดเป็นไฟล์เช่น SAP GUI Shortcut (โดยธรรมชาติบนพีซี เมื่อติดตั้ง 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";
?>

ที่มา: will.com

เพิ่มความคิดเห็น