Iniciar SAP GUI desde un navegador

Escribí este artículo por primera vez en mi Blog, para no volver a buscar y recordar después, pero como nadie lee el blog, quería compartir esta información con todos, por si a alguien le resulta útil.

Mientras trabajaba en la idea de un servicio de restablecimiento de contraseña en los sistemas SAP R/3, surgió una pregunta: ¿cómo iniciar SAP GUI con los parámetros necesarios desde el navegador? Dado que esta idea implicaba el uso de un servicio web, primero respondiendo a una solicitud SOAP desde la GUI de SAP y enviando una carta con un enlace a una página web con un script para restablecer la contraseña a la inicial, y luego mostrársela al usuario. un mensaje sobre el restablecimiento exitoso de la contraseña y que muestra esta contraseña inicial, entonces me gustaría que esta página también tenga un enlace para iniciar la GUI de SAP. Además, este enlace debería abrir el sistema deseado y, preferiblemente, con los campos de inicio de sesión y contraseña completados a la vez: el usuario solo tendría que ingresar la contraseña productiva dos veces.

Iniciar SAP Logon no fue interesante para nuestro propósito y al ejecutar sapgui.exe fue imposible especificar el cliente y el nombre de usuario, pero fue posible iniciar un sistema no definido en SAP Logon. Por otro lado, iniciar SAP GUI con parámetros arbitrarios del servidor no fue particularmente relevante: si estamos resolviendo el problema de restablecer la contraseña de un usuario, lo más probable es que ya tenga la línea necesaria en SAP Logon, con la configuración que necesita, y allí No hay necesidad de meterse con los suyos. Pero los requisitos especificados los cumplieron la tecnología SAP GUI Shortcut y el propio programa sapshcut.exe, lo que hizo posible iniciar SAP GUI utilizando un "atajo" específico.

Resolviendo el problema de frente: ejecutando sapshcut.exe directamente desde el navegador usando 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 una configuración de seguridad adecuada en el navegador, que en una organización puede estar prohibida a nivel de dominio, e incluso si está permitida, el navegador muestra una ventana con un mensaje aterrador. advertencia al usuario:

Iniciar SAP GUI desde un navegador

Encontré la solución número 2 en Internet: creando tu propio protocolo web. Nos permite ejecutar la aplicación que necesitamos mediante un enlace que indica el protocolo, que nosotros mismos registramos en Windows en el registro en la sección HKEY_CLASSES_ROOT. Dado que SAP GUI Shortcut tiene su propia subsección en esta sección, puede agregar el parámetro de cadena de protocolo URL con un valor vacío allí:

Iniciar SAP GUI desde un navegador

Este protocolo comienza sapgui.exe con parámetro /ATAJO, que es exactamente lo que necesitamos:

Iniciar SAP GUI desde un navegador

Bueno, o si queremos hacer un protocolo completamente arbitrario (por ejemplo, corte de savia), entonces puedes registrarlo usando el siguiente archivo de registro:

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

Ahora bien, si hacemos un enlace en una página web indicando el protocolo Archivo.de.atajo.de.Sapgui En una forma similar:

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

Deberíamos ver una ventana como esta:

Iniciar SAP GUI desde un navegador

Y todo parece genial, pero cuando haces clic en el botón “Permitir” vemos:

Iniciar SAP GUI desde un navegador

Vaya, el navegador convirtió la barra espaciadora en %20. Bueno, otros caracteres también se codificarán en su propio código numérico con un símbolo de porcentaje. Y lo más desagradable es que aquí no se puede hacer nada a nivel del navegador (todo aquí se hace de acuerdo con el estándar): al navegador no le gustan esos caracteres y el intérprete de comandos de Windows no funciona con tales valores codificados. Y un inconveniente más: toda la cadena se pasa como parámetro, incluido el nombre del protocolo e incluso los dos puntos (archivo.sapgui.shortcut.:). Es más, aunque el mismo sapshcut.exe puede descartar todo lo que no sea un parámetro (comienza con el símbolo "-", luego el nombre, "=" y el valor), es decir una línea como "sapgui.shortcut.file: -sistema=SID"Seguirá funcionando, pero sin espacio"sapgui.shortcut.file:-sistema=SID"ya no funciona.

Resulta que, en principio, existen dos opciones para utilizar el protocolo URI:

  1. Uso sin parámetros: Creamos una gran cantidad de protocolos para todos nuestros sistemas del tipo SIDMANDTtipo AAA200, BBB200 etcétera. Si simplemente necesita iniciar el sistema deseado, entonces la opción es bastante viable, pero en nuestro caso no es adecuada, ya que al menos le gustaría transferir el inicio de sesión del usuario, pero esto no se puede hacer de esta manera.
  2. Usando un programa contenedor para llamar sapshcut.exe o sapgui.exe. La esencia de este programa es simple: debe tomar la cadena que el navegador le transmite a través del protocolo web y convertirla en la representación que recibe Windows, es decir. convierte todos los códigos de caracteres nuevamente en caracteres (tal vez incluso analiza la cadena según los parámetros) y ya llama a SAP GUI con un comando correcto garantizado. En nuestro caso tampoco es del todo adecuado (por eso ni siquiera lo escribí), porque no nos basta con añadir el protocolo en todos los PC de los usuarios (dentro de un dominio esto todavía está bien, aunque también es mejor evite esta práctica), pero aquí necesitaremos colocar más el programa en la PC y también asegurarnos constantemente de que no desaparezca cuando se reinstale el software en la PC.

Aquellos. También descartamos esta opción por no ser adecuada para nosotros.

En este punto ya estaba empezando a pensar que tendría que decir adiós a la idea de iniciar SAP GUI con los parámetros necesarios desde el navegador, pero luego se me ocurrió la idea de que puedes hacer un acceso directo en SAP Logon y cópialo en tu escritorio. Utilicé este método una vez, pero antes no miré específicamente el archivo de acceso directo. Y resultó que este acceso directo es un archivo de texto normal con la extensión .savia. Y si lo ejecuta en Windows, SAP GUI se iniciará con los parámetros especificados en este archivo. "¡Bingo!"

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

[System]
Name=SID
Client=200
[User]
Name=
Language=RU
Password=
[Function]
Title=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0

Parece que todo lo que se necesita: un identificador del sistema, un cliente, un nombre de usuario e incluso una contraseña. E incluso parámetros adicionales: Título - título de la ventana, GuiTamaño — tamaño de la ventana en ejecución (pantalla completa o no) y Reutilizar — si es necesario abrir una nueva ventana o utilizar una ya abierta con el mismo sistema. Pero inmediatamente surgió un matiz: resultó que no se podía establecer la contraseña en SAP Logon, la línea estaba bloqueada. Resultó que esto se hizo por razones de seguridad: almacena todos los accesos directos creados en SAP Logon en un archivo sapshortcut.ini (Cerca saplogon.ini en el perfil de usuario de Windows) y allí, aunque están cifrados, no lo están demasiado y, si se desea, se pueden descifrar. Pero puede resolver esto cambiando el valor de un parámetro en el registro (el valor predeterminado es 0):

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"

Esto desbloquea el campo Contraseña para ingresar en el formulario de creación de accesos directos en SAP Logon:

Iniciar SAP GUI desde un navegador

Y cuando ingresa una contraseña en este campo, se colocará en la línea correspondiente
sapshortcut.ini, pero cuando arrastra un acceso directo al escritorio, no aparece allí, pero puede agregarlo allí manualmente. La contraseña está cifrada, para 111111 será la siguiente: PW_49B02219D1F6, para 222222 - PW_4AB3211AD2F5. Pero estamos más interesados ​​en el hecho de que esta contraseña está cifrada de una manera, independientemente de la PC específica, y si restablecemos la contraseña a la inicial, entonces podemos usar un valor previamente conocido en este campo. Bueno, si queremos utilizar una contraseña creada aleatoriamente, tendremos que comprender el algoritmo de este cifrado. Pero a juzgar por los ejemplos dados, esto no será difícil de hacer. Por cierto, en SAP GUI 7.40 este campo desapareció por completo del formulario, pero acepta correctamente un archivo con una contraseña completa.

Es decir, resulta que en el navegador solo necesita hacer clic en el enlace a un archivo con la extensión .sap y el formato deseado, y le ofrecerá abrirlo como un archivo como SAP GUI Shortcut (naturalmente en una PC). con SAP GUI instalado) y abrirá una ventana de SAP GUI con los parámetros especificados (si el par SID y cliente están en la lista de inicio de sesión de SAP en esta PC).

Pero está claro que nadie creará archivos con anticipación y los almacenará en el sitio; deben generarse en función de los parámetros necesarios. Por ejemplo, puede crear un script 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=Вход в системуrn";};
echo "[Configuration]rn";
if($Size=='max') { echo "GuiSize=Maximizedrn"; };
echo "[Options]rn";
echo "Reuse=0rn";
?>

Si no especifica un nombre de usuario y contraseña, aparecerá la siguiente ventana solicitando nombre de usuario y contraseña:

Iniciar SAP GUI desde un navegador

Si pasa solo el inicio de sesión, el campo de inicio de sesión se completará y el campo de contraseña estará vacío. Si le damos al usuario un nombre de usuario y una contraseña, pero el usuario en la PC tiene la clave EnablePassword en el registro en la sección [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] establecida en 0, obtenemos lo mismo. Y solo si esta clave está configurada en 1 y le pasamos tanto el nombre como la contraseña inicial, el sistema inmediatamente le pedirá que ingrese dos veces una nueva contraseña permanente. Eso es lo que necesitábamos conseguir.

Como resultado, 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', '');"/>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>

La última opción me convenía. Pero en lugar de generar accesos directos de SAP, también puede utilizar, por ejemplo, generar archivos CMD que, cuando se abren desde un navegador, también abrirán la ventana GUI de SAP. A continuación se muestra un ejemplo (sapguicmd.php) inicie directamente la GUI de SAP con 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 Вход в ".$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

Añadir un comentario