從瀏覽器啟動 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.exesapgui.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 Shortcut 之類的文件打開(當然在PC 上)安裝了 SAP GUI)並將開啟具有指定參數的 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";
?>

來源: www.habr.com

添加評論