Εκκίνηση του SAP GUI από ένα πρόγραμμα περιήγησης

Πρώτα έγραψα αυτό το άρθρο στο δικό μου blog, για να μην ψάξω και θυμηθώ ξανά αργότερα, αλλά επειδή κανείς δεν διαβάζει το blog, ήθελα να μοιραστώ αυτές τις πληροφορίες με όλους, σε περίπτωση που κάποιος τις βρει χρήσιμες.

Ενώ εργάζεστε για την ιδέα μιας υπηρεσίας επαναφοράς κωδικού πρόσβασης στα συστήματα SAP R/3, προέκυψε ένα ερώτημα - πώς να ξεκινήσετε το SAP GUI με τις απαραίτητες παραμέτρους από το πρόγραμμα περιήγησης; Δεδομένου ότι αυτή η ιδέα συνεπαγόταν τη χρήση μιας υπηρεσίας web, πρώτα ανταποκρίνεται σε ένα αίτημα SOAP από το SAP GUI και στέλνει ένα email με έναν σύνδεσμο σε μια ιστοσελίδα με ένα σενάριο για την επαναφορά του κωδικού πρόσβασης στον αρχικό και στη συνέχεια εμφάνιση στον χρήστη ένα μήνυμα σχετικά με την επιτυχή επαναφορά του κωδικού πρόσβασης και την εμφάνιση αυτού του αρχικού κωδικού πρόσβασης , τότε θα ήθελα αυτή η σελίδα να έχει επίσης έναν σύνδεσμο για την εκκίνηση του 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 έχει τη δική της υποενότητα σε αυτήν την ενότητα, μπορείτε να προσθέσετε την παράμετρο συμβολοσειράς πρωτοκόλλου URL με μια κενή τιμή εκεί:

Εκκίνηση του SAP GUI από ένα πρόγραμμα περιήγησης

Αυτό το πρωτόκολλο ξεκινά sapgui.exe με παράμετρο /ΣΥΝΤΟΜΟΤΕΡΟΣ ΤΡΟΠΟΣ, το οποίο ακριβώς χρειαζόμαστε:

Εκκίνηση του SAP GUI από ένα πρόγραμμα περιήγησης

Λοιπόν, ή αν θέλουμε να φτιάξουμε ένα εντελώς αυθαίρετο πρωτόκολλο (για παράδειγμα, sapshcut), στη συνέχεια μπορείτε να το καταχωρήσετε χρησιμοποιώντας το ακόλουθο αρχείο 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, ΒΒΒ200 και ούτω καθεξής. Εάν χρειάζεται απλώς να ξεκινήσετε το επιθυμητό σύστημα, τότε η επιλογή είναι αρκετά εφαρμόσιμη, αλλά στην περίπτωσή μας δεν είναι κατάλληλη, αφού τουλάχιστον θα θέλατε να μεταφέρετε τη σύνδεση χρήστη, αλλά αυτό δεν μπορεί να γίνει με αυτόν τον τρόπο.
  2. Χρήση προγράμματος περιτυλίγματος για κλήση sapshcut.exe ή sapgui.exe. Η ουσία αυτού του προγράμματος είναι απλή - πρέπει να πάρει τη συμβολοσειρά που του μεταδίδει το πρόγραμμα περιήγησης μέσω του πρωτοκόλλου web και να τη μετατρέψει στην αναπαράσταση που λαμβάνουν τα 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 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 σε αυτόν τον υπολογιστή).

Αλλά, είναι σαφές ότι κανείς δεν θα δημιουργήσει απλά αρχεία εκ των προτέρων και θα τα αποθηκεύσει στον ιστότοπο - πρέπει να δημιουργηθούν με βάση τις απαραίτητες παραμέτρους. Για παράδειγμα, μπορείτε να δημιουργήσετε ένα σενάριο 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

Προσθέστε ένα σχόλιο