Khởi chạy GUI SAP từ trình duyệt

Lần đầu tiên tôi viết bài này trong Blog, để sau này không phải tìm kiếm lại, nhưng vì không có ai đọc blog nên tôi muốn chia sẻ thông tin này với mọi người, phòng trường hợp ai đó thấy hữu ích.

Khi đang nghiên cứu ý tưởng về dịch vụ đặt lại mật khẩu trong hệ thống SAP R/3, một câu hỏi đã nảy sinh - làm cách nào để khởi chạy GUI SAP với các thông số cần thiết từ trình duyệt? Vì ý tưởng này ngụ ý việc sử dụng dịch vụ web, trước tiên hãy phản hồi yêu cầu SOAP từ GUI SAP và gửi một lá thư có liên kết đến một trang web có tập lệnh đặt lại mật khẩu về mật khẩu ban đầu, sau đó hiển thị cho người dùng một thông báo về việc đặt lại mật khẩu thành công và hiển thị mật khẩu ban đầu này, sau đó tôi muốn trang này cũng có liên kết để khởi chạy GUI SAP. Hơn nữa, liên kết này sẽ mở ra hệ thống mong muốn và tốt nhất là điền các trường thông tin đăng nhập và mật khẩu cùng một lúc: người dùng sẽ chỉ phải điền mật khẩu hiệu quả hai lần.

Việc khởi chạy SAP Logon không phù hợp với mục đích của chúng tôi và khi chạy sapgui.exe, không thể chỉ định khách hàng và tên người dùng, nhưng có thể khởi chạy một hệ thống không được xác định trong SAP Logon. Mặt khác, việc khởi chạy SAP GUI với các tham số máy chủ tùy ý không có liên quan đặc biệt: nếu chúng ta đang giải quyết vấn đề đặt lại mật khẩu của người dùng, thì rất có thể anh ta đã có dòng cần thiết trong SAP Logon, với các cài đặt anh ta cần, và ở đó không cần phải gây rối với chính mình. Nhưng các yêu cầu cụ thể đã được đáp ứng bởi công nghệ Lối tắt GUI SAP và chính chương trình sapshcut.exe, giúp khởi chạy GUI SAP bằng một “phím tắt” cụ thể.

Giải quyết vấn đề trực tiếp: khởi chạy sapshcut.exe trực tiếp từ trình duyệt bằng đối tượng 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');
}

Giải pháp này rất tệ: thứ nhất, nó chỉ hoạt động trong Internet Explorer, thứ hai, nó yêu cầu cài đặt bảo mật thích hợp trong trình duyệt, cài đặt này trong một tổ chức có thể bị cấm ở cấp miền và ngay cả khi được phép, trình duyệt sẽ hiển thị một cửa sổ có nội dung đáng sợ. cảnh báo cho người dùng:

Khởi chạy GUI SAP từ trình duyệt

Tôi tìm thấy giải pháp số 2 trên Internet: tạo giao thức web của riêng bạn. Cho phép chúng tôi khởi chạy ứng dụng mà chúng tôi cần bằng cách sử dụng liên kết chỉ ra giao thức mà chính chúng tôi đăng ký trong Windows trong sổ đăng ký ở phần HKEY_CLASSES_ROOT. Vì Lối tắt GUI của SAP có phần phụ riêng trong phần này, nên bạn có thể thêm tham số chuỗi Giao thức URL với giá trị trống ở đó:

Khởi chạy GUI SAP từ trình duyệt

Giao thức này bắt đầu sapgui.exe với tham số /ĐƯỜNG TẮT, đó chính xác là những gì chúng ta cần:

Khởi chạy GUI SAP từ trình duyệt

Chà, hoặc nếu chúng ta muốn tạo một giao thức hoàn toàn tùy ý (ví dụ: cắt nhựa), thì bạn có thể đăng ký nó bằng tệp reg sau:

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

Bây giờ, nếu chúng ta tạo một liên kết trên một trang web chỉ ra giao thức Sapgui.Shortcut.File Theo cách tương tự:

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

Chúng ta sẽ thấy một cửa sổ như thế này:

Khởi chạy GUI SAP từ trình duyệt

Và mọi thứ có vẻ tuyệt vời, nhưng khi bạn nhấp vào nút “Cho phép”, chúng tôi thấy:

Khởi chạy GUI SAP từ trình duyệt

Rất tiếc, trình duyệt đã chuyển phím cách thành %20. Chà, các ký tự khác cũng sẽ được mã hóa thành mã số riêng với ký hiệu phần trăm. Và điều khó chịu nhất là không thể làm gì ở cấp độ trình duyệt (mọi thứ ở đây đều được thực hiện theo tiêu chuẩn) - trình duyệt không thích những ký tự như vậy và trình thông dịch lệnh Windows không hoạt động với các giá trị được mã hóa như vậy. Và một điểm trừ nữa - toàn bộ chuỗi được truyền dưới dạng tham số, bao gồm tên giao thức và thậm chí cả dấu hai chấm (sapgui.shortcut.file:). Hơn nữa, mặc dù giống nhau sapshcut.exe có thể loại bỏ mọi thứ không phải là tham số cho nó (bắt đầu bằng ký hiệu “-“, sau đó là tên, “=” và giá trị), tức là. một dòng như "sapgui.shortcut.file: -system=SID"nó vẫn hoạt động, sau đó không có khoảng trống"sapgui.shortcut.file:-system=SID"công việc ngắn hạn.

Về nguyên tắc, có hai tùy chọn để sử dụng giao thức URI:

  1. Sử dụng không có tham số: Chúng tôi tạo ra một loạt giao thức cho tất cả các loại hệ thống của chúng tôi SIDMANDT, như AAA200, BBB200 và như thế. Nếu bạn chỉ cần khởi động hệ thống mong muốn, thì tùy chọn này khá khả thi, nhưng trong trường hợp của chúng tôi, nó không phù hợp, vì ít nhất bạn muốn chuyển thông tin đăng nhập của người dùng, nhưng điều này không thể thực hiện được theo cách này.
  2. Sử dụng chương trình bao bọc để gọi sapshcut.exe hoặc sapgui.exe. Bản chất của chương trình này rất đơn giản - nó phải lấy chuỗi mà trình duyệt truyền đến nó thông qua giao thức web và biến nó thành biểu diễn mà Windows nhận được, tức là. biến tất cả các mã ký tự trở lại thành ký tự (thậm chí có thể phân tích chuỗi theo tham số) và đã gọi SAP GUI bằng lệnh chính xác được đảm bảo. Trong trường hợp của chúng tôi, nó cũng không hoàn toàn phù hợp (đó là lý do tại sao tôi thậm chí không viết nó), bởi vì việc thêm giao thức trên tất cả các PC của người dùng là không đủ (trong một miền, điều này vẫn ổn, mặc dù cũng tốt hơn nếu tránh thực hành này), nhưng ở đây chúng ta sẽ cần đặt chương trình nhiều hơn trên PC và cũng liên tục đảm bảo rằng nó không biến mất khi cài đặt lại phần mềm trên PC.

Những thứ kia. Chúng tôi cũng loại bỏ tùy chọn này vì không phù hợp với chúng tôi.

Tại thời điểm này, tôi đã bắt đầu nghĩ rằng mình sẽ phải tạm biệt ý tưởng khởi chạy SAP GUI với các thông số cần thiết từ trình duyệt, nhưng sau đó tôi chợt nảy ra ý tưởng rằng bạn có thể tạo một lối tắt trong SAP Logon và sao chép nó vào máy tính để bàn của bạn. Tôi đã sử dụng phương pháp này một lần, nhưng trước đó tôi không xem cụ thể tệp lối tắt. Và hóa ra lối tắt này là một file văn bản thông thường có phần mở rộng .nhựa cây. Và nếu bạn chạy nó trên Windows, SAP GUI sẽ khởi chạy với các tham số được chỉ định trong tệp này. "Chơi lô tô!"

Định dạng của tệp này gần như sau (cũng có thể có một giao dịch được khởi chạy khi khởi động, nhưng tôi đã bỏ qua nó):

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

Có vẻ như mọi thứ đều cần thiết: mã định danh hệ thống, ứng dụng khách, tên người dùng và thậm chí cả mật khẩu. Và thậm chí các tham số bổ sung: Yêu sách - tiêu đề cửa sổ, GuiSize — kích thước của cửa sổ đang chạy (toàn màn hình hoặc không) và Tái sử dụng — liệu có cần thiết phải mở một cửa sổ mới hay sử dụng cửa sổ đã mở trên cùng một hệ thống hay không. Nhưng một sắc thái ngay lập tức xuất hiện - hóa ra không thể đặt mật khẩu trong SAP Logon, đường dây đã bị chặn. Hóa ra điều này được thực hiện vì lý do bảo mật: nó lưu trữ tất cả các phím tắt được tạo trong Đăng nhập SAP vào một tệp sapshortcut.ini (Gần saplogon.ini trong hồ sơ người dùng Windows) và ở đó, mặc dù chúng đã được mã hóa nhưng chúng không được mã hóa quá mạnh và nếu muốn, chúng có thể được giải mã. Nhưng bạn có thể giải quyết vấn đề này bằng cách thay đổi giá trị của một tham số trong sổ đăng ký (giá trị mặc định là 0):

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

Thao tác này sẽ mở khóa trường Mật khẩu để nhập vào biểu mẫu tạo lối tắt trong Đăng nhập SAP:

Khởi chạy GUI SAP từ trình duyệt

Và khi bạn nhập mật khẩu vào trường này, nó sẽ được đặt ở dòng tương ứng
sapshortcut.ini, nhưng khi bạn kéo một phím tắt vào màn hình nền, nó không xuất hiện ở đó - nhưng bạn có thể thêm nó vào đó theo cách thủ công. Mật khẩu được mã hóa, đối với 111111 sẽ như sau: PW_49B02219D1F6, đối với 222222 - PW_4AB3211AD2F5. Nhưng chúng tôi quan tâm hơn đến thực tế là mật khẩu này được mã hóa theo một cách, không phụ thuộc vào PC cụ thể và nếu chúng tôi đặt lại mật khẩu về mật khẩu ban đầu, thì chúng tôi có thể sử dụng một giá trị đã biết trước trong trường này. Chà, nếu muốn sử dụng mật khẩu được tạo ngẫu nhiên, chúng ta sẽ phải hiểu thuật toán của mật mã này. Nhưng xét theo các ví dụ được đưa ra, điều này sẽ không khó thực hiện. Nhân tiện, trong SAP GUI 7.40, trường này hoàn toàn biến mất khỏi biểu mẫu, nhưng nó chấp nhận chính xác một tệp có mật khẩu đã điền.

Nghĩa là, hóa ra trong trình duyệt, bạn chỉ cần nhấp vào liên kết đến một tệp có phần mở rộng .sap và định dạng mong muốn - và nó sẽ đề xuất mở tệp đó dưới dạng tệp như SAP GUI Shortcut (tự nhiên trên PC với SAP GUI được cài đặt) và sẽ mở cửa sổ SAP GUI với các tham số được chỉ định (nếu cặp SID và máy khách có trong danh sách Đăng nhập SAP trên PC này).

Tuy nhiên, rõ ràng là không ai chỉ cần tạo trước các tệp và lưu trữ chúng trên trang web - chúng phải được tạo dựa trên các thông số cần thiết. Ví dụ: bạn có thể tạo tập lệnh PHP để tạo lối tắt (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";
?>

Nếu bạn không chỉ định tên người dùng và mật khẩu, bạn sẽ nhận được cửa sổ sau yêu cầu đăng nhập và mật khẩu:

Khởi chạy GUI SAP từ trình duyệt

Nếu bạn chỉ chuyển thông tin đăng nhập, trường đăng nhập sẽ được điền và trường mật khẩu sẽ trống. Nếu chúng tôi cung cấp cho người dùng cả thông tin đăng nhập và mật khẩu, nhưng người dùng trên PC có khóa EnablePassword trong sổ đăng ký trong phần [HKEY_CURRENT_USERSoftwareSAPSAPShortcutSecurity] được đặt thành 0, thì chúng tôi cũng nhận được điều tương tự. Và chỉ khi khóa này được đặt thành 1 và chúng tôi chuyển cả tên và mật khẩu ban đầu, hệ thống sẽ ngay lập tức nhắc bạn nhập mật khẩu vĩnh viễn mới hai lần. Đó là những gì chúng tôi cần để có được.

Kết quả là chúng ta có tập hợp các tùy chọn được xem xét sau đây để minh họa cho tất cả những điều trên:

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

Tùy chọn cuối cùng phù hợp với tôi. Nhưng thay vì tạo các phím tắt SAP, bạn cũng có thể sử dụng, chẳng hạn như tạo các tệp CMD, khi mở từ trình duyệt, nó cũng sẽ mở cửa sổ GUI SAP cho bạn. Dưới đây là một ví dụ (sapguicmd.php) trực tiếp khởi chạy GUI SAP với chuỗi kết nối đầy đủ mà không cần phải cấu hình Đăng nhập SAP:

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

Nguồn: www.habr.com

Thêm một lời nhận xét