Iniciando SAP GUI desde un navegador

Este artigo escribín por primeira vez no meu Blog, para non buscar e lembrar máis adiante, pero como ninguén le o blog, quixen compartir esta información con todos, por se alguén lle resulta útil.

Mentres traballaba na idea dun servizo de restablecemento de contrasinal nos sistemas SAP R/3, xurdiu unha pregunta: como iniciar SAP GUI cos parámetros necesarios desde o navegador? Dado que esta idea implicaba o uso dun servizo web, primeiro respondendo a unha solicitude SOAP dende a GUI de SAP e enviando unha carta cunha ligazón a unha páxina web cun script para restablecer o contrasinal ao inicial, para logo mostrar ao usuario. unha mensaxe sobre o restablecemento exitoso do contrasinal e amosando este contrasinal inicial, entón gustaríame que esta páxina tamén teña unha ligazón para iniciar SAP GUI. Ademais, esta ligazón debería abrir o sistema desexado, e, preferentemente, cos campos de inicio de sesión e contrasinal cubertos á vez: o usuario só tería que cubrir dúas veces o contrasinal produtivo.

O lanzamento de SAP Logon non foi interesante para o noso propósito, e ao executar sapgui.exe era imposible especificar o cliente e o nome de usuario, pero si era posible lanzar un sistema non definido en SAP Logon. Por outra banda, lanzar SAP GUI con parámetros de servidor arbitrarios non foi especialmente relevante: se estamos a resolver o problema de restablecer o contrasinal dun usuario, o máis probable é que xa teña a liña necesaria en SAP Logon, coa configuración que precisa, e alí non hai que meterse co seu. Pero os requisitos especificados foron cumpridos pola tecnoloxía SAP GUI Shortcut e o propio programa sapshcut.exe, o que permitiu lanzar a SAP GUI mediante un "atallo" específico.

Resolvendo o problema de xeito directo: iniciando sapshcut.exe directamente desde o navegador usando un obxecto 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');
}

A solución é mala: en primeiro lugar, só funciona en Internet Explorer, en segundo lugar, require unha configuración de seguranza axeitada no navegador, que nunha organización pode estar prohibida a nivel de dominio e, aínda que se permita, o navegador mostra unha fiestra cunha xanela aterradora. aviso ao usuario:

Iniciando SAP GUI desde un navegador

Atopei a solución #2 en Internet: creando o seu propio protocolo web. Permítenos lanzar a aplicación que necesitamos mediante unha ligazón que indica o protocolo, que nós mesmos rexistramos en Windows no rexistro da sección HKEY_CLASSES_ROOT. Dado que o SAP GUI Shortcut ten a súa propia subsección nesta sección, pode engadir alí o parámetro de cadea de protocolo URL cun valor baleiro:

Iniciando SAP GUI desde un navegador

Este protocolo comeza sapgui.exe con parámetro / ATRACTO, que é exactamente o que necesitamos:

Iniciando SAP GUI desde un navegador

Ben, ou se queremos facer un protocolo completamente arbitrario (por exemplo, corte sapsh), entón podes rexistralo usando o seguinte ficheiro 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""

Agora, se facemos unha ligazón nunha páxina web indicando o protocolo Sapgui.Arquivo.Atallo De xeito semellante:

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

Deberiamos ver unha xanela coma esta:

Iniciando SAP GUI desde un navegador

E todo parece xenial, pero cando fai clic no botón "Permitir" vemos:

Iniciando SAP GUI desde un navegador

