Iniciando SAP GUI a partir de um navegador

Escrevi este artigo pela primeira vez em meu Blog, para não pesquisar e lembrar depois, mas como ninguém lê o blog, queria compartilhar essa informação com todos, caso alguém ache útil.

Enquanto trabalhava na ideia de um serviço de redefinição de senha em sistemas SAP R/3, surgiu uma questão - como iniciar o SAP GUI com os parâmetros necessários a partir do navegador? Como essa ideia implicava a utilização de um web service, primeiro responder a uma solicitação SOAP do SAP GUI e enviar um e-mail com um link para uma página web com um script para redefinir a senha para a inicial, e depois exibir ao usuário uma mensagem sobre a redefinição de senha bem-sucedida e a exibição dessa senha inicial, gostaria que esta página também tivesse um link para iniciar o SAP GUI. Além disso, esse link deverá abrir o sistema desejado, e, preferencialmente, com os campos de login e senha preenchidos de uma só vez: o usuário só precisará preencher a senha produtiva duas vezes.

O lançamento do SAP Logon não foi interessante para o nosso propósito, e ao executar o sapgui.exe foi impossível especificar o cliente e o nome do usuário, mas foi possível lançar um sistema não definido no SAP Logon. Por outro lado, iniciar o SAP GUI com parâmetros arbitrários do servidor não era particularmente relevante: se estamos resolvendo o problema de redefinição da senha de um usuário, então provavelmente ele já possui a linha necessária no SAP Logon, com as configurações de que precisa, e aí não há necessidade de mexer com o seu próprio. Mas os requisitos especificados foram atendidos pela tecnologia SAP GUI Shortcut e pelo próprio programa sapshcut.exe, que possibilitou o lançamento do SAP GUI por meio de um “atalho” específico.

Resolvendo o problema de frente: iniciando sapshcut.exe diretamente do navegador usando um 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 é má: em primeiro lugar, só funciona no Internet Explorer, em segundo lugar, requer configurações de segurança adequadas no navegador, o que numa organização pode ser proibido ao nível do domínio, e mesmo que permitido, o navegador exibe uma janela com um assustador aviso ao usuário:

Iniciando SAP GUI a partir de um navegador

Encontrei a solução nº 2 na Internet: criando seu próprio protocolo web. Permite-nos lançar a aplicação que necessitamos através de um link que indica o protocolo, que nós próprios registamos no Windows no registo na secção HKEY_CLASSES_ROOT. Como o SAP GUI Shortcut tem sua própria subseção nesta seção, você pode adicionar o parâmetro de string do protocolo URL com um valor vazio:

Iniciando SAP GUI a partir de um navegador

Este protocolo começa sapgui.exe com parâmetro /ATALHO, que é exatamente o que precisamos:

Iniciando SAP GUI a partir de um navegador

Bem, ou se quisermos fazer um protocolo completamente arbitrário (por exemplo, sapshcut), então você pode registrá-lo usando o seguinte arquivo 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 fizermos um link em uma página web indicando o protocolo Sapgui.Atalho.Arquivo de maneira semelhante:

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

Deveríamos ver uma janela como esta:

Iniciando SAP GUI a partir de um navegador

E tudo parece ótimo, mas quando você clica no botão “Permitir” vemos:

Iniciando SAP GUI a partir de um navegador

Ops, o navegador transformou a barra de espaço em% 20. Bem, outros caracteres também serão codificados em seu próprio 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 aqui é feito de acordo com o padrão) - o navegador não gosta desses caracteres e o interpretador de comandos do Windows não funciona com esses valores codificados. E mais um sinal de menos - toda a string é passada como parâmetro, incluindo o nome do protocolo e até dois pontos (sapgui.shortcut.file:). Além disso, embora o mesmo sapshcut.exe pode descartar tudo que não seja parâmetro para ele (começa com o símbolo “-“, depois o nome, “=” e valor), ou seja, uma linha como "sapgui.shortcut.file: -system=SID"ainda vai funcionar, então sem espaço"sapgui.shortcut.file:-system=SID"não funciona mais.

Acontece que, em princípio, existem duas opções de utilização do protocolo URI:

  1. Usando sem parâmetros: Criamos vários protocolos para todos os nossos sistemas do tipo SIDMANDTtipo AAA200, BBB200 e assim por diante. Se você só precisa iniciar o sistema desejado, então a opção é bastante viável, mas no nosso caso não é adequada, pois pelo menos você gostaria de transferir o login do usuário, mas isso não pode ser feito desta forma.
  2. Usando um programa wrapper para chamar sapshcut.exe ou sapgui.exe. A essência deste programa é simples - ele deve pegar a string que o navegador lhe transmite através do protocolo web e transformá-la na representação que o Windows recebe, ou seja, transforma todos os códigos de caracteres novamente em caracteres (talvez até analise a string de acordo com os parâmetros) e já chama o SAP GUI com um comando correto garantido. No nosso caso, também não é totalmente adequado (por isso nem escrevi), porque não basta adicionarmos o protocolo em todos os PCs dos usuários (dentro de um domínio ainda está tudo bem, embora também seja melhor evite esta prática), mas aqui precisaremos mais colocar o programa no PC, e também garantir constantemente que ele não desapareça quando o software for reinstalado no PC.

Aqueles. Também descartamos esta opção por ser inadequada para nós.

A essa altura eu já estava começando a pensar que teria que me despedir da ideia de lançar o SAP GUI com os parâmetros necessários do navegador, mas então me ocorreu a ideia de que você pode fazer um atalho no SAP Logon e copie-o para sua área de trabalho. Usei esse método uma vez, mas antes não olhei especificamente para o arquivo de atalho. E descobriu-se que este atalho é um arquivo de texto normal com a extensão .seiva. E se você executá-lo no Windows, o SAP GUI será iniciado com os parâmetros especificados neste arquivo. "Bingo!"

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

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

Parece que 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 - título da janela, GuiSize — tamanho da janela em execução (tela cheia ou não) e armadilha para peixes — se é necessário abrir uma nova janela ou utilizar uma já aberta com o mesmo sistema. Mas uma nuance surgiu imediatamente - descobriu-se que não foi possível definir a senha no SAP Logon, a linha foi bloqueada. Acontece que isso foi feito por questões de segurança: armazena todos os atalhos criados no SAP Logon em um arquivo sapshortcut.ini (Perto saplogon.ini no perfil de usuário do Windows) e ali, embora sejam criptografados, não são criptografados com muita força e, se desejado, podem ser descriptografados. Mas você 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_USERSoftwareSAPSAPShortcutSecurity]
"EnablePassword"="1"

Isso desbloqueia o campo Senha para entrada no formulário de criação de atalho no SAP Logon:

Iniciando SAP GUI a partir de um navegador

E quando você inserir 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 será a seguinte: PW_49B02219D1F6, para 222222 - PW_4AB3211AD2F5. Mas estamos mais interessados ​​​​no fato de que esta senha é criptografada de uma forma, independente do PC específico, e se redefinirmos a senha para a inicial, poderemos usar um valor pré-conhecido neste campo. Bom, se quisermos usar uma senha criada aleatoriamente, teremos que entender o algoritmo dessa cifra. Mas, a julgar pelos exemplos dados, isso não será difícil de fazer. Aliás, no SAP GUI 7.40 esse campo desapareceu completamente do formulário, mas aceita corretamente um arquivo com senha preenchida.

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

Porém, é claro que ninguém irá simplesmente criar arquivos com antecedência e armazená-los no site - eles devem ser gerados com base nos parâmetros necessários. Por exemplo, você pode criar um script 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]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 você não especificar um nome de usuário e senha, você verá a seguinte janela solicitando login e senha:

Iniciando SAP GUI a partir de um navegador

Se você passar apenas o login, o campo de login será preenchido e o campo de senha ficará vazio. Se fornecermos ao usuário um login e uma senha, mas o usuário no PC tiver a chave EnablePassword no registro na seção [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] definida como 0, obteremos a mesma coisa. E somente se esta chave for definida como 1 e passarmos o nome e a senha inicial, o sistema solicitará imediatamente que você insira uma nova senha permanente duas vezes. Isso é o que precisávamos conseguir.

Como resultado, temos o seguinte conjunto de opções consideradas como 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 me convinha. Mas em vez de gerar atalhos SAP, você também pode usar, por exemplo, a geração de arquivos CMD, que, quando abertos em um navegador, também abrirão a janela SAP GUI para você. Abaixo está um exemplo (sapguicmd.php) inicia diretamente o SAP GUI com a string de conexão completa, sem a necessidade de configurar o 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";
?>

Fonte: habr.com

Adicionar um comentário