بدء SAP GUI من المستعرض

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

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



حفرت الحل رقم 2 على الإنترنت: إنشاء بروتوكول الويب الخاص بي . يتيح لك تشغيل التطبيق الذي نحتاج إليه باستخدام الرابط الذي يشير إلى البروتوكول الذي نسجله نحن أنفسنا في Windows في السجل في قسم HKEY_CLASSES_ROOT. نظرًا لأن اختصار SAP GUI في هذا القسم له القسم الفرعي الخاص به ، يمكنك إضافة معلمة سلسلة بروتوكول URL بقيمة فارغة:



يقوم هذا البروتوكول بتشغيل sapgui.exe باستخدام المعلمة / SHORTCUT ، وهو ما نحتاجه:



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

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

الآن ، إذا قمنا بإنشاء رابط على صفحة الويب يشير إلى بروتوكول Sapgui.Shortcut.File بطريقة مماثلة:

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

يجب أن نرى نافذة مثل:



يبدو أن كل شيء على ما يرام ، ولكن عند النقر فوق الزر "سماح" ، نرى:



عفوًا ، حوّل المستعرض المساحة إلى 20٪. حسنًا ، سيتم أيضًا ترميز الأحرف الأخرى في رمزها الرقمي برمز النسبة المئوية. والشيء الأكثر سوءًا هو أنه لا يمكن القيام بأي شيء هنا على مستوى المتصفح (كل شيء يتم وفقًا للمعايير) - لا يحب المتصفح مثل هذه الأحرف ، ولا يعمل Windows shell مع هذه القيم المشفرة. ونقطة أخرى - يتم تمرير السلسلة بالكامل كمعلمة ، بما في ذلك اسم البروتوكول وحتى النقطتين ( sapgui.shortcut.file :) . علاوة على ذلك ، على الرغم من أن نفس sapshcut.exe يمكن أن يتجاهل كل شيء ليس معلمة له (يبدأ بالرمز "-" ، ثم الاسم ، "=" والقيمة) ، أي لا يزال سطر من النموذج " sapgui.shortcut.file: -system = SID " قائما ، ثم بدون مساحة " sapgui.shortcut.file: -system = SID " لا يعمل بعد الآن.

اتضح ، من حيث المبدأ ، أن هناك خيارين لاستخدام بروتوكول URI:

  1. الاستخدام بدون معلمات: نقوم بإنشاء مجموعة كاملة من البروتوكولات لجميع أنظمتنا من نوع SIDMANDT ، مثل AAA200 ، BBB200 ، إلخ. إذا كنت بحاجة فقط إلى بدء تشغيل النظام المرغوب فيه ، فإن الخيار يعمل تمامًا ، ولكن في حالتنا لا يعمل ، لأنك على الأقل تريد نقل تسجيل دخول المستخدم أيضًا ، لكن لا يمكنك القيام بذلك بهذه الطريقة.
  2. باستخدام غلاف للاتصال sapshcut.exe أو sapgui.exe . إن جوهر هذا البرنامج بسيط - يجب أن يأخذ الخط الذي سينقله المستعرض إليه عبر بروتوكول الويب ويحوله إلى تمثيل يقبله Windows ، أي رجوع يحول جميع رموز الأحرف إلى أحرف (ربما حتى يوزع السلسلة حسب المعلمات) ويستدعي بالفعل SAP GUI التي يضمنها الأمر الصحيح. في حالتنا ، لا يتناسب هذا الأمر تمامًا (لذلك ، لم أقم حتى بكتابته) ، لأنه لا يكفي أن نضيف بروتوكولًا على جميع أجهزة كمبيوتر المستخدمين (داخل المجال ، لا يزال هذا غير مفيد ، على الرغم من أنه من الأفضل تجنب هذه الممارسة) ، لكن سيكون من الضروري بالإضافة إلى ذلك ضع البرنامج على جهاز كمبيوتر ، وقم بمراقبته باستمرار حتى لا يختفي عند إعادة تثبيت البرنامج على جهاز الكمبيوتر.

أي تم تجاهل هذا الخيار أيضًا باعتباره غير مناسب لنا.

بعد ذلك بدأت أعتقد أنه يجب علي أن أودع فكرة بدء SAP GUI بالمعلمات الضرورية من المستعرض ، لكن بعد ذلك حصلت على فكرة أنه يمكنك إنشاء اختصار في SAP Logon ونسخه إلى سطح المكتب. استخدمت هذه الطريقة مرة واحدة ، لكن قبل ذلك لم ألق نظرة على ملف الاختصار على وجه التحديد. واتضح أن هذا الاختصار هو ملف نص عادي مع التمديد .sap . وإذا قمت بتشغيله على 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_USER\Software\SAP\SAPShortcut\Security]
"EnablePassword"="1"

يؤدي هذا إلى إلغاء قفل حقل كلمة المرور في نموذج الاختصار في SAP Logon للدخول:



وعند إدخال كلمة مرور في هذا الحقل ، سيتم وضعها في السطر المقابل
sapshortcut.ini ، ولكن عندما تقوم بسحب اختصار إلى سطح المكتب ، لا يظهر هناك - ولكن يمكنك إضافته هناك يدويًا. يتم تشفير كلمة المرور ، حيث ستكون 111111 بالشكل التالي: PW_49B02219D1F6 ، على 222222 - PW_4AB3211AD2F5. لكننا مهتمون أكثر بحقيقة أن كلمة المرور هذه يتم تشفيرها بطريقة مستقلة عن جهاز الكمبيوتر المحدد ، وإذا قمنا بإعادة تعيين كلمة المرور إلى كلمة المرور الأولية ، فيمكننا استخدام قيمة واحدة معروفة مسبقًا في هذا الحقل. حسنًا ، إذا أردنا استخدام كلمة مرور تم إنشاؤها عشوائيًا ، فسوف يتعين علينا فهم خوارزمية هذا التشفير. لكن إذا حكمنا من خلال الأمثلة المذكورة أعلاه ، فإن هذا لن يكون صعباً. بالمناسبة ، في SAP GUI 7.40 ، اختفى هذا الحقل عمومًا من النموذج ، لكنه يتصور الملف بكلمة مرور ممتلئة بشكل صحيح.

بمعنى أنه ، في المتصفح ، يكفي النقر على رابط الملف مع ملحق .sap وبتنسيق مرغوب - وسيعرض عليه فتحه كملف من نوع اختصار SAP GUI (بشكل طبيعي على جهاز كمبيوتر مثبت عليه 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]\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"; ?> 

إذا لم تحدد اسم مستخدم وكلمة مرور ، فسنحصل على النافذة التالية من مطالبات تسجيل الدخول وكلمة المرور:



إذا قمت بنقل تسجيل الدخول فقط ، فسيتم ملء حقل تسجيل الدخول ، ويكون حقل كلمة المرور فارغًا. إذا قدمنا ​​للمستخدم اسم المستخدم وكلمة المرور ، ولكن تم تعيين مفتاح EnablePassword الخاص بالمستخدم في المقطع [HKEY_CURRENT_USER \ Software \ SAP \ SAPShortcut \ Security] إلى 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 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/ar446998/


All Articles