إطلاق SAP GUI من المتصفح

لقد كتبت هذا المقال لأول مرة في بلدي بلوق، حتى لا أقوم بالبحث والتذكر مرة أخرى لاحقًا، ولكن بما أنه لا أحد يقرأ المدونة، أردت مشاركة هذه المعلومات مع الجميع، في حال وجدها شخص ما مفيدة.

أثناء العمل على فكرة خدمة إعادة تعيين كلمة المرور في أنظمة SAP R/3، ظهر سؤال - كيفية تشغيل SAP GUI باستخدام المعلمات الضرورية من المتصفح؟ نظرًا لأن هذه الفكرة تتضمن استخدام خدمة ويب، يجب أولاً الاستجابة لطلب SOAP من واجهة المستخدم الرسومية لـ SAP وإرسال خطاب يتضمن رابطًا إلى صفحة ويب مع برنامج نصي لإعادة تعيين كلمة المرور إلى كلمة المرور الأولية، ثم عرضها للمستخدم رسالة حول إعادة تعيين كلمة المرور بنجاح وعرض كلمة المرور الأولية هذه، ثم أود أن تحتوي هذه الصفحة أيضًا على رابط لتشغيل 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 من المتصفح

حسنًا، أو إذا أردنا إنشاء بروتوكول تعسفي تمامًا (على سبيل المثال، com.sapshcut)، ثم يمكنك تسجيله باستخدام ملف التسجيل التالي:

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 و انسخه إلى سطح المكتب الخاص بك. لقد استخدمت هذه الطريقة مرة واحدة، ولكن قبل ذلك لم ألقي نظرة على ملف الاختصار على وجه التحديد. واتضح أن هذا الاختصار عبارة عن ملف نصي عادي بامتداد .العصارة. وإذا قمت بتشغيله على نظام التشغيل Windows، فسيتم تشغيل SAP GUI باستخدام المعلمات المحددة في هذا الملف. "البنغو!"

تنسيق هذا الملف هو ما يلي تقريبًا (قد تكون هناك أيضًا معاملة تم إطلاقها عند بدء التشغيل، لكنني حذفتها):

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

يبدو أن كل ما هو مطلوب: معرف النظام والعميل واسم المستخدم وحتى كلمة المرور. وحتى المعلمات الإضافية: عنوان الاعلان - عنوان النافذة، GuiSize — حجم النافذة قيد التشغيل (ملء الشاشة أم لا) و إعادة استخدام — ما إذا كان من الضروري فتح نافذة جديدة أو استخدام نافذة مفتوحة بالفعل بنفس النظام. ولكن ظهرت على الفور فارق بسيط - اتضح أنه لا يمكن تعيين كلمة المرور في تسجيل الدخول إلى SAP، وتم حظر الخط. اتضح أن هذا تم لأسباب أمنية: فهو يخزن جميع الاختصارات التي تم إنشاؤها في 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 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";
?>

المصدر: www.habr.com

إضافة تعليق