Sap Logon автоматизирует вход в систему с помощью vsbcript - PullRequest
0 голосов
/ 09 мая 2018

Я использую VBScript для автоматического входа в SAP GUI. Он автоматически открывает окно SAP GUI, загружает сервер SAP, но не заполняет автоматически поля пользователя и пароля (остаются пустыми).

Это также приводит к ошибке сценария в строке 52, символ 4:

Перечислитель коллекции не может найти элемент en с указанным индексом.

Код следующий:

REM The following script was written to log into the SAP server automatically.
REM To view historical information and credit for this script please see
REM the following thread on the SAP Community Network:
REM http://scn.sap.com/thread/3763970

REM This script was last updated by Paul Street on 7/1/15

REM Directives
    Option Explicit

  REM Variables!  Must declare before using because of Option Explicit
    Dim WSHShell, SAPGUIPath, SID, InstanceNo, WinTitle, SapGuiAuto, application, connection, session

  REM Main
    Set WSHShell = WScript.CreateObject("WScript.Shell")
    If IsObject(WSHShell) Then

      REM Set the path to the SAP GUI directory
        SAPGUIPath = "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\"

      REM Set the SAP system ID
        SID = "eaiserver.domain.com"

      REM Set the instance number of the SAP system
        InstanceNo = "38"

      REM Starts the SAP GUI
        WSHShell.Exec SAPGUIPath & "SAPgui.exe " & SID & " " & _
          InstanceNo

      REM Set the title of the SAP GUI window here
        WinTitle = "SAP"

      While Not WSHShell.AppActivate(WinTitle)
        WScript.Sleep 250
      Wend

      Set WSHShell = Nothing
    End If

    REM Remove this if you need to test the above script and want a message box at the end launching the login screen.
    REM MsgBox "Here now your script..." 

    If Not IsObject(application) Then
       Set SapGuiAuto  = GetObject("SAPGUI")
       Set application = SapGuiAuto.GetScriptingEngine
    End If
    If Not IsObject(connection) Then
       Set connection = application.Children(0)
    End If
    If Not IsObject(session) Then
       Set session    = connection.Children(0)
    End If
    If IsObject(WScript) Then
       WScript.ConnectObject session,     "on"
       WScript.ConnectObject application, "on"
    End If
    session.findById("wnd[0]").maximize
    session.findById("wnd[0]/usr/txtRSYST-MANDT").Text = "100"
    session.findById("wnd[0]/usr/txtRSYST-BNAME").text = "I'veInsertedtheCorrectUsernameHere"
    session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = "I'veInsertedtheCorrectPassHere"
    session.findById("wnd[0]/usr/txtRSYST-LANGU").Text = "PT"
    session.findById("wnd[0]/usr/pwdRSYST-BCODE").setFocus
    session.findById("wnd[0]/usr/pwdRSYST-BCODE").caretPosition = 10
    session.findById("wnd[0]").sendVKey 0

Спасибо за помощь!

1 Ответ

0 голосов
/ 14 августа 2018

Я использую тот же сценарий, который я нашел где-то на справочных форумах SAP.

Когда я сталкивался с этой проблемой раньше, обычно потому, что окно SAP GUI было загружено ПОСЛЕ строк

session.findById("wnd[0]/usr/txtRSYST-BNAME").text = "username"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = "password"

Есть два способа исправить этот конкретный скрипт. Один из них - добавить MsgBox, который приостановит выполнение сценария, но даст SAP GUI достаточно времени для загрузки. Другое - добавить WScript.Sleep(<a few seconds>), чтобы разрешить загрузку SAP GUI. Вот так ...

Обратите внимание, что приведенный ниже код имеет ОБА примеры, но необходим только 1. Я предпочитаю .Sleep(), потому что он не требует внешнего ввода от пользователя.

If IsObject(WSHShell) Then
    ' Removed for clarity
End If

MsgBox "Click OK to continue" ' <-- MsgBox to pause script
WScript.Sleep(5000) ' <--- Wait 5 seconds for SAP GUI to load

If Not IsObject(application) Then
   Set SapGuiAuto  = GetObject("SAPGUI")
   Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)
End If
If Not IsObject(session) Then
   Set session    = connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session,     "on"
   WScript.ConnectObject application, "on"
End If
session.findById("wnd[0]").resizeWorkingPane 164,40,false
session.findById("wnd[0]/usr/txtRSYST-BNAME").text = "username"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = "password"
session.findById("wnd[0]/usr/pwdRSYST-BCODE").setFocus
session.findById("wnd[0]/usr/pwdRSYST-BCODE").caretPosition = 14
session.findById("wnd[0]").sendVKey 0

И, конечно, хранение имени пользователя и пароля в виде простого текста не является хорошей практикой. Однако запутывание паролей с помощью VBScript InputBox() невозможно. Вам придется использовать командную строку или создать объект IE, который выходит за рамки этого вопроса

...