Dit artikel heb ik in eerste instantie geschreven voor mijn , zodat ik het later niet weer hoefde te zoeken en herinneren, maar omdat niemand de blog leest, wilde ik deze informatie met iedereen delen, misschien heeft iemand er wat aan.
Tijdens het werken aan het idee voor een service voor het resetten van wachtwoorden in SAP R/3 ontstond de vraag — hoe start je SAP GUI met de juiste parameters vanuit de browser? Aangezien in dit idee gebruik werd gemaakt van een webservice die eerst een SOAP-verzoek vanuit SAP GUI verwerking en vervolgens een e-mail met een link naar de webpagina met het script voor het resetten van het wachtwoord op het startscherm verstuurt, en daarna de gebruiker het bericht toont dat het wachtwoord met succes is gereset en het startwachtwoord toont, wilden we dat deze pagina ook een link bevatte om SAP GUI te starten. Bovendien moest deze link de juiste systeem starten, bij voorkeur met al ingevulde velden voor gebruikersnaam en wachtwoord: de gebruiker zou alleen maar twee keer het productiewachtwoord hoeven in te vullen.
Het starten van SAP Logon was voor ons doel niet interessant, en bij het starten van sapgui.exe was het niet mogelijk om een mandant en gebruikersnaam op te geven, maar het was wel mogelijk om een systeem te starten dat niet in SAP Logon was gedefinieerd. Aan de andere kant was het starten van SAP GUI met willekeurige serverparameters niet echt relevant: als we het probleem van het resetten van een gebruikerswachtwoord oplossen, heeft de gebruiker waarschijnlijk al de benodigde regel in SAP Logon, met de vereiste instellingen, en is het niet nodig om met onze instellingen te komen. De technologie SAP GUI Shortcut en het programma sapshcut.exe voldeden echter aan de gestelde eisen, waarmee SAP GUI met behulp van een specifieke 'snelkoppeling' kon worden gestart.
Een rechttoe rechtaan oplossing: sapshcut.exe rechtstreeks vanuit de browser starten met behulp van een ActiveX-object:
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');
}
De oplossing is slecht: ten eerste werkt het alleen in Internet Explorer, ten tweede vereist het de juiste beveiligingsinstellingen in de browser, die binnen de organisatie op het domeinniveau mogelijk zijn verboden, en zelfs als ze zijn toegestaan, geeft de browser de gebruiker een venster met een angstaanjagende waarschuwing:

Oplossing #2 vond ik op internet: Het maakt het mogelijk om de gewenste applicatie te starten via een link met een protocol dat we zelf registreren in Windows in de registersectie HKEY_CLASSES_ROOT. Aangezien SAP GUI Shortcut een eigen subsectie in deze sectie heeft, kunnen we daar het stringparameter URL Protocol met een lege waarde toevoegen:

Dit protocol start sapgui.exe met de parameter /SHORTCUT, wat we eigenlijk willen:

Of als we een geheel willekeurig protocol willen maken (bijvoorbeeld, sapshcut), dan kan het met behulp van het volgende reg-bestand worden geregistreerd:
Windows Register-editor Versie 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""
Nu, als we op een webpagina een link met een protocolspecificatie maken Sapgui.Shortcut.File op een vergelijkbare manier:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
zou een venster zoals dit moeten verschijnen:

En het lijkt geweldig, maar als we op de knop 'Toestaan' klikken, zien we:

Oeps, de browser heeft de spatie omgezet in . Andere symbolen worden ook gecodeerd naar hun numerieke code met een percentage. En het vervelendste is dat hier niets kan worden gedaan op het niveau van de browser (dit is allemaal volgens de standaard gedaan) — de browser houdt niet van dergelijke symbolen, en de opdrachtinterpreter van Windows werkt niet met zulke gecodeerde waarden. Nog een nadeel is dat de hele string wordt doorgegeven als parameter, inclusief de protocolnaam en zelfs de dubbele punt (:sapgui.shortcut.file:). En hoewel dezelfde sapshcut.exe alleen de parameters afsnijdt (begint met het teken '-‘, dan de naam, '=’ en de waarde), dat wil zeggen, een string zoals 'sapgui.shortcut.file: -system=SID‘ zou nog werken, maar zonder spatie ‘sapgui.shortcut.file:-system=SID‘ werkt het al niet meer.
In principe zijn er dus twee opties voor het gebruik van het URI-protocol:
- Gebruik zonder parameters: We creëren een heleboel protocollen voor al onze systemen van het type SIDMANDT, zoals AAA200, BBB200 enzovoort. Als we gewoon het gewenste systeem willen starten, is deze optie prima, maar in ons geval is het niet geschikt, omdat we zelfs de gebruikersnaam willen doorgeven, en dat is op deze manier niet mogelijk.
- Gebruik van een wrapperprogramma voor aanroep sapshcut.exe of sapgui.exeDe essentie van dit programma is eenvoudig: het moet de string die de browser via het webprotocol doorgeeft, nemen en deze omzetten naar de representatie die Windows accepteert, dat wil zeggen, het zet alle tekencodes terug naar symbolen (het kan de string zelfs op parameters splitsen) en roept vervolgens de SAP GUI aan met de gegarandeerd correcte opdracht. In ons geval is dit ook niet helemaal passend (daarom heb ik het ook niet opgeschreven), omdat we al niet genoeg hebben aan het toevoegen van een protocol op alle gebruikers-PC's (binnen het domein is het nog acceptabel, hoewel het ook beter is om dergelijke praktijken te vermijden), maar hier zal het nog nodig zijn om een extra programma op de PC te plaatsen, en bovendien voortdurend in de gaten te houden dat het niet verdwijnt bij softwareherinstallaties op de PC.
Dus deze optie laten we ook vallen als ongeschikt.
Hier begon ik al te denken dat ik de idee om de SAP GUI met de benodigde parameters vanuit de browser te starten, moest opgeven, maar toen kreeg ik het idee dat je in SAP Logon een snelkoppeling kunt maken die je op het bureaublad kunt kopiëren. Ik heb deze manier ooit gebruikt, maar had de snelkoppelingsbestand daarvoor niet speciaal bekeken. Het bleek dat deze snelkoppeling een normaal tekstbestand is met de extensie .sap. En als je dit in Windows opent, start de SAP GUI met de parameters die in dit bestand zijn opgegeven. "Bingo!"
Het formaat van dit bestand is ongeveer als volgt (er kan ook een uitvoerbare transactie bij de opstart zijn, maar die heb ik weggelaten):
[System]
Naam=SID
Klant=200
[User]
Naam=
Taal=RU
Wachtwoord=
[Function]
Titel=
[Configuration]
GuiGrootte=Maximized
[Options]
Herbruik=0
Blijkbaar is alles wat nodig is aanwezig: het systeem-ID, de mandant, de gebruikersnaam en zelfs het wachtwoord. En zelfs extra parameters: Titel – het venstertitel, GuiSize – de grootte van het geopende venster (volledig scherm of niet) en Reuse – of er altijd een nieuw venster geopend moet worden of dat een reeds geopend venster met dit systeem gebruikt kan worden. Maar er kwam meteen een nuance naar voren – het bleek dat het niet mogelijk was om een wachtwoord in SAP Logon in te stellen, het veld was geblokkeerd. Het bleek dat dit is gedaan vanuit veiligheidsredenen: alle snelkoppelingen die in SAP Logon zijn gemaakt, worden opgeslagen in het bestand sapshortcut.ini (naast saplogon.ini in het Windows-gebruikersprofiel) en daar zijn ze, ook al zijn ze versleuteld, niet al te sterk beschermd en met de nodige inspanning kunnen ze worden ontcijferd. Maar je kunt het ook toestaan door de waarde van een parameter in het register te wijzigen (standaard is de waarde 0):
Windows Register-editor Versie 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"
Dit ontgrendelt het invoerveld "Wachtwoord" op het formulier voor het maken van snelkoppelingen in SAP Logon:

Wanneer u een wachtwoord in dit veld invoert, zal het worden weergegeven in de overeenkomstige regel.
sapshortcut.ini, maar als u het snelkoppeling naar het bureaublad sleept, verschijnt het daar niet — maar u kunt het handmatig toevoegen. Het wachtwoord is versleuteld; voor 111111 zal het er als volgt uitzien: PW_49B02219D1F6, voor 222222 — PW_4AB3211AD2F5. Maar we zijn vooral geïnteresseerd in het feit dat dit wachtwoord op dezelfde manier wordt versleuteld, onafhankelijk van de specifieke pc, en als we het wachtwoord naar de standaardwaarde willen resetten, kunnen we in dit veld een vooraf bekend waarde gebruiken. Maar als we een willekeurig aangemaakt wachtwoord willen gebruiken — dan moeten we het algoritme van deze versleuteling begrijpen. Maar, gezien de gegeven voorbeelden, zal dat niet moeilijk zijn. Trouwens, in SAP GUI 7.40 is dit veld helemaal verdwenen van het formulier, maar het bestand met het ingevulde wachtwoord wordt correct herkend.
Het betekent dat het in de browser voldoende is om op de link naar het bestand met de extensie .sap te klikken en in het gewenste formaat — en het zal voorstellen om het te openen als een bestandstype SAP GUI Shortcut (natuurlijk op een pc met geïnstalleerde SAP GUI) en het opent ons het SAP GUI-venster met de opgegeven parameters (als de combinatie van SID en mandant in de lijst SAP Logon op deze pc staat).
Maar het is duidelijk dat niemand van tevoren bestanden zal aanmaken en opslaan op de site — ze moeten worden gegenereerd op basis van de benodigde parameters. Bijvoorbeeld, je kunt een script in PHP maken om snelkoppelingen te genereren (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=Login in het systeemrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>
Als er geen gebruikersnaam en wachtwoord is opgegeven, krijgen we het volgende venster met de verzoeken om inloginformatie:

Als je alleen de gebruikersnaam doorgeeft, wordt het veld gebruikersnaam ingevuld, terwijl het wachtwoordveld leeg blijft. Als we zowel de gebruikersnaam als het wachtwoord doorgeven, maar de sleutel EnablePassword in het register van de gebruiker op de pc is ingesteld op 0 in [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity], dan verkrijgen we hetzelfde resultaat. Pas als deze sleutel op 1 is ingesteld en we zowel de gebruikersnaam als het initiële wachtwoord doorgeven, vraagt het systeem om het nieuwe permanente wachtwoord twee keer in te voeren. Dit was wat we wilden bereiken.
Uiteindelijk hebben we de volgende set van overwegingen als illustratie van het bovenstaande:
<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', '');"/>Voorbeeld 1: Voer sapshcut.exe uit (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Voorbeeld 2: Open sapshcut.exe (URI)</a><br>
<a href='/nl/sapshcut.php/?SID=SID&Client=200&User=test'>Voorbeeld 3: Open bestand .sap (SAP GUI-Snelkoppeling)</a><br>
</body>
</html>
De laatste optie werkte voor mij. Maar in plaats van het genereren van SAP-snelkoppelingen, kan je bijvoorbeeld CMD-bestanden genereren, die ook, wanneer geopend vanuit de browser, het SAP GUI-venster openen. Hieronder een voorbeeld (sapguicmd.php) van directe uitvoering van SAP GUI met de volledige verbindingsreeks, zonder dat je een geconfigureerde SAP Logon nodig hebt:
<?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 Inloggen op ".$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";
?>
Bron: habr.com
