我最初是在博客上写这篇文章的,所以以后我不会再想起和记住,但是由于没有人阅读该博客,所以我想与所有人共享此信息,突然间我可以使用它。在研究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中工作,其次,它需要在浏览器中进行适当的安全设置,可以在组织的域级别禁止该设置,即使启用,浏览器也会向用户提供一个带有警告的窗口:

我在Internet上挖出了解决方案2:
创建自己的Web协议 。 它允许您使用链接来运行我们需要的应用程序,该链接指示我们自己在Windows中HKEY_CLASSES_ROOT部分的注册表中注册的协议。 由于本节中的SAP GUI快捷方式有其自己的子节,因此可以添加具有空值的URL协议字符串参数:

该协议使用
/ SHORTCUT参数启动
sapgui.exe ,这是我们需要的:

好吧,或者如果我们通常想制定一个任意协议(例如
sapshcut ),那么可以使用以下reg文件注册它:
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\""
现在,如果我们
以类似的方式在网页上建立一个指示
Sapgui.Shortcut.File协议的链接:
<a href='Sapgui.Shortcut.File: -system=SID -client=200'>SID200</a>
我们应该看到一个像这样的窗口:

一切似乎都很好,但是当您单击“允许”按钮时,我们看到:

糟糕,浏览器将该空间变成了20%。 好吧,其他字符也将在其数字代码中用百分号编码。 最不愉快的是,在这里浏览器级别上什么也做不了(一切都按照标准完成)-浏览器不喜欢这样的字符,Windows Shell无法使用这样的编码值。 还有一个减号-整个字符串作为参数传递,包括协议的名称甚至冒号(
sapgui.shortcut.file :) 。 而且,尽管同一个
sapshcut.exe可以丢弃不是其参数的所有内容(它以符号“-”开头,然后是名称“ =”和值),即 仍然滚动“
sapgui.shortcut.file:-system = SID ”形式的行,然后没有空格“
sapgui.shortcut.file:-system = SID ”不再起作用。
事实证明,原则上,使用URI协议有两种选择:
- 不带参数使用:我们为所有SIDMANDT类型的系统(例如AAA200 , BBB200等)创建一整套协议。 如果您只需要启动所需的系统,则该选项非常有效,但是在我们的情况下,该选项不起作用,因为至少您也想转移用户的登录名,但是您不能这样做。
- 使用包装程序调用sapshcut.exe或sapgui.exe 。 该程序的本质很简单-它应该采用浏览器将通过Web协议传输给它的代码行,并将其转换为Windows接受的表示形式,即 back将所有字符代码转换为字符(甚至可以通过参数解析字符串),并且已经调用了由正确命令保证的SAP GUI。 对于我们来说,它也不是很合适(因此,我什至没有写过),因为它不足以让我们在所有用户PC上添加协议(在域内,此协议仍然无济于事,尽管最好避免这种做法),但在此情况下,有必要另外将程序放在PC上,甚至进行持续监控,以使在PC上重新安装软件时程序不会消失。
即 此选项也因为不适合我们而被丢弃。
然后,我开始认为我不得不对使用浏览器中必要参数启动SAP GUI的想法说再见,但后来我想到了可以在SAP Logon中创建快捷方式并将其复制到桌面的想法。 我曾经使用过这种方法,但在此之前我没有专门查看快捷方式文件。 事实证明,此快捷方式是扩展名为
.sap的纯文本文件。 并且,如果您在Windows上运行它,则SAP GUI将使用此文件中指定的参数启动。 “宾果!”
该文件的格式大致如下(启动时可能仍然有事务在启动,但我省略了):
[System]
Name=SID
Client=200
[User]
Name=
Language=RU
Password=
[Function]
Title=
[Configuration]
GuiSize=Maximized
[Options]
Reuse=0
似乎只需要这些:系统标识符,客户端,用户名甚至密码。 甚至还有其他参数:
标题 -窗口的标题,
GuiSize-启动的窗口的大小(是否全屏)和
重用 -是打开新窗口还是使用已打开的同一系统窗口。 但是,立即有细微差别出现-事实证明,无法在SAP Logon中设置密码,该行被阻塞了。 事实证明,这样做是出于安全原因:他将在SAP Logon中创建的所有快捷方式存储在
sapshortcut.ini文件中(Windows用户配置文件中
saplogon.ini的旁边),尽管在那里对其进行了加密,但也可以根据需要对其进行过多加密。解码。 但是您也可以通过更改注册表中一个参数的值来解决此问题(默认值为
0 ):
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\SAP\SAPShortcut\Security]
"EnablePassword"="1"
这将解锁SAP Logon中快捷方式表单上的“密码”字段,以输入:

并且在该字段中输入密码时,它将被放置在相应的行中
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]\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"; ?>
如果您未指定用户名和密码,那么我们将从登录名和密码提示中获得以下窗口:

如果仅转移登录名,则将填写登录字段,并且密码字段为空。 如果我们同时向用户传递用户名和密码,但是在用户PC上[HKEY_CURRENT_USER \ Software \ SAP \ SAPShortcut \ Security]部分中的用户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文件的方式,当从浏览器中打开CMD文件时,该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 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"; ?>