Ejecutar SAP GUI desde el navegador

Escribí este artículo primero para mí mismo blog, para no tener que buscarlo y recordarlo de nuevo, pero como nadie lee el blog, quise compartir esta información con todos, por si acaso le sirva a alguien.

Mientras trabajaba en la idea de un servicio para restablecer contraseñas en sistemas SAP R/3 surgió la pregunta: ¿cómo ejecutar SAP GUI con los parámetros necesarios desde el navegador? Dado que esta idea implica el uso de un servicio web que primero trabajaría a través de una solicitud SOAP desde SAP GUI y enviaría un correo con un enlace a la página web con el script de restablecimiento de contraseña al inicio, y luego mostrar al usuario un mensaje de éxito en el restablecimiento de contraseña y mostrar la contraseña inicial, quería que esta página también tuviera un enlace para abrir SAP GUI. Además, ese enlace debería abrir el sistema adecuado, preferiblemente con los campos de nombre de usuario y contraseña ya llenos: así, al usuario solo le quedaría introducir la contraseña productiva dos veces.

El inicio de SAP Logon no era interesante para nuestro propósito, y al ejecutar sapgui.exe no se podía especificar el mandante ni el nombre de usuario, aunque se podía iniciar un sistema no definido en SAP Logon. Por otro lado, iniciar SAP GUI con parámetros de servidor arbitrarios no era especialmente relevante: si estamos resolviendo la tarea de restablecer la contraseña de un usuario, lo más probable es que él ya tenga la línea necesaria en SAP Logon, con la configuración que necesita y no sea necesario entrar con la nuestra. Sin embargo, la tecnología de SAP GUI Shortcut y el programa sapshcut.exe cumplían con los requisitos establecidos, ya que permitían iniciar SAP GUI usando un

Solución directa: ejecutar sapshcut.exe directamente desde el navegador mediante un objeto 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');
}

La solución es mala: en primer lugar, solo funciona en Internet Explorer, en segundo lugar, requiere configuraciones de seguridad en el navegador que pueden estar prohibidas a nivel de dominio en la organización, y incluso si están permitidas, el navegador presenta al usuario una ventana con una advertencia alarmante:

Ejecutar SAP GUI desde el navegador

La solución nº 2 la encontré en internet: creación de un protocolo web propio. Permite ejecutar la aplicación que necesitamos a través de un enlace especificando el protocolo que registramos nosotros mismos en Windows en el registro bajo la sección HKEY_CLASSES_ROOT. Dado que el acceso directo de SAP GUI tiene su propia subsección en esta sección, podemos agregar un parámetro de cadena URL Protocol con un valor vacío:

Ejecutar SAP GUI desde el navegador

Este protocolo inicia sapgui.exe con el parámetro /SHORTCUT, que es justamente lo que necesitamos:

Ejecutar SAP GUI desde el navegador

O si queremos crear un protocolo completamente personalizado (por ejemplo, sapshcut), podemos registrarlo utilizando el siguiente archivo reg:

Editor del Registro de Windows Versión 5.00
[HKEY_CLASSES_ROOTsapshcut]
@="Manejador de sapshcut"
"Protocolo URL"=""
[HKEY_CLASSES_ROOTsapshcutDefaultIcon]
@="sapshcut.exe"
[HKEY_CLASSES_ROOTsapshcutshell]
[HKEY_CLASSES_ROOTsapshcutshellopen]
[HKEY_CLASSES_ROOTsapshcutshellopencommand]
@="sapshcut.exe "%1""

Ahora, si hacemos un enlace en la página web especificando el protocolo Sapgui.Shortcut.File de la siguiente manera:

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

debería aparecer una ventana como esta:

Ejecutar SAP GUI desde el navegador

Y parece que todo está bien, pero al hacer clic en el botón «Permitir» vemos:

Ejecutar SAP GUI desde el navegador

Oh, el navegador convierte el espacio en . Y otros símbolos también serán codificados en su código numérico con el símbolo de porcentaje. Y lo más desagradable es que no se puede hacer nada a nivel de navegador (todo está hecho según el estándar) — el navegador no tolera tales símbolos, y el intérprete de comandos de Windows no funciona con esos valores codificados. Y otro inconveniente es que se pasa toda la cadena como parámetro, incluyendo el nombre del protocolo e incluso los dos puntos (:)sapgui.shortcut.file:). Sin embargo, aunque el mismo sapshcut.exe puede descartar todo lo que no sea un parámetro para él (comienza con el símbolo «-«, luego el nombre, «=» y el valor), es decir, una cadena como «sapgui.shortcut.file: -system=SID» seguirá funcionando, pero sin espacio «sapgui.shortcut.file:-system=SID» ya no funcionará.

Entonces, en principio, hay dos opciones para usar el protocolo URI:

  1. Uso sin parámetros: Creamos un montón de protocolos para todos nuestros sistemas en el formato SIDMANDT, como AAA200, BBB200 y así sucesivamente. Si solo necesitamos iniciar el sistema deseado, esta opción es bastante viable, pero en nuestro caso no es adecuada, ya que al menos queremos transmitir el inicio de sesión del usuario, y eso no se puede hacer de esta manera.
  2. Uso de un programa envoltorio para la llamada sapshcut.exe o sapgui.exeLa esencia de este programa es simple: debe tomar la cadena que le envíe el navegador a través del protocolo web y transformarla en la representación que Windows acepta, es decir, convierte nuevamente todos los códigos de caracteres en caracteres (incluso puede desglosar la cadena por parámetros) y luego llama a SAP GUI con el comando garantizado correcto. En nuestro caso, tampoco se adapta del todo (por eso ni siquiera lo escribí), porque ya no es suficiente agregar el protocolo en todas las PC de los usuarios (en el marco del dominio esto podría funcionar, aunque también sería mejor evitar tal práctica), pero aquí también será necesario colocar un programa adicional en la PC y además estar pendiente de que no desaparezca durante las reinstalaciones de software en la PC.