Vaia, o navegador converteu a barra de espazo en % 20. Ben, outros caracteres tamén se codificarán no seu propio código numérico cun símbolo de porcentaxe. E o máis desagradable é que non se pode facer nada aquí a nivel de navegador (todo aquí faise segundo o estándar): ao navegador non lle gustan estes caracteres e o intérprete de comandos de Windows non funciona con tales valores codificados. E outro menos: a cadea enteira pásase como parámetro, incluíndo o nome do protocolo e mesmo os dous puntos (sapgui.shortcut.file:). Ademais, aínda que o mesmo sapshcut.exe pode descartar todo o que non sexa un parámetro para el (comeza co símbolo “-“, despois o nome, “=" e valor), é dicir. unha liña como "sapgui.shortcut.file: -system=SID"aínda funcionará, entón sen espazo"sapgui.shortcut.file:-system=SID"Xa non funciona.

Resulta que, en principio, hai dúas opcións para usar o protocolo URI:

  1. Usando sen parámetros: Creamos un montón de protocolos para todos os nosos sistemas do tipo SIDMANDT, como AAA200, BBB200 etcétera. Se só precisa iniciar o sistema desexado, a opción é bastante viable, pero no noso caso non é adecuada, xa que polo menos desexa transferir o inicio de sesión do usuario, pero non se pode facer deste xeito.
  2. Usando un programa de envoltura para chamar sapshcut.exe ou sapgui.exe. A esencia deste programa é sinxela: debe tomar a cadea que lle transmite o navegador a través do protocolo web e convertela na representación que recibe Windows, é dicir. converte todos os códigos de caracteres de novo en caracteres (quizais incluso analiza a cadea segundo os parámetros) e xa chama a SAP GUI cun comando correcto garantido. No noso caso tampouco é totalmente axeitado (por iso nin o escribín), porque non abonda con engadir o protocolo en todos os ordenadores dos usuarios (dentro dun dominio aínda está ben, aínda que tamén é mellor evitar esta práctica), pero aquí necesitaremos máis colocar o programa no PC, e tamén asegurarnos constantemente de que non desapareza cando se reinstale o software no PC.

Eses. Tamén descartamos esta opción por non ser axeitada para nós.

Neste punto xa comezaba a pensar que tería que despedirme da idea de lanzar SAP GUI cos parámetros necesarios dende o navegador, pero entón ocorréuseme que podes facer un atallo no SAP Logon e cópiao no teu escritorio. Usei este método unha vez, pero antes non mirei específicamente o ficheiro de atallo. E resultou que este atallo é un ficheiro de texto normal coa extensión .sap. E se o executas en Windows, a GUI de SAP iniciarase cos parámetros que se especifican neste ficheiro. "¡Bingo!"

O formato deste ficheiro é aproximadamente o seguinte (tamén pode haber unha transacción lanzada ao inicio, pero omitín):

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

Parece que todo o que se necesita: un identificador do sistema, un cliente, un nome de usuario e ata un contrasinal. E mesmo parámetros adicionais: título - título da xanela, GuiSize — tamaño da xanela en execución (pantalla completa ou non) e Reutilización — se é necesario abrir unha ventá nova ou utilizar unha xa aberta co mesmo sistema. Pero inmediatamente xurdiu un matiz: resultou que o contrasinal no inicio de sesión SAP non se puido establecer, a liña estaba bloqueada. Resultou que isto se fixo por razóns de seguridade: almacena todos os atallos creados en SAP Logon nun ficheiro sapshortcut.ini (Cerca saplogon.ini no perfil de usuario de Windows) e alí, aínda que están encriptados, non están demasiado cifrados e, se o desexa, pódense descifrar. Pero podes resolver isto cambiando o valor dun parámetro no rexistro (o valor predeterminado é 0):

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

Isto desbloquea o campo Contrasinal para ingresar no formulario de creación de atallo no inicio de sesión de SAP:

Iniciando SAP GUI desde un navegador

E cando introduza un contrasinal neste campo, colocarase na liña correspondente
sapshortcut.ini, pero cando arrastras un atallo ao escritorio, non aparece alí, pero podes engadilo alí manualmente. O contrasinal está cifrado, para 111111 será o seguinte: PW_49B02219D1F6, para 222222 - PW_4AB3211AD2F5. Pero interésanos máis o feito de que este contrasinal estea cifrado dun xeito, independentemente do PC específico, e se restablecemos o contrasinal ao inicial, podemos utilizar un valor precoñecido neste campo. Ben, se queremos utilizar un contrasinal creado ao azar, teremos que entender o algoritmo deste cifrado. Pero a xulgar polos exemplos dados, isto non será difícil de facer. Por certo, en SAP GUI 7.40 este campo desapareceu completamente do formulario, pero acepta correctamente un ficheiro cun contrasinal cuberto.

É dicir, resulta que no navegador só tes que facer clic na ligazón a un ficheiro coa extensión .sap e o formato desexado, e ofrecerá abrilo como un ficheiro como SAP GUI Shortcut (naturalmente nun PC). con SAP GUI instalado) e abrirá unha xanela SAP GUI cos parámetros especificados (se o SID e o par de cliente están na lista de inicio de sesión de SAP neste PC).

Pero, está claro que ninguén simplemente creará ficheiros con antelación e almacenalos no sitio: deben xerarse en función dos parámetros necesarios. Por exemplo, pode crear un script PHP para xerar atallos (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";
?>

Se non especificas un nome de usuario e contrasinal, aparecerá a seguinte xanela na que se solicita o usuario e o contrasinal:

Iniciando SAP GUI desde un navegador

Se pasa só o inicio de sesión, o campo de inicio de sesión cubrirase e o campo de contrasinal estará baleiro. Se lle damos ao usuario un inicio de sesión e un contrasinal, pero o usuario do PC ten a clave EnablePassword no rexistro da sección [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] configurada en 0, obtemos o mesmo. E só se esta chave está configurada en 1 e pasamos tanto o nome como o contrasinal inicial, o sistema pedirache de inmediato que introduza un novo contrasinal permanente dúas veces. Iso era o que necesitabamos conseguir.

Como resultado, temos o seguinte conxunto de opcións consideradas como ilustración de todo o 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>

A última opción acaboume. Pero en lugar de xerar atallos de SAP, tamén podes usar, por exemplo, a xeración de ficheiros CMD, que, cando se abre desde un navegador, tamén abrirá a xanela SAP GUI para ti. Abaixo está un exemplo (sapguicmd.php) inicie directamente a GUI de SAP coa cadea de conexión completa, sen necesidade de ter configurado o inicio de sesión de SAP:

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

Fonte: www.habr.com

Engadir un comentario