Primero escribí este artículo en mi blog , para que luego no volviera a mirar y recordar, pero como nadie lee el blog, quería compartir esta información con todos, de repente pude usarlo.Mientras trabajaba en la idea de un servicio de restablecimiento de contraseña en los sistemas SAP R / 3, surgió la pregunta: ¿cómo iniciar la GUI de SAP con los parámetros necesarios desde el navegador? Dado que esta idea implicaba el uso de un servicio web que primero cumple una solicitud SOAP de la GUI de SAP y envía un correo electrónico con un enlace a una página web con un script de restablecimiento de contraseña al inicial, y luego muestra un mensaje al usuario sobre el restablecimiento exitoso de la contraseña y muestra esta contraseña muy inicial , me gustaría que en esta página también hubiera un enlace para iniciar la GUI de SAP. Además, para que este enlace abra el sistema deseado, e incluso, preferiblemente, inmediatamente con los campos de inicio de sesión y contraseña completados: el usuario solo tendría que completar una contraseña productiva dos veces.
Iniciar SAP Logon no fue interesante para nuestro propósito, y al iniciar sapgui.exe fue imposible especificar el cliente y el nombre de usuario, pero fue posible iniciar el sistema no definido en SAP Logon. Por otro lado, iniciar la GUI de SAP con parámetros arbitrarios del servidor no fue particularmente relevante: si estamos resolviendo la tarea de restablecer la contraseña del usuario, entonces lo más probable es que ya tenga la línea correcta en SAP Logon, con la configuración que necesita y no tiene que molestarse con la suya. Por otro lado, la tecnología de acceso directo de la GUI de SAP y el programa sapshcut.exe en sí mismo, que permitieron iniciar la GUI de SAP usando un cierto "acceso directo", cumplieron los requisitos especificados.
Resolviendo el problema en la frente: ejecutando sapshcut.exe directamente desde el navegador usando el 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, funciona solo en Internet Explorer y, en segundo lugar, requiere una configuración de seguridad adecuada en el navegador, que puede prohibirse a nivel de dominio en la organización, e incluso si está habilitado, el navegador le da al usuario una ventana con una advertencia alarmante:

Busqué la solución n. ° 2 en Internet:
crear mi propio protocolo web . Le permite ejecutar la aplicación que necesitamos usando el enlace que indica el protocolo que nosotros mismos registramos en Windows en el registro en la sección HKEY_CLASSES_ROOT. Dado que el acceso directo de la GUI de SAP en esta sección tiene su propia subsección, puede agregar el parámetro de cadena del Protocolo URL con un valor vacío:

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

Bueno, o si queremos hacer un protocolo arbitrario en general (por ejemplo,
sapshcut ), puede registrarlo usando el siguiente archivo de registro:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\sapshcut]
@="sapshcut Handler"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\sapshcut\DefaultIcon]
@="sapshcut.exe"
[HKEY_CLASSES_ROOT\sapshcut\shell]
[HKEY_CLASSES_ROOT\sapshcut\shell\open]
[HKEY_CLASSES_ROOT\sapshcut\shell\open\command]
@="sapshcut.exe \"%1\""
Ahora, si hacemos un enlace en la página web que indique el protocolo
Sapgui.Shortcut.File de manera similar:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
deberíamos ver una ventana como:

Y todo parece estar bien, pero cuando haces clic en el botón "Permitir", vemos:

Vaya, el navegador convirtió el espacio en% 20. Bueno, otros caracteres también se codificarán en su 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 se hace de acuerdo con el estándar): al navegador no le gustan esos caracteres y el shell de Windows no funciona con dichos valores codificados. Y una desventaja más: toda la cadena se pasa como parámetro, incluido el nombre del protocolo e incluso los dos puntos (
sapgui.shortcut.file :) . Además, aunque el mismo
sapshcut.exe puede descartar todo lo que no sea un parámetro para ello (comienza con el símbolo "-", luego el nombre, "=" y el valor), es decir una línea de la forma "
sapgui.shortcut.file: -system = SID " todavía se enrolla, luego sin un espacio "
sapgui.shortcut.file: -system = SID " ya no funciona.
Resulta que, en principio, hay dos opciones para usar el protocolo URI:
- Uso sin parámetros: creamos un montón de protocolos para todos nuestros sistemas del tipo SIDMANDT , como AAA200 , BBB200 , etc. Si solo necesita iniciar el sistema deseado, entonces la opción está funcionando bastante bien, pero en nuestro caso no funciona, porque al menos también desea transferir el inicio de sesión del usuario, pero no puede hacerlo de esta manera.
- Usar un contenedor para llamar a sapshcut.exe o sapgui.exe . La esencia de este programa es simple: debe tomar la línea que el navegador le transmitirá a través del protocolo web y convertirla en la representación que Windows acepta, es decir. back convierte todos los códigos de caracteres en caracteres (tal vez incluso analiza la cadena por parámetros) y ya llama a la GUI de SAP garantizada por el comando correcto. En nuestro caso, tampoco encaja del todo (por lo tanto, ni siquiera lo escribí), porque no es suficiente para nosotros agregar un protocolo en todas las PC de los usuarios (dentro del dominio, esto todavía no fue a ninguna parte, aunque es mejor evitar esta práctica), pero aquí será necesario adicionalmente coloque el programa en una PC e incluso monitoree constantemente para que no desaparezca al reinstalar el software en una PC.
Es decir Esta opción también se descarta como no apta para nosotros.
Luego comencé a pensar que tendría que despedirme de la idea de iniciar la GUI de SAP con los parámetros necesarios desde el navegador, pero luego tuve la idea de que puede hacer un acceso directo en SAP Logon y copiarlo en el escritorio. Utilicé este método una vez, pero antes no miraba el archivo de acceso directo específicamente. Y resultó que este acceso directo es un archivo de texto sin formato con la extensión
.sap . Y si lo ejecuta en Windows, la GUI de SAP se inicia con los parámetros que se especifican en este archivo. "¡Bingo!"
El formato de este archivo es aproximadamente el siguiente (puede que todavía se inicie una transacción al inicio, pero la omití):
[System]
Name=SID
Client=200
[User]
Name=
Language=RU
Password=
[Function]
Title=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0
Parece ser 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 : el título de la ventana,
GuiSize , el tamaño de la ventana iniciada (pantalla completa o no) y
Reutilizar , ya sea para abrir una nueva ventana o usar una ya abierta con el mismo sistema. Pero de inmediato salió un matiz: resultó que era imposible establecer una 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 el archivo
sapshortcut.ini (junto a
saplogon.ini en el perfil de usuario de Windows) y aunque están encriptados allí, pueden encriptarse demasiado y si lo desea. decodificar Pero también 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_USER\Software\SAP\SAPShortcut\Security]
"EnablePassword"="1"
Esto desbloquea el campo Contraseña en el formulario de acceso directo en SAP Logon para ingresar:

Y al ingresar 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á encriptada, para 111111 tendrá la siguiente forma: PW_49B02219D1F6, para 222222 - PW_4AB3211AD2F5. Pero estamos más interesados en el hecho de que esta contraseña está encriptada de una manera que es independiente de la PC específica, y si restablecemos la contraseña a la inicial, podemos usar un valor previamente conocido en este campo. Bueno, si queremos usar una contraseña generada aleatoriamente, tendremos que entender el algoritmo de este cifrado. Pero a juzgar por los ejemplos anteriores, esto no será difícil. Por cierto, en SAP GUI 7.40 este campo generalmente desapareció del formulario, pero percibe correctamente el archivo con la contraseña completa.
Es decir, resulta que en el navegador es suficiente hacer clic en el enlace al archivo con la extensión .sap y con el formato deseado, y se ofrecerá a abrirlo como un archivo del tipo de acceso directo de la GUI de SAP (naturalmente en una PC con la GUI de SAP instalada) y abrirá la ventana de la GUI de SAP con la especificada parámetros (si el par SID y el cliente están en la lista de inicio de sesión de SAP en esta PC).
Pero está claro que nadie creará y almacenará archivos en el sitio simplemente de antemano; deben generarse en función de los parámetros necesarios. Por ejemplo, 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]\r\n"; echo "Name=".$SID."\r\n"; echo "Client=".$Client."\r\n"; echo "[User]\r\n"; echo "Name=".$Username."\r\n"; echo "Language=".$Lang."\r\n"; if($Password<>'') echo "Password=".$Password."\r\n"; echo "[Function]\r\n"; if($Title<>'') {echo "Title=".$Title."\r\n";} else {echo "Title= \r\n";}; echo "[Configuration]\r\n"; if($Size=='max') { echo "GuiSize=Maximized\r\n"; }; echo "[Options]\r\n"; echo "Reuse=0\r\n"; ?>
Si no especifica un nombre de usuario y contraseña, obtenemos la siguiente ventana de los mensajes de inicio de sesión y contraseña:

Si transfiere 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 el nombre de usuario y la contraseña, pero la clave EnablePassword del usuario en la sección [HKEY_CURRENT_USER \ Software \ SAP \ SAPShortcut \ Security] se establece en 0 en la PC del usuario, obtendremos lo mismo. Y solo si esta clave se establece en 1 y transferimos tanto el nombre como la contraseña inicial, el sistema le pedirá inmediatamente que ingrese la nueva contraseña permanente dos veces. Lo que se requería para recibir.
Como resultado, tenemos el siguiente conjunto de opciones consideradas como una 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 se me ocurrió. Pero en lugar de generar accesos directos de SAP, también puede usar, por ejemplo, la generación de archivos CMD, que, cuando se abren desde un navegador, también abrirán la ventana de la GUI de SAP. El siguiente es un ejemplo (
sapguicmd.php ) de iniciar directamente la GUI de SAP con la cadena de conexión completa, sin tener que configurar 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 off\r\n"; echo "chcp 1251\r\n"; echo "echo ".$Title."\r\n"; echo "set SAP_CODEPAGE=1504\r\n"; echo 'if exist "%ProgramFiles(x86)%\SAP\FrontEnd\SapGui\sapgui.exe" set gui=%ProgramFiles(x86)%\SAP\FrontEnd\SapGui\sapgui.exe'."\r\n"; echo 'if exist "%ProgramFiles%\SAP\FrontEnd\SapGui\sapgui.exe" set gui=%ProgramFiles%\SAP\FrontEnd\SapGui\sapgui.exe'."\r\n"; 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 "\r\n"; echo '"%gui%" %logon%'."\r\n"; ?>