使用C#和SSO进行连接

2020-09-22 10:45发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好。
我正在开发一个脚本应用程序,该应用程序将使用C#表单来获取和使用通过SAP自动化系统收集的数据。 但是,当我启动代码并建立连接时,我输入了SSO的数据,SAP会自动打开GUI。 但是,我的代码如果停在第一个标记处,则无法从sapconnection检索guisession。

如果我直到第二个标记,则检索需要关闭的会话(仅允许1个登录名),并且 然后,如果我关闭另一个会话,我会遇到相同的问题(我无法获取guissession)。

有人可以帮助我吗? (是解释还是附带样本?)

先谢谢!!

遵循代码:

使用系统;
 使用System.Collections.Generic;
 使用System.Linq;
 使用System.Text;
 使用System.Windows.Forms;
 使用System.Threading.Tasks;
 使用SAPFEWSELib;

 命名空间SAPGuiAutomated
 {
    //为SAP应用程序,连接和会话对象以及常见方法创建了一个类。
     公共类SAPActive
     {
         公共静态GuiApplication SapGuiApp {get; 组;  }
         公共静态GuiConnection SapConnection {get; 组;  }
         公共静态GuiSession SapSession { 组;  }

         公共无效start()
         {
              openSap(" DEFAULT");

         }

         公共无效openSap(string env)
         {
            
           
             SAPActive.SapGuiApp =新的GuiApplication();

              字符串connectString = null;
             如果(env.ToUpper()。Equals(" DEFAULT"))
             {
                 connectString ="我的系统"; //样本名称
             }
             其他
             {
                 connectString = env;
             }

            SapConnection = SapGuiApp.OpenConnection(connectString,Sync:true); //创建连接
           ////********* 1ST MARK SAMPLE
             
             SapROTWr.CSapROTWrapper sapROTWrapper =新的SapROTWr.CSapROTWrapper();
             对象SapGuilRot = sapROTWrapper.GetROTEntry(" SAPGUI");
             对象引擎= SapGuilRot.GetType()。InvokeMember(" GetScriptingEngine",System.Reflection.BindingFlags.InvokeMethod,null,SapGuilRot,null);
             GuiConnection connection =(引擎为GuiApplication).OpenConnection(connectString);
             GuiSession session = connection.Children.ElementAt(0)作为GuiSession;
             session.ActiveWindow.Close();
////* 2ND MARK
         }
        
         }
 } 

但是


         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好。
我正在开发一个脚本应用程序,该应用程序将使用C#表单来获取和使用通过SAP自动化系统收集的数据。 但是,当我启动代码并建立连接时,我输入了SSO的数据,SAP会自动打开GUI。 但是,我的代码如果停在第一个标记处,则无法从sapconnection检索guisession。

如果我直到第二个标记,则检索需要关闭的会话(仅允许1个登录名),并且 然后,如果我关闭另一个会话,我会遇到相同的问题(我无法获取guissession)。

有人可以帮助我吗? (是解释还是附带样本?)

先谢谢!!

遵循代码:

使用系统;
 使用System.Collections.Generic;
 使用System.Linq;
 使用System.Text;
 使用System.Windows.Forms;
 使用System.Threading.Tasks;
 使用SAPFEWSELib;

 命名空间SAPGuiAutomated
 {
    //为SAP应用程序,连接和会话对象以及常见方法创建了一个类。
     公共类SAPActive
     {
         公共静态GuiApplication SapGuiApp {get; 组;  }
         公共静态GuiConnection SapConnection {get; 组;  }
         公共静态GuiSession SapSession { 组;  }

         公共无效start()
         {
              openSap(" DEFAULT");

         }

         公共无效openSap(string env)
         {
            
           
             SAPActive.SapGuiApp =新的GuiApplication();

              字符串connectString = null;
             如果(env.ToUpper()。Equals(" DEFAULT"))
             {
                 connectString ="我的系统"; //样本名称
             }
             其他
             {
                 connectString = env;
             }

            SapConnection = SapGuiApp.OpenConnection(connectString,Sync:true); //创建连接
           ////********* 1ST MARK SAMPLE
             
             SapROTWr.CSapROTWrapper sapROTWrapper =新的SapROTWr.CSapROTWrapper();
             对象SapGuilRot = sapROTWrapper.GetROTEntry(" SAPGUI");
             对象引擎= SapGuilRot.GetType()。InvokeMember(" GetScriptingEngine",System.Reflection.BindingFlags.InvokeMethod,null,SapGuilRot,null);
             GuiConnection connection =(引擎为GuiApplication).OpenConnection(connectString);
             GuiSession session = connection.Children.ElementAt(0)作为GuiSession;
             session.ActiveWindow.Close();
////* 2ND MARK
         }
        
         }
 } 

但是


付费偷看设置
发送
2条回答
四川大学会员
1楼-- · 2020-09-22 11:08

你好马可,

我不是C#专家,但是我使用PowerShell和SAP GUI脚本。 在我的情况下,$ Conn(这是您的可变SapConnection)是System .__ ComObject。 因此,有必要将System .__ ComObject转换为另一种类型。 无需使用SAP ROT包装器。 仅使用x86环境非常重要。 这是我的示例代码。

#-开始--------------------------------------------  ---------------------

   $ NWBCPath =" C:\ Program Files(x86)\ SAP \ NWBC60"

   [System.Reflection.Assembly] :: LoadFile(" $ NWBCPath \ Interop.SAPFEWSELib.dll");
   [System.Reflection.Assembly] :: LoadFile(" $ NWBCPath \ Interop.SapROTWr.dll");

   #-Sub Main ----------------------------------------------  --------------
   功能主{
  
     [Interop.SAPFEWSELib.GuiApplication] $ Appl =`
       [Interop.SAPFEWSELib.GuiApplicationClass] :: new();
     $ Appl.OpenConnection(" NSP",$ True);

     [System .__ ComObject] $ Conn = $ Appl.Children.ElementAt(0);
     [Interop.SAPFEWSELib.GuiConnection] $ Conn =`
       [System.Runtime.InteropServices.Marshal] :: CreateWrapperOfType($ Conn,`
       [Interop.SAPFEWSELib.GuiConnectionClass]);

     [System .__ ComObject] $ Sess = $ Conn.Children.ElementAt(0);
     [Interop.SAPFEWSELib.GuiSession] $ Sess =`
       [System.Runtime.InteropServices.Marshal] :: CreateWrapperOfType($ Sess,`
       [Interop.SAPFEWSELib.GuiSessionClass]);

     #-用001 ---------------------------------填充现场管理员
     [System .__ ComObject] $ Id = $ Sess.FindById(" wnd [0]/usr/txtRSYST-MANDT");
     [Interop.SAPFEWSELib.GuiTextField] $ Id =`
       [System.Runtime.InteropServices.Marshal] :: CreateWrapperOfType($ Id,`
       [Interop.SAPFEWSELib.GuiTextFieldClass]);
     $ Id.Text =" 001";

     开始睡眠-第二个5;

     $ Sess.ActiveWindow.Close();

   }

   #-主要 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - -  -----------------
   主要;

 #-结束 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - -  --------------------
 

让我们知道它是否对您有帮助。

干杯
斯特凡

Bunny_CDM
2楼-- · 2020-09-22 11:28

你好马可,

我认为这应该可行:

 SapApplication =(GuiApplication)SAPActive.SapGuiApp.OpenConnection(connectString,Sync:true);
 SapConnection =(GuiConnection)SapApplication.Children.ElementAt(0);
 SapSession =(GuiSession)SapConnection.Children.ElementAt(0); 

如上所述,我不是C#程序员,所以我不能肯定地说。

干杯
Stefan

一周热门 更多>