SAP GUI'yi bir tarayıcıdan başlatma

Bu yazıyı ilk olarak kendi blogumda yazdım. Blog, daha sonra tekrar arayıp hatırlamamak için, ancak blogu kimse okumadığı için, belki birilerinin işine yarar diye bu bilgiyi herkesle paylaşmak istedim.

SAP R/3 sistemlerinde şifre sıfırlama hizmeti fikri üzerinde çalışırken bir soru ortaya çıktı: SAP GUI'yi tarayıcıdan gerekli parametrelerle nasıl başlatabilirim? Bu fikir bir web hizmetinin kullanılmasını gerektirdiğinden, önce SAP GUI'den gelen bir SOAP isteğine yanıt vermek ve parolayı ilk parolaya sıfırlamak için bir komut dosyası içeren bir web sayfasına bağlantı içeren bir mektup göndermek ve ardından kullanıcıya görüntülemek Başarılı parola sıfırlamayla ilgili bir mesaj ve bu ilk parolayı görüntüleyen bir mesaj alırsam, bu sayfanın ayrıca SAP GUI'yi başlatmak için bir bağlantıya sahip olmasını isterim. Ayrıca, bu bağlantı istenen sistemi açmalıdır ve tercihen kullanıcı adı ve şifre alanları aynı anda doldurulmalıdır: kullanıcının üretken şifreyi yalnızca iki kez doldurması gerekecektir.

SAP Logon'u başlatmak amacımız açısından ilginç değildi ve sapgui.exe'yi çalıştırırken istemci ve kullanıcı adını belirtmek imkansızdı ancak SAP Logon'da tanımlanmayan bir sistemi başlatmak mümkündü. Öte yandan, SAP GUI'yi rastgele sunucu parametreleriyle başlatmak özellikle alakalı değildi: bir kullanıcının şifresini sıfırlama sorununu çözüyorsak, o zaman büyük olasılıkla SAP Logon'da ihtiyaç duyduğu ayarlarla gerekli satıra zaten sahiptir ve orada kendiyle uğraşmaya gerek yok. Ancak belirtilen gereksinimler, SAP GUI Kısayol teknolojisi ve sapshcut.exe programının kendisi tarafından karşılandı ve bu, SAP GUI'nin belirli bir "kısayol" kullanılarak başlatılmasını mümkün kıldı.

Sorunu doğrudan çözmek: sapshcut.exe'yi bir ActiveX nesnesi kullanarak doğrudan tarayıcıdan başlatmak:

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

Çözüm kötü: birincisi, yalnızca Internet Explorer'da çalışıyor, ikincisi, tarayıcıda uygun güvenlik ayarları gerektiriyor; bu, bir kuruluşta etki alanı düzeyinde yasaklanmış olabilir ve izin verilse bile, tarayıcı korkutucu bir pencere görüntüler. kullanıcıya uyarı:

SAP GUI'yi bir tarayıcıdan başlatma

İnternette 2 numaralı çözümü buldum: kendi web protokolünüzü oluşturma. İhtiyacımız olan uygulamayı, Windows'ta HKEY_CLASSES_ROOT bölümündeki kayıt defterine kaydettiğimiz protokolü belirten bir bağlantı kullanarak başlatmamızı sağlar. SAP GUI Kısayolunun bu bölümde kendi alt bölümü olduğundan, buraya boş bir değerle URL Protokolü dizesi parametresini ekleyebilirsiniz:

SAP GUI'yi bir tarayıcıdan başlatma

Bu protokol başlar sapgui.exe parametreli /KISAYOLtam olarak ihtiyacımız olan şey bu:

SAP GUI'yi bir tarayıcıdan başlatma

Peki ya tamamen keyfi bir protokol yapmak istiyorsak (örneğin, sapshcut), ardından aşağıdaki reg dosyasını kullanarak kaydedebilirsiniz:

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

Şimdi, bir web sayfasında protokolü belirten bir bağlantı yaparsak Sapgui.Kısayol.Dosyası Benzer bir yolla:

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

Şöyle bir pencere görmeliyiz:

SAP GUI'yi bir tarayıcıdan başlatma

Ve her şey harika görünüyor, ancak "İzin Ver" düğmesine tıkladığınızda şunu görüyoruz:

SAP GUI'yi bir tarayıcıdan başlatma

Hata! Tarayıcı boşluk çubuğunu %20'ye çevirdi. Diğer karakterler de yüzde simgesiyle kendi sayısal kodlarına kodlanacak. Ve en tatsız olan şey, burada tarayıcı düzeyinde hiçbir şey yapılamamasıdır (burada her şey standarda göre yapılır) - tarayıcı bu tür karakterleri sevmez ve Windows komut yorumlayıcısı bu tür kodlanmış değerlerle çalışmaz. Ve bir eksi daha - protokol adı ve hatta iki nokta üst üste de dahil olmak üzere dizenin tamamı parametre olarak iletilir (sapgui.shortcut.file:). Üstelik her ne kadar aynı sapshcut.exe kendisi için parametre olmayan her şeyi atabilir ("-" sembolüyle başlar, ardından ad, "=" ve değer), yani "gibi bir satırsapgui.shortcut.file: -system=SID"hala çalışacak, o zaman boşluk kalmayacak"sapgui.shortcut.file:-system=SID"Artık çalışmıyor.

Prensip olarak URI protokolünü kullanmak için iki seçeneğin olduğu ortaya çıktı:

  1. Parametresiz kullanma: Bu türdeki tüm sistemlerimiz için bir sürü protokol oluşturuyoruz SIDMANDTGibi AAA200, BBB200 ve benzeri. Sadece istenen sistemi başlatmanız gerekiyorsa, seçenek oldukça uygulanabilir, ancak bizim durumumuzda uygun değil, çünkü en azından kullanıcı giriş bilgilerini aktarmak istiyorsunuz, ancak bu bu şekilde yapılamaz.
  2. Aramak için sarmalayıcı program kullanma sapshcut.exe veya sapgui.exe. Bu programın özü basittir - tarayıcının kendisine web protokolü aracılığıyla ilettiği dizeyi almalı ve onu Windows'un aldığı temsile dönüştürmelidir; tüm karakter kodlarını tekrar karakterlere dönüştürür (hatta belki dizeyi parametrelere göre ayrıştırır) ve zaten garantili doğru komutla SAP GUI'yi çağırır. Bizim durumumuzda da tamamen uygun değil (bu yüzden yazmadım bile), çünkü protokolü tüm kullanıcı bilgisayarlarına eklemek bizim için yeterli değil (bir etki alanı içinde bu hala sorun değil, ancak aynı zamanda daha iyi bu uygulamadan kaçının), ancak burada programı PC'ye daha fazla yerleştirmemiz ve ayrıca yazılım PC'ye yeniden yüklendiğinde kaybolmamasını sürekli olarak sağlamamız gerekecek.

Onlar. Bu seçeneği de bizim için uygun olmadığından bir kenara atıyoruz.

Bu noktada, SAP GUI'yi tarayıcıdan gerekli parametrelerle başlatma fikrine veda etmem gerektiğini düşünmeye başlamıştım, ancak daha sonra SAP Logon'da bir kısayol yapabileceğiniz fikri aklıma geldi ve masaüstünüze kopyalayın. Bu yöntemi bir kez kullandım ancak ondan önce kısayol dosyasına özellikle bakmadım. Ve bu kısayolun, uzantıya sahip normal bir metin dosyası olduğu ortaya çıktı. .sap. Ve Windows'ta çalıştırırsanız SAP GUI bu dosyada belirtilen parametrelerle başlayacaktır. "Bingo!"

Bu dosyanın formatı yaklaşık olarak aşağıdaki gibidir (başlangıçta başlatılan bir işlem de olabilir, ancak onu atladım):

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

Görünüşe göre ihtiyaç duyulan her şey: bir sistem tanımlayıcısı, bir istemci, bir kullanıcı adı ve hatta bir şifre. Ve hatta ek parametreler: Başlık - pencere başlığı, Gui Boyutu — çalışan pencerenin boyutu (tam ekran olsun ya da olmasın) ve Yeniden — aynı sistemde yeni bir pencere açmanın mı yoksa zaten açık olan bir pencereyi kullanmanın mı gerekli olduğu. Ancak hemen bir nüans ortaya çıktı - SAP Logon'daki şifrenin ayarlanamadığı, hattın engellendiği ortaya çıktı. Bunun güvenlik nedeniyle yapıldığı ortaya çıktı: SAP Logon'da oluşturulan tüm kısayolları bir dosyada saklıyor sapshortcut.ini (Yakın saplogon.ini Windows kullanıcı profilinde) ve orada şifrelenmiş olmalarına rağmen çok güçlü bir şekilde şifrelenmezler ve istenirse şifreleri çözülebilir. Ancak kayıt defterindeki bir parametrenin değerini değiştirerek bu sorunu çözebilirsiniz (varsayılan değer: 0):

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