Es decir, también desestimamos esta opción como inadecuada para nosotros.

Aquí ya comencé a pensar que tendría que despedirme de la idea de iniciar SAP GUI con los parámetros necesarios desde el navegador, pero entonces se me ocurrió que en SAP Logon se puede crear un acceso directo y se puede copiar en el escritorio. Utilicé ese método hace tiempo, pero antes no miré el archivo de acceso directo específicamente. Y resultó que este acceso directo es un archivo de texto normal con la extensión .sap. Y si se inicia en Windows, se abrirá SAP GUI con los parámetros que se indican en este archivo. ¡Bingo!

El formato de este archivo es aproximadamente el siguiente (también puede haber una transacción que se ejecute al inicio, pero la omití):

[System]
Nombre=SID
Cliente=200
[User]
Nombre=
Idioma=RU
Contraseña=
[Function]
Título=
[Configuration]
GuiSize=Maximizado
[Options]
Reuse=0

Parece que está todo lo necesario: el identificador del sistema, el mandante, el nombre de usuario y hasta la contraseña. E incluso parámetros adicionales: Título — título de la ventana, GuiSize — tamaño de la ventana (si es de pantalla completa o no) y Reuse — si se debe abrir obligatoriamente una nueva ventana o usar la ya abierta con ese mismo sistema. Pero inmediatamente surgió un inconveniente: no se puede establecer la contraseña en SAP Logon, el campo estaba bloqueado. Resultó que esto se hizo por razones de seguridad: todos los accesos directos creados en SAP Logon se almacenan en un archivo sapshortcut.ini (junto a saplogon.ini en el perfil de usuario de Windows) y ahí, aunque están cifrados, no lo están demasiado y con un gran deseo se pueden descifrar. Pero también se puede permitir esto cambiando el valor de un parámetro en el registro (por defecto el valor 0):

Editor del Registro de Windows Versión 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"

Esto desbloqueará el campo "Contraseña" en el formulario de creación de accesos directos en SAP Logon:

Ejecutar SAP GUI desde el navegador

Y al introducir una contraseña en este campo, se colocará en la línea correspondiente.
sapshortcut.ini, pero al arrastrar el acceso directo al escritorio, no aparece allí, aunque se puede añadir manualmente. La contraseña está cifrada; para 111111 será de la siguiente forma: PW_49B02219D1F6, y para 222222: PW_4AB3211AD2F5. Pero lo que más nos interesa es que esta contraseña se cifra de una manera que no depende de un PC específico, y si restablecemos la contraseña a la original, se puede utilizar un valor previamente conocido en este campo. Si queremos usar una contraseña creada de forma arbitraria, tendremos que entender el algoritmo de este cifrado. Sin embargo, a juzgar por los ejemplos proporcionados, no debería ser muy difícil. Por cierto, en SAP GUI 7.40 este campo ha desaparecido de la forma, pero el archivo con la contraseña rellenada se reconoce correctamente.

Es decir, en el navegador basta con hacer clic en un enlace a un archivo con la extensión .sap y con el formato adecuado, y se ofrecerá abrirlo como un archivo de tipo SAP GUI Shortcut (por supuesto, en un PC con SAP GUI instalado) y nos abrirá la ventana de SAP GUI con los parámetros especificados (si la pareja SID y mandante está en la lista de SAP Logon en ese PC).

Pero, por supuesto, nadie va a crear y almacenar archivos de antemano en el sitio; es necesario generarlos según los parámetros requeridos. Por ejemplo, se puede crear un script en PHP para generar accesos directos (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=Ingreso al sistema rn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>

Si no se establece un nombre de usuario y una contraseña, obtendremos la siguiente ventana con la solicitud de inicio de sesión y contraseña:

Ejecutar SAP GUI desde el navegador

Si solo se proporciona el nombre de usuario, el campo de nombre de usuario estará lleno y el campo de contraseña estará vacío. Sin embargo, si proporcionamos tanto el nombre de usuario como la contraseña, pero en el registro de la PC del usuario la clave EnablePassword en la sección [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] está establecida en 0, obtendremos lo mismo. Solo si esta clave está establecida en 1 y proporcionamos tanto el nombre como la contraseña inicial, el sistema solicitará de inmediato que se ingrese dos veces la nueva contraseña permanente. Esto es lo que se requería obtener.

En resumen, tenemos el siguiente conjunto de opciones consideradas como ilustración de todo lo anterior:

<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', '');"/>Ejemplo 1: Ejecutar sapshcut.exe (ActiveX)<br>
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>Ejemplo 2: Abrir sapshcut.exe (URI)</a><br>
<a href='/es/sapshcut.php/?SID=SID&Client=200&User=test'>Ejemplo 3: Abrir archivo .sap (Acceso directo de SAP GUI)</a><br>
</body>
</html>

La última opción me pareció adecuada. Pero también se puede usar, por ejemplo, la generación de archivos CMD en lugar de generar accesos directos de SAP, que también abrirán la ventana de SAP GUI al abrir desde el navegador. A continuación se muestra un ejemplo (sapguicmd.php) de la ejecución directa de SAP GUI con la especificación de la cadena de conexión completa, sin necesidad de tener configurado 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 Ingreso a ".$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";
?>

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster