Iniciando o SAP GUI a partir de um navegador

Escrevi este artigo pela primeira vez no meu blog , para depois não olhar e me lembrar novamente, mas como ninguém lê o blog, eu queria compartilhar essas informações com todos, de repente, que poderiam ser úteis.

Enquanto trabalhava na idéia de um serviço de redefinição de senha nos sistemas SAP R / 3, surgiu a pergunta - como iniciar a SAP GUI com os parâmetros necessários no navegador? Como essa ideia implicava o uso de um serviço da Web que primeiro atende a uma solicitação SOAP da SAP GUI e envia um email com um link para uma página da Web com um script de redefinição de senha para o inicial e, em seguida, exibe uma mensagem ao usuário sobre uma redefinição de senha bem-sucedida e exibe essa senha inicial , gostaria que nesta página também houvesse um link para iniciar a SAP GUI. Além disso, para que esse link abra o sistema desejado, e mesmo, preferencialmente, imediatamente com os campos de login e senha preenchidos: o usuário só precisará preencher uma senha produtiva duas vezes.

Iniciar o SAP Logon não era interessante para o nosso propósito e, ao iniciar o sapgui.exe, era impossível especificar o cliente e o nome de usuário, mas era possível iniciar o sistema não definido no SAP Logon. Por outro lado, iniciar a GUI do SAP com parâmetros arbitrários do servidor não era particularmente relevante: se estamos resolvendo o problema de redefinir a senha do usuário, provavelmente ele já tem a linha certa no SAP Logon, com as configurações de que precisa e não precisa se preocupar. Mas a tecnologia SAP GUI Shortcut e o programa real sapshcut.exe, que possibilitaram iniciar a SAP GUI usando um determinado "atalho", atendiam aos requisitos especificados.

A solução para o problema na testa: executando o sapshcut.exe diretamente do navegador usando o 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'); } 

A solução é ruim: primeiro, funciona apenas no Internet Explorer e, em segundo lugar, requer configurações de segurança apropriadas no navegador, o que pode ser proibido no nível de domínio da organização e, mesmo se ativado, o navegador fornece ao usuário uma janela com um aviso assustador:



Eu descobri a solução 2 na Internet: criando meu próprio protocolo da web . Ele permite que você execute o aplicativo que precisamos usando o link que indica o protocolo que nós mesmos registramos no Windows no registro na seção HKEY_CLASSES_ROOT. Como o atalho da GUI do SAP nesta seção possui sua própria subseção, é possível adicionar o parâmetro da string Protocolo de URL com um valor vazio:



Este protocolo inicia o sapgui.exe com o parâmetro / SHORTCUT , que é o que precisamos:



Bem, ou se queremos criar um protocolo arbitrário em geral (por exemplo, sapshcut ), você pode registrá-lo usando o seguinte arquivo 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\""

Agora, se fizermos um link na página da web indicando o protocolo Sapgui.Shortcut.File de maneira semelhante:

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

devemos ver uma janela como:



E tudo parece estar bem, mas quando você clica no botão "Permitir", vemos:



Ops, o navegador transformou o espaço em% 20. Bem, outros caracteres também serão codificados em seu código numérico com um símbolo de porcentagem. E o mais desagradável é que nada pode ser feito aqui no nível do navegador (tudo é feito de acordo com o padrão) - o navegador não gosta desses caracteres e o shell do Windows não funciona com esses valores codificados. E mais um menos - toda a cadeia é passada como parâmetro, incluindo o nome do protocolo e até os dois pontos ( sapgui.shortcut.file :) . Além disso, embora o mesmo sapshcut.exe possa descartar tudo o que não é um parâmetro para ele (começa com o símbolo "-", depois o nome "=" e o valor), ou seja, uma linha no formato " sapgui.shortcut.file: -system = SID " ainda rola, então sem um espaço " sapgui.shortcut.file: -system = SID " não funciona mais.

Acontece que, em princípio, existem duas opções para usar o protocolo URI:

  1. Use sem parâmetros: Criamos vários protocolos para todos os nossos sistemas do tipo SIDMANDT , como AAA200 , BBB200 , etc. Se você só precisa iniciar o sistema desejado, a opção está funcionando, mas no nosso caso não funciona, porque pelo menos você deseja transferir o login do usuário também, mas não pode fazê-lo dessa maneira.
  2. Usando um wrapper para chamar sapshcut.exe ou sapgui.exe . A essência deste programa é simples - ele deve seguir a linha que o navegador transmitirá a ele através do protocolo da web e transformá-lo na representação que o Windows aceita, ou seja, back transforma todos os códigos de caracteres em caracteres (talvez até analise a string por parâmetros) e já chama a GUI do SAP garantida pelo comando correto. No nosso caso, também não é adequado (portanto, nem escrevi), porque não basta adicionar um protocolo em todos os PCs dos usuários (no domínio, isso ainda não foi a lugar nenhum, embora seja melhor evitar essa prática também), mas será necessário coloque o programa em um PC e monitore constantemente para que ele não desapareça ao reinstalar o software em um PC.

I.e. essa opção também é descartada como imprópria para nós.

Então comecei a pensar que teria que me despedir da idéia de iniciar a SAP GUI com os parâmetros necessários no navegador, mas tive a ideia de que você pode criar um atalho no SAP Logon e copiá-lo para a área de trabalho. Eu usei esse método uma vez, mas antes não examinei o arquivo de atalho especificamente. E aconteceu que esse atalho é um arquivo de texto sem formatação com a extensão .sap . E se você executá-lo no Windows, a GUI do SAP inicia com os parâmetros especificados neste arquivo. "Bingo!"

O formato deste arquivo é aproximadamente o seguinte (ainda pode haver uma transação sendo iniciada na inicialização, mas eu o omiti):

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

Parece ser tudo o que é necessário: um identificador de sistema, um cliente, um nome de usuário e até uma senha. E até parâmetros adicionais: Título - o título da janela, GuiSize - o tamanho da janela em execução (tela cheia ou não) e Reutilizar - para abrir uma nova janela ou usar uma já aberta com o mesmo sistema. Mas imediatamente uma nuance foi revelada - era impossível definir uma senha no SAP Logon, a linha foi bloqueada. Aconteceu que isso foi feito por motivos de segurança: ele armazena todos os atalhos criados no SAP Logon no arquivo sapshortcut.ini (ao lado de saplogon.ini no perfil de usuário do Windows) e, embora estejam criptografados lá, podem ser criptografados demais e, se desejado. decodificar. Mas você também pode resolver isso alterando o valor de um parâmetro no registro (o valor padrão é 0 ):

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\SAP\SAPShortcut\Security]
"EnablePassword"="1"

Isso desbloqueia o campo Senha no formulário de atalho no SAP Logon para inserir:



E ao digitar uma senha neste campo, ela será colocada na linha correspondente
sapshortcut.ini , mas quando você arrasta um atalho para a área de trabalho, ele não aparece lá - mas você pode adicioná-lo manualmente. A senha é criptografada; para 111111, ela terá o seguinte formato: PW_49B02219D1F6, para 222222 - PW_4AB3211AD2F5. Mas estamos mais interessados ​​no fato de que essa senha é criptografada de uma maneira independente do PC específico e, se redefinirmos a senha para a inicial, poderemos usar um valor anteriormente conhecido nesse campo. Bem, se quisermos usar uma senha gerada aleatoriamente, teremos que entender o algoritmo dessa cifra. Mas, a julgar pelos exemplos acima, isso não será difícil. A propósito, no SAP GUI 7.40, esse campo geralmente desaparecia do formulário, mas ele percebia corretamente o arquivo com a senha preenchida.

Ou seja, acontece que no navegador basta clicar no link do arquivo com a extensão .sap e com o formato desejado - e ele oferecerá abri-lo como um arquivo do tipo atalho do SAP GUI (naturalmente em um PC com o SAP GUI instalado) e abrirá a janela do SAP GUI com o especificado parâmetros (se o par SID e cliente estiver na lista SAP Logon neste PC).

Mas é claro que ninguém criará e armazenará arquivos no site apenas com antecedência - eles devem ser gerados com base nos parâmetros necessários. Por exemplo, você pode criar um script no PHP para gerar atalhos ( 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"; ?> 

Se você não especificar um nome de usuário e senha, obteremos a seguinte janela nos prompts de login e senha:



Se você transferir apenas o login, o campo de login será preenchido e o campo da senha estará vazio. Se passarmos o nome de usuário e a senha, mas a chave EnablePassword do usuário na seção [HKEY_CURRENT_USER \ Software \ SAP \ SAPShortcut \ Security] estiver definida como 0 no PC do usuário, obteremos a mesma coisa. E somente se essa chave estiver definida como 1 e transferirmos o nome e a senha inicial, o sistema solicitará imediatamente que você insira a nova senha permanente duas vezes. O que era necessário para receber.

Como resultado, temos o seguinte conjunto de opções consideradas como uma ilustração de todas as opções acima:

 <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 opção veio até mim. Mas, em vez de gerar atalhos do SAP, você também pode usar, por exemplo, a geração de arquivos CMD, que, quando abertos a partir de um navegador, também abrirão a janela da GUI do SAP. A seguir, é apresentado um exemplo ( sapguicmd.php ) de iniciar diretamente a SAP GUI com a cadeia de conexão completa, sem a necessidade de ter o SAP Logon configurado:

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

Source: https://habr.com/ru/post/pt446998/


All Articles