Bu, SAP Logon'daki kısayol oluşturma formuna giriş için Parola alanının kilidini açar:

SAP GUI'yi bir tarayıcıdan başlatma

Ve bu alana bir şifre girdiğinizde ilgili satıra yerleştirilecektir.
sapshortcut.ini, ancak bir kısayolu masaüstüne sürüklediğinizde orada görünmez - ancak oraya manuel olarak ekleyebilirsiniz. Şifre şifrelenmiştir, 111111 için şu şekilde olacaktır: PW_49B02219D1F6, 222222 için - PW_4AB3211AD2F5. Ancak bu şifrenin belirli bir bilgisayardan bağımsız olarak tek bir şekilde şifrelenmesiyle daha çok ilgileniyoruz ve şifreyi ilk şifreye sıfırlarsak, bu alanda önceden bilinen bir değeri kullanabiliriz. Peki, eğer rastgele oluşturulmuş bir şifre kullanmak istiyorsak, bu şifrenin algoritmasını anlamamız gerekecek. Ancak verilen örneklere bakılırsa bunu yapmak zor olmayacak. Bu arada, SAP GUI 7.40'ta bu alan formdan tamamen kayboldu, ancak doldurulmuş parolaya sahip bir dosyayı doğru şekilde kabul ediyor.

Yani, tarayıcıda .sap uzantılı ve istenen formattaki bir dosyanın bağlantısını tıklamanız gerektiği ortaya çıktı - ve onu SAP GUI Kısayolu gibi bir dosya olarak açmayı teklif edecek (doğal olarak bir PC'de) SAP GUI yüklü) ve belirtilen parametrelerle bir SAP GUI penceresi açacaktır (SID ve istemci çifti bu bilgisayardaki SAP Oturum Açma listesindeyse).

Ancak hiç kimsenin önceden dosya oluşturup bunları sitede saklamayacağı açıktır - bunların gerekli parametrelere göre oluşturulması gerekir. Örneğin, kısayollar oluşturmak için bir PHP betiği oluşturabilirsiniz (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";
?>

Kullanıcı adı ve şifre belirtmezseniz, kullanıcı adı ve şifre isteyen aşağıdaki pencereyle karşılaşacaksınız:

SAP GUI'yi bir tarayıcıdan başlatma

Sadece giriş bilgilerini geçerseniz giriş alanı doldurulacak, şifre alanı ise boş kalacaktır. Kullanıcıya hem giriş hem de şifre verirsek ancak PC'deki kullanıcının kayıt defterinde [HKEY_CURRENT_USERSoftwareSAPSAShortcutSecurity] bölümündeki EnablePassword anahtarı 0 olarak ayarlanmışsa, o zaman aynı şeyi elde ederiz. Ve yalnızca bu anahtar 1'e ayarlıysa ve hem adı hem de ilk şifreyi iletirsek, sistem hemen yeni bir kalıcı şifreyi iki kez girmenizi isteyecektir. Almamız gereken şey buydu.

Sonuç olarak, yukarıdakilerin hepsinin bir örneği olarak aşağıdaki dikkate alınan seçeneklere sahibiz:

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

Son seçenek bana uygundu. Ancak SAP kısayolları oluşturmak yerine, örneğin, bir tarayıcıdan açıldığında sizin için SAP GUI penceresini de açacak olan CMD dosyaları oluşturmayı da kullanabilirsiniz. Aşağıda bir örnek verilmiştir (sapguicmd.php) SAP Logon'un yapılandırılmasına gerek kalmadan doğrudan SAP GUI'yi tam bağlantı dizesiyle başlatın:

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

Kaynak: habr.com

Yorum ekle