从浏览器启动 SAP GUI

我首先在我的 博客,以免以后再次搜索和记住,但由于没有人看该博客,因此我想与大家分享此信息,以防有人觉得有用。

在研究 SAP R/3 系统中的密码重置服务的想法时,出现了一个问题 - 如何使用浏览器中的必要参数启动 SAP GUI? 由于这个想法意味着使用 Web 服务,因此首先响应来自 SAP GUI 的 SOAP 请求,并发送一封电子邮件,其中包含指向网页的链接,其中包含用于将密码重置为初始密码的脚本,然后向用户显示有关密码重置成功并显示此初始密码的消息,那么我希望此页面也有一个启动 SAP GUI 的链接。 此外,此链接应打开所需的系统,并且最好一次性填写登录名和密码字段:用户只需填写有效密码两次。

启动 SAP Logon 对我们的目的来说并不有趣,并且在运行 sapgui.exe 时无法指定客户端和用户名,但可以启动 SAP Logon 中未定义的系统。 另一方面,使用任意服务器参数启动 SAP GUI 并不是特别相关:如果我们正在解决重置用户密码的问题,那么很可能他已经在 SAP Logon 中拥有必要的行以及他需要的设置,并且在那里没必要去惹自己的事。 但 SAP GUI 快捷方式技术和 sapshcut.exe 程序本身满足了指定要求,这使得使用特定“快捷方式”启动 SAP GUI 成为可能。

正面解决问题:使用 ActiveX 对象直接从浏览器启动 sapshcut.exe:

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');
}

该解决方案很糟糕:首先,它只能在 Internet Explorer 中工作,其次,它需要在浏览器中进行适当的安全设置,这在组织中可能在域级别被禁止,即使允许,浏览器也会显示一个带有可怕的窗口警告用户:

从浏览器启动 SAP GUI

我在网上找到了解决方案#2: 创建您自己的网络协议。 允许我们使用指示协议的链接启动所需的应用程序,我们自己在 Windows 注册表中的 HKEY_CLASSES_ROOT 部分中注册该协议。 由于 SAP GUI 快捷方式在此部分中有自己的小节,因此您可以在其中添加具有空值的 URL 协议字符串参数:

从浏览器启动 SAP GUI

该协议启动 sapgui.exe 带参数 /捷径,这正是我们所需要的:

从浏览器启动 SAP GUI

好吧,或者如果我们想制定一个完全任意的协议(例如, 萨普什切特),然后您可以使用以下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""

现在,如果我们在网页上创建一个指示协议的链接 Sapgui.快捷方式.文件 以类似的方式:

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

我们应该看到这样的窗口:

从浏览器启动 SAP GUI

一切看起来都很棒,但是当您单击“允许”按钮时,我们会看到:

从浏览器启动 SAP GUI

哎呀,浏览器把空格键变成了%20。 那么,其他字符也将被编码成带有百分号符号的自己的数字代码。 最令人不快的是,在浏览器级别这里什么也做不了(这里的一切都是根据标准完成的)——浏览器不喜欢这样的字符,Windows命令解释器不处理这样的编码值。 还有一个减号 - 整个字符串作为参数传递,包括协议名称甚至冒号(sapgui.shortcut.文件:)。 而且,虽然同样 sapshcut.exe 可以丢弃不是其参数的所有内容(以符号“-”开头,然后是名称、“=”和值),即一行像“sapgui.shortcut.file:-system=SID“它仍然可以工作,然后没有空格”sapgui.shortcut.file:-system=SID“不再起作用了。

事实证明,原则上,使用 URI 协议有两种选择:

  1. 不带参数使用:我们为所有此类系统创建了一大堆协议 西德曼特类型 AAA200, BBB200 等等。 如果您只需要启动所需的系统,那么该选项非常可行,但在我们的情况下它不合适,因为至少您想转移用户登录名,但不能以这种方式完成。
  2. 使用包装程序来调用 sapshcut.exe или sapgui.exe。 该程序的本质很简单 - 它必须获取浏览器通过 Web 协议传输给它的字符串,并将其转换为 Windows 接收到的表示形式,即将所有字符代码转换回字符(甚至可能根据参数解析字符串),并且已经使用保证正确的命令调用 SAP GUI。 在我们的例子中,它也不完全适合(这就是为什么我什至没有写它),因为我们不足以在所有用户 PC 上添加协议(在域内这仍然可以,尽管它也更好)避免这种做法),但这里我们需要将程序更多地放置在 PC 上,并不断确保在 PC 上重新安装软件时它不会消失。

那些。 我们也放弃了这个选项,因为它不适合我们。

此时我已经开始认为我必须放弃使用浏览器中的必要参数启动 SAP GUI 的想法,但后来我想到你可以在 SAP Logon 中创建一个快捷方式,然后将其复制到您的桌面。 这个方法我用过一次,不过之前并没有专门看快捷方式文件。 事实证明,这个快捷方式是一个普通的文本文件,扩展名为 。树液。 如果您在 Windows 上运行它,SAP GUI 将使用此文件中指定的参数启动。 “答对了!”

这个文件的格式大致如下(启动时也可能有一个事务启动,但我省略了):

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

似乎一切都需要:系统标识符、客户端、用户名甚至密码。 甚至还有额外的参数: 标题 - 窗口标题, 图形尺寸 — 运行窗口的大小(全屏或非全屏)和 重用 — 是否需要打开一个新窗口或使用同一系统中已打开的窗口。 但一个细微的差别立即出现了——原来是SAP Logon中的密码无法设置,线路被封锁了。 事实证明,这样做是出于安全原因:它将 SAP Logon 中创建的所有快捷方式存储在一个文件中 sapshortcut.ini (靠近 saplogon.ini 在 Windows 用户配置文件中),尽管它们已加密,但加密程度并不太高,如果需要,可以解密。 但是您可以通过更改注册表中一个参数的值来解决此问题(默认值为 0):

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

这将解锁 SAP Logon 中快捷方式创建表单上的密码字段:

从浏览器启动 SAP GUI

当您在此字段中输入密码时,它将被放置在相应的行中
sapshortcut.ini,但是当您将快捷方式拖到桌面时,它不会出现在那里 - 但您可以手动将其添加到那里。 密码已加密,对于 111111,密码如下:PW_49B02219D1F6,对于 222222,密码如下:PW_4AB3211AD2F5。 但我们更感兴趣的是,该密码以一种方式加密,与特定的 PC 无关,如果我们将密码重置为初始密码,那么我们可以在该字段中使用一个预先知道的值。 好吧,如果我们想使用随机创建的密码,我们就必须了解该密码的算法。 但从给出的例子来看,这并不难做到。 顺便说一句,在 SAP GUI 7.40 中,该字段从表单中完全消失,但它正确接受带有填写密码的文件。

也就是说,事实证明,在浏览器中,您只需单击指向具有 .sap 扩展名和所需格式的文件的链接 - 它会提供将其作为 SAP GUI 快捷方式类型的文件打开(自然在安装了 SAP GUI 的 PC)并将打开具有指定参数的 SAP GUI 窗口(如果 SID 和客户端对位于该 PC 上的 SAP 登录列表中)。

但是,很明显,没有人会简单地提前创建文件并将其存储在网站上 - 它们必须根据必要的参数生成。 例如,您可以创建一个 PHP 脚本来生成快捷方式(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";
?>

如果您不指定用户名和密码,您将看到以下窗口,要求输入登录名和密码:

从浏览器启动 SAP GUI

如果您仅通过登录,则将填写登录字段,而密码字段将为空。 如果我们为用户提供登录名和密码,但 PC 上的用户将注册表中 [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] 部分的 EnablePassword 项设置为 0,那么我们会得到相同的结果。 并且只有当该键设置为1并且我们同时传递了名称和初始密码时,系统才会立即提示您输入新的永久密码两次。 这就是我们需要得到的。

因此,我们有以下一组经过考虑的选项作为上述所有内容的说明:

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

最后一个选择适合我。 但是,除了生成 SAP 快捷方式之外,您还可以使用其他方法,例如生成 CMD 文件,当从浏览器打开该文件时,也会为您打开 SAP GUI 窗口。 下面是一个例子(sapguicmd.php) 使用完整连接字符串直接启动 SAP GUI,无需配置 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";
?>

来源: habr.com

添加评论