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

Βρήκα τη λύση #2 στο Διαδίκτυο: Μας επιτρέπει να εκκινήσουμε την εφαρμογή που χρειαζόμαστε χρησιμοποιώντας έναν σύνδεσμο που καθορίζει το πρωτόκολλο στο οποίο εγγράφουμε τους εαυτούς μας. Windows Στο μητρώο, στην ενότητα HKEY_CLASSES_ROOT. Δεδομένου ότι η συντόμευση SAP GUI έχει το δικό της δευτερεύον κλειδί σε αυτήν την ενότητα, μπορείτε να προσθέσετε την παράμετρο συμβολοσειράς URL Protocol με μια κενή τιμή:

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

Λοιπόν, ή αν θέλουμε να φτιάξουμε ένα εντελώς αυθαίρετο πρωτόκολλο (για παράδειγμα, 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>
Θα πρέπει να δούμε ένα παράθυρο σαν αυτό:

Και όλα φαίνονται υπέροχα, αλλά όταν κάνετε κλικ στο κουμπί "Να επιτρέπεται" βλέπουμε:

Ωχ, το πρόγραμμα περιήγησης μετέτρεψε το κενό σε %20. Και άλλοι χαρακτήρες θα κωδικοποιηθούν επίσης στον δικό τους αριθμητικό κώδικα με το σύμβολο του ποσοστού. Και το χειρότερο είναι ότι δεν μπορείτε να κάνετε τίποτα γι' αυτό σε επίπεδο προγράμματος περιήγησης (όλα είναι τυπικά εδώ) - το πρόγραμμα περιήγησης δεν συμπαθεί τέτοιους χαρακτήρες, και ο διερμηνέας εντολών δεν συμπαθεί. Windows δεν λειτουργεί με τέτοιες κωδικοποιημένες τιμές. Και ένα άλλο μειονέκτημα είναι ότι ολόκληρη η συμβολοσειρά διαβιβάζεται ως παράμετρος, συμπεριλαμβανομένου του ονόματος πρωτοκόλλου, ακόμη και της άνω και κάτω τελείας (sapgui.shortcut.file:). Επιπλέον, αν και το ίδιο sapshcut.exe μπορεί να απορρίψει οτιδήποτε δεν αποτελεί παράμετρο γι 'αυτό (ξεκινά με το σύμβολο "-", μετά το όνομα, "=" και τιμή), π.χ. μια γραμμή όπως "sapgui.shortcut.file: -system=SID"Θα λειτουργεί ακόμα, τότε χωρίς χώρο"sapgui.shortcut.file:-system=SID«δεν λειτουργεί πλέον.
Αποδεικνύεται ότι, κατ 'αρχήν, υπάρχουν δύο επιλογές για τη χρήση του πρωτοκόλλου URI:
- Χρήση χωρίς παραμέτρους: Δημιουργούμε μια ολόκληρη δέσμη πρωτοκόλλων για όλα τα συστήματα του τύπου μας ΣΙΔΜΑΝΤ, σαν AAA200, ΒΒΒ200 και ούτω καθεξής. Εάν χρειάζεται απλώς να ξεκινήσετε το επιθυμητό σύστημα, τότε η επιλογή είναι αρκετά εφαρμόσιμη, αλλά στην περίπτωσή μας δεν είναι κατάλληλη, αφού τουλάχιστον θα θέλατε να μεταφέρετε τη σύνδεση χρήστη, αλλά αυτό δεν μπορεί να γίνει με αυτόν τον τρόπο.
- Χρήση προγράμματος περιτυλίγματος για κλήση sapshcut.exe ή sapgui.exeΗ ουσία αυτού του προγράμματος είναι απλή - θα πρέπει να πάρει τη συμβολοσειρά που του στέλνει το πρόγραμμα περιήγησης μέσω του πρωτοκόλλου ιστού και να τη μετατρέψει στην αναπαράσταση που γίνεται αποδεκτή. Windows, δηλαδή, μετατρέπει όλους τους κωδικούς χαρακτήρων ξανά σε χαρακτήρες (ίσως ακόμη και να αναλύσει τη συμβολοσειρά με παραμέτρους) και στη συνέχεια καλεί το SAP GUI με μια εντολή guaranteed-to-be-correct. Αυτό δεν είναι απολύτως κατάλληλο για την περίπτωσή μας (γι' αυτό δεν μπήκα καν στον κόπο να το γράψω), επειδή η προσθήκη του πρωτοκόλλου σε όλους τους υπολογιστές χρηστών δεν είναι αρκετή (είναι ακόμα εντάξει μέσα σε έναν τομέα, αν και είναι επίσης καλύτερο να αποφεύγουμε αυτήν την πρακτική). Θα χρειαστεί επίσης να εγκαταστήσουμε το πρόγραμμα στον υπολογιστή και να το παρακολουθούμε συνεχώς για να διασφαλίσουμε ότι παραμένει στη θέση του κατά την επανεγκατάσταση λογισμικού στον υπολογιστή.
Εκείνοι. Επίσης, απορρίπτουμε αυτήν την επιλογή ως ακατάλληλη για εμάς.
Σε αυτό το σημείο είχα ήδη αρχίσει να σκέφτομαι ότι θα έπρεπε να αποχαιρετήσω την ιδέα της εκκίνησης του 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 v χρήστη προφίλ Windows) και παρόλο που είναι κρυπτογραφημένα εκεί, δεν είναι πολύ έντονα κρυπτογραφημένα και μπορούν να αποκρυπτογραφηθούν αν πραγματικά θέλετε. Αλλά μπορείτε επίσης να λύσετε αυτό το πρόβλημα αλλάζοντας την τιμή μιας παραμέτρου στο μητρώο (η προεπιλεγμένη τιμή είναι 0):
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
Αυτό ξεκλειδώνει το πεδίο Κωδικός πρόσβασης για εισαγωγή στη φόρμα δημιουργίας συντόμευσης στο SAP Logon:

Και όταν εισάγετε έναν κωδικό πρόσβασης σε αυτό το πεδίο, θα τοποθετηθεί στην αντίστοιχη γραμμή
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";
?>
Εάν δεν καθορίσετε όνομα χρήστη και κωδικό πρόσβασης, θα εμφανιστεί το ακόλουθο παράθυρο που θα σας ζητά τη σύνδεση και τον κωδικό πρόσβασης:

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