ブラウザからSAP GUIを起動する

私は最初にこの記事をブログに書いたので、後で見たり覚えたりすることはありませんが、誰もブログを読んでいないので、この情報を突然便利な人と共有したいと思いました。



SAP R / 3システムでパスワードリセットサービスのアイデアに取り組んでいるときに、ブラウザから必要なパラメータを使用してSAP GUIを起動する方法に関する質問が発生しましたか? このアイデアは、最初にSAP GUIからSOAPリクエストを実行し、パスワードリセットスクリプトを含むWebページへのリンクを含む電子メールを最初のスクリプトに送信してから、パスワードリセットの成功に関するメッセージをユーザーに表示し、この非常に初期のパスワードを表示するWebサービスの使用を暗示しているため、このページにはSAP GUIを起動するリンクもあります。 さらに、このリンクを使用して目的のシステムを開き、できればすぐにログインフィールドとパスワードフィールドに入力してください。ユーザーは生産的なパスワードを2回入力するだけで済みます。



SAP Logonの開始は、私たちの目的にとっては面白くなく、sapgui.exeの開始時にクライアントとユーザー名を指定することはできませんでしたが、SAP Logonで定義されていないシステムを開始することはできました。 一方、任意のサーバーパラメーターを使用してSAP GUIを起動することは特に関係ありません。ユーザーのパスワードをリセットするタスクを解決する場合、おそらく、SAP Logonに必要な設定があり、自分で混乱する必要はありません。 ただし、特定の「ショートカット」を使用してSAP GUIを起動できるようにしたSAP GUIショートカットテクノロジーと実際のプログラムsapshcut.exeは、指定された要件を満たしていました。



額の問題の解決策: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でのみ機能し、次に、ブラウザーの適切なセキュリティ設定が必要です。これは、組織のドメインレベルで禁止できます。有効になっている場合でも、ブラウザーはユーザーに恐ろしい警告を表示します:







インターネットで解決策2を見つけました。 独自のWebプロトコルを作成します 。 HKEY_CLASSES_ROOTセクションのレジストリのWindowsに登録しているプロトコルを示すリンクを使用して、必要なアプリケーションを起動できます。 このセクションのSAP GUIショートカットには独自のサブセクションがあるため、空の値を持つURLプロトコル文字列パラメーターを追加できます。







このプロトコルは、 / SHORTCUTパラメーターを使用してsapgui.exeを開始します。これは必要なものです。







まあ、または一般的な任意のプロトコル(たとえば、 sapshcut )を作成する場合は、次のreg-fileを使用して登録できます。



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プロトコル示すリンクをWebページに作成すると、次のようになります。



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





次の形式のウィンドウが表示されます。







そして、すべてがうまくいくように見えますが、「許可」ボタンをクリックすると、以下が表示されます。







ブラウザがスペースを%20に変えました。 まあ、他の文字もパーセント記号で数値コードにエンコードされます。 そして最も不愉快なことは、ここではブラウザレベルで何もできないことです(すべては標準に従って行われます)-ブラウザはそのような文字を好まず、Windowsシェルはそのようなエンコードされた値では動作しません。 さらにもう1つ-プロトコルの名前とコロン( sapgui.shortcut.file :)を含むストリング全体がパラメーターとして渡されます。 さらに、同じsapshcut.exeは、そのパラメータではないすべてのものを破棄できます(「-」文字で始まり、次に名前、「=」、および値)、つまり 「 sapgui.shortcut.file:-system = SID 」という形式の行は引き続きロールしますが、スペースなしでは「 sapgui.shortcut.file:-system = SID 」は機能しません。



原則として、URIプロトコルを使用するには2つのオプションがあります。



  1. パラメータなしで使用: AAA200BBB200など、 SIDMANDTタイプのすべてのシステム用のプロトコルの束を作成します。 目的のシステムを起動するだけの場合、このオプションは非常に機能しますが、この場合は機能しません。少なくともユーザーのログインも転送したいのですが、この方法ではできません。

  2. ラッパーを使用して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







必要なのは、システム識別子、クライアント、ユーザー名、さらにはパスワードです。 さらに追加のパラメーター: Title-ウィンドウのタイトル、 GuiSize-実行中のウィンドウのサイズ(フルスクリーンかどうか)およびReuse-新しいウィンドウを開くか、同じシステムで既に開いているウィンドウを使用するか。 しかし、すぐにニュアンスが出てきました-SAP Logonでパスワードを設定することが不可能であることが判明し、回線がブロックされました。 これはセキュリティ上の理由で行われたことが判明しました:SAP Logonで作成されたすべてのショートカットをsapshortcut.iniファイル(Windowsユーザープロファイルのsaplogon.iniの隣)に保存し、そこで暗号化されていますが、必要に応じて暗号化することができます。デコードします。 ただし、レジストリ内の1つのパラメーターの値を変更することでこれを解決することもできます(デフォルト値は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に依存しない1つの方法で暗号化されているという事実に関心があり、パスワードを初期パスワードにリセットする場合、このフィールドで既知の値を使用できます。 ランダムに生成されたパスワードを使用する場合、この暗号のアルゴリズムを理解する必要があります。 しかし、与えられた例から判断すると、これは難しくありません。 ところで、SAP GUI 7.40では、このフィールドは通常フォームから消えましたが、パスワードが入力されたファイルを正しく認識します。



つまり、ブラウザで.sap拡張子と目的の形式のファイルへのリンクをクリックするだけで十分であり、SAP GUIショートカットタイプのファイルとして(当然、SAP GUIがインストールされたPCで)開くことを提案し、指定されたSAP GUIウィンドウを開きますパラメータ(SIDとクライアントのペアがこのPCのSAPログオンリストにある場合)。



しかし、事前にサイト上でファイルを作成して保存する人はいないことは明らかです。必要なパラメーターに基づいてファイルを生成する必要があります。 たとえば、ショートカット( sapshcut.php )を生成するスクリプトを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に設定され、名前と初期パスワードの両方を転送する場合にのみ、システムはすぐに新しい永久パスワードを2回入力するように要求します。 受信に必要なもの。



その結果、上記のすべての実例として考えられる次のオプションセットがあります。



 <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 GUIウィンドウも開くSAPショートカットを生成する代わりに、CMDファイルの生成を使用することもできます。 以下は、SAP Logonを設定せずに、完全な接続文字列でSAP GUIを直接起動する例( sapguicmd.php )です。



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






All Articles