2011-05-17 9 views
9

हम अपने लाइसेंस सर्वर तक पहुंचने के लिए एक एसएपी "COM लाइसेंस ब्रिज" का उपयोग कर रहे हैं और प्रोग्राम के सिस्टम की हार्डवेयर कुंजी से पूछताछ कर रहे हैं (अपने लाइसेंसिंग के साथ पुन: उपयोग करने के लिए) । यह एसएपी बिजनेस एक संस्करण 2007 ए, 2007 बी और 8.8 पर ठीक काम करता है, लेकिन 8.81 में उन्होंने COM wrapper को अपडेट किए बिना अपने कोर्बा इंटरफ़ेस को अपडेट किया है क्योंकि अब GetHardwareKey फ़ंक्शन को कॉल करने का प्रयास करते समय हमें स्मृति अपवाद मिलते हैं।आईडीएल या देर से बाध्य आवेदक रिमोटिंग विधियों के बिना कोर्बा इंटरफ़ेस तक कैसे पहुंचे

इसलिए मैंने IIOP.NET डाउनलोड किया और अपना इंटरफ़ेस लिखने की कोशिश करना शुरू कर दिया। मुझे वैसे भी COM wrapper पसंद नहीं आया। लेकिन मुझे .NET remoting की मेरी पुरानी दासता का सामना करना पड़ा - सर्वर और क्लाइंट दोनों में एक सामान्य इंटरफ़ेस परिभाषित किए बिना रिमोट विधि का आह्वान करने में असमर्थता। मैंने आईएलएल का उपयोग IIOP.NET के साथ सीएलएस कंपाइलर में करने का प्रयास किया, लेकिन मुझे इंटरफ़ेस बीइन असंगतता के बारे में त्रुटियां मिल रही हैं (एसएपी ने आईडीएल फ़ाइल प्रदान नहीं की है)। मुझे नहीं पता कि IIOP और CORBA कैसे निर्धारित करता है कि कोई इंटरफ़ेस संगत है या नहीं। लेकिन मैंने IIOP.NET कोड में डीबग करने का प्रयास किया और असंगतता के बावजूद विधि को निष्पादित करने के लिए मजबूर किया, लेकिन मुझे इच्छित हार्डवेयर कुंजी के बजाय खाली स्ट्रिंग वापस प्राप्त हुई।

मेरे अगले कदम के एक नकली लाइसेंस सर्वर को लागू करने और क्या वे की तरह दिखना चाहिए की पहचान करने की उम्मीद में उत्पादन ग्राहक से आ रही अनुरोध की जांच करने के लिए प्रयास करने के लिए है, लेकिन मैं पर विचार ज्यादा सफलता पर भरोसा नहीं कर रहा हूँ कठिनाई मैंने पहले से ही .NET remoting के अंदरूनी भाग में peering में किया है।

मेरे वास्तविक समस्या कैसे मिलता है या SAP Business One हार्डवेयर कुंजी उत्पन्न करने, लेकिन उस से शामिल उत्पन्न सवाल है:

  1. मैं कैसे पर प्रतिबिंबित या एक CORBA इंटरफेस के बारे में जानकारी क्वेरी करते हैं? मैं उपलब्ध ऑब्जेक्ट्स की एक सूची पुनर्प्राप्त करने के लिए नामकरण कॉन्टेक्स्ट क्लास की सूची विधि का उपयोग कर सकता हूं, लेकिन मुझे नहीं लगता कि किसी ऑब्जेक्ट पर उपलब्ध विधियों से पूछने का कोई तरीका है या नहीं।
  2. क्या मैं इंटरफ़ेस के बिना गतिशील रूप से .NET रीमोटिंग विधियों का आह्वान कर सकता हूं? मुझे लगता है कि गतिशील रूप से कोर्बा का आह्वान करने के लिए डीआईआई कहा जाता है, लेकिन मुझे नहीं लगता कि इसे IIOP.NET से कैसे उपयोग किया जाए।
  3. क्या मैं सिर्फ एक प्रतिनिधि या अपूर्ण इंटरफ़ेस के साथ .NET रीमोटिंग विधियों का आह्वान कर सकता हूं? मैंने गतिशील कीवर्ड का उपयोग करने की कोशिश की, लेकिन यह मेरे मार्शलबीरफ रिमोट ऑब्जेक्ट पर एक विधि का आह्वान करने में असमर्थ था ... मुझे लगता है कि यह कहा गया था कि यह विधि मेरे मार्शलबीरफ उदाहरण या कुछ पर मौजूद नहीं थी। मैंने केवल IIOP.NET के माध्यम से यह कोशिश की है, हालांकि (मुझे आश्चर्य है कि यह सामान्य .NET रिमोटिंग के लिए काम करता है)।
  4. मैं .NET रीमोटिंग ढांचे में संदेश उदाहरण कैसे बना या निरीक्षण कर सकता हूं?
  5. क्या मैं अंतर्निहित प्रॉक्सी को छोड़कर सीधे प्रेषण संदेशों को भेज या पुनर्प्राप्त कर सकता हूं?

संपादित करें: मैं बनाने के लिए IIOP.NET/CORBA विश्वास है कि मैं RepositoryID विशेषता लगाने से एक संगत इंटरफ़ेस था कामयाब रहे:

[Ch.Elca.Iiop.Idl.InterfaceType(Ch.Elca.Iiop.Idl.IdlTypeInterface.ConcreteInterface)] 
[Ch.Elca.Iiop.Idl.RepositoryID("IDL:LicenseInfo:1.0")] 
public interface ILicenseInfo : Ch.Elca.Iiop.Idl.IIdlEntity 
{ 
    void GetHardwareKey(out string hwKey); 
} 

लेकिन मैं अभी भी एक खाली स्ट्रिंग परिणाम हो रही है।

संपादित करें 2: कुछ और प्रयोग और डिबगिंग के बाद, मैं ने पाया है कि प्रतिक्रिया संदेशों शायद मेरा बुरा इंटरफेस की वजह से डेटा मैं तलाश कर रहा हूँ शामिल करते हैं, लेकिन ग्राहक मूल्यों में ठीक प्रकार से पार्स नहीं किया जा रहा है, परिभाषा। उम्मीद है कि प्रतिक्रिया प्रसंस्करण में डीबगिंग करने से मुझे पता चल जाएगा कि मेरे इंटरफेस को कैसे सही किया जाए। अजीब बात यह है कि प्रतिक्रिया से पार्स करने वाली पहली चीज़ एक शून्य बॉक्स वाले मान है, जो "आउट स्ट्रिंग" पैरामीटर के लिए सही नहीं लगती है।

संपादित करें 3: मैं ने पाया है कि मैं स्ट्रिंग इस तरह मापदंडों का श्रेय उन्हें बॉक्सिंग मूल्यों के रूप में इलाज किया जा रहा से रोकने के लिए आवेदन करने की आवश्यकता:

void GetHardwareKey([StringValue(), WideChar(true)] out string hwKey); 

लेकिन WideChar विशेषता के बावजूद, मैं हो रही है कोडसेट के बारे में त्रुटि WChar या कुछ का समर्थन नहीं कर रही है। मुझे यह पता लगाने के करीब वास्तव में मिल रहा है।

संपादित करें 4: मैं WChar के लिए कोडसेट सेट करने के तरीके पर फंस गया हूं। अगर मैं इसे सेट नहीं करता हूं, तो मुझे एक त्रुटि मिलती है: "WChar कोडेसेट या तो निर्दिष्ट नहीं है या समर्थित नहीं है।" क्योंकि सर्वर ने डिफ़ॉल्ट वर्ण सेट को ओवरराइड किए बिना एक यूनिकोड स्ट्रिंग वापस कर दी है। मुझे क्लाइंट से ओवरराइड करने का कोई तरीका नहीं मिल रहा है। मैंने कॉल करने की कोशिश की:

omg.org.CORBA.OrbServices.GetSingleton().OverrideDefaultCharSets(
    CharSet.UTF8, WCharSet.UTF16); 

लेकिन ऐसा लगता है कि क्लाइंट के अंत में कोई प्रभाव नहीं पड़ता है। उदाहरण कोड सर्वर सर्वर पर कॉलिंग दिखाता है। लेकिन मैंने सर्वर नहीं लिखा, इसलिए मैं इसे नियंत्रित नहीं कर सकता। क्या मेरा एकमात्र विकल्प IIOP.NET कोड को अपने स्वयं के उद्देश्यों के लिए एक डिफ़ॉल्ट WChar कोडसेट को प्रभावी बनाने के लिए मजबूर करने का एकमात्र विकल्प है?

उत्तर

8

आईओओपी में डीबगिंग के 3 दिनों के बाद अपने व्यवहार को ट्रैक करने और प्रतिक्रिया में आने वाले डेटा का निरीक्षण करने के बाद, मैं इस समाधान पर बस गया हूं।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using omg.org.CosNaming; 
using Ch.Elca.Iiop; 
using Ch.Elca.Iiop.Services; 
using System.Runtime.Remoting.Channels; 
using Ch.Elca.Iiop.Idl; 

[RepositoryID("IDL:LicenseInfo:1.0")] 
public interface ILicenseInfo 
{ 
    Int32 GetHardwareKey([IdlSequence(0)] out byte[] hwKey); 
    Int32 GetInstallationNumberList([IdlSequence(0)] out byte[] instNum); 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     IiopClientChannel channel = new IiopClientChannel(); 
     ChannelServices.RegisterChannel(channel, false); 
     CorbaInit init = CorbaInit.GetInit(); 
     NamingContext context = init.GetNameService("MYLICSRV", 30000); 
     NameComponent[] names = new NameComponent[] { new NameComponent("B1LicenseInfo") }; 
     ILicenseInfo li = (ILicenseInfo)context.resolve(names); 
     byte[] hwKey; 
     byte[] instNum; 
     li.GetHardwareKey(out hwKey); 
     li.GetInstallationNumberList(out instNum); 
     Encoding encoding = new System.Text.UnicodeEncoding(false, false, true); 
     Console.WriteLine(encoding.GetString(hwKey)); 
     Console.WriteLine(encoding.GetString(instNum)); 
    } 
} 

मैं अस्थायी रूप से भी की कोशिश में यह उपयोग कर रहा था बनाने के लिए IIOP मुझे वापस सही तार दे। अगर यह मेरे साथ हुआ था कि मैं केवल बाइट सरणी के रूप में उत्तर स्वीकार कर सकता हूं और खुद को डीकोडिंग कर सकता हूं, तो मैं यह समझने की कोशिश कर रहा हूं कि आईआईओपी को कैसे समझना है कि मैं अपनी स्ट्रिंग को वापस कैसे चाहता था:

class MyOrbInitializer : omg.org.PortableInterceptor.ORBInitializer 
{ 
    public void post_init(omg.org.PortableInterceptor.ORBInitInfo info) 
    { 
     // Nothing to do 
    } 

    public void pre_init(omg.org.PortableInterceptor.ORBInitInfo info) 
    { 
     omg.org.IOP.Codec codec = info.codec_factory.create_codec(
      new omg.org.IOP.Encoding(omg.org.IOP.ENCODING_CDR_ENCAPS.ConstVal, 1, 2)); 
     Program.m_codec = codec; 
    } 
} 


class Program 
{ 
    public static omg.org.IOP.Codec m_codec; 

    static void Main(string[] args) 
    { 
     IOrbServices orb = OrbServices.GetSingleton(); 
     orb.OverrideDefaultCharSets(CharSet.UTF8, WCharSet.UTF16); 
     orb.RegisterPortableInterceptorInitalizer(new MyOrbInitializer()); 
     orb.CompleteInterceptorRegistration(); 
... 
     MarshalByRefObject objRef = context.resolve(names); 
     string origObjData = orb.object_to_string(objRef); 
     Ch.Elca.Iiop.CorbaObjRef.Ior iorObj = new Ch.Elca.Iiop.CorbaObjRef.Ior(origObjData); 
     CodeSetComponentData cscd = new CodeSetComponentData(
      (int)Ch.Elca.Iiop.Services.CharSet.UTF8, 
      new int[] { (int)Ch.Elca.Iiop.Services.CharSet.UTF8 }, 
      (int)Ch.Elca.Iiop.Services.WCharSet.UTF16, 
      new int[] { (int)Ch.Elca.Iiop.Services.WCharSet.UTF16 }); 
     omg.org.IOP.TaggedComponent codesetcomp = new omg.org.IOP.TaggedComponent(
      omg.org.IOP.TAG_CODE_SETS.ConstVal, m_codec.encode_value(cscd)); 
     iorObj.Profiles[0].TaggedComponents.AddComponent(codesetcomp); 
     string newObjData = iorObj.ToString(); 
     MarshalByRefObject newObj = (MarshalByRefObject)orb.string_to_object(newObjData); 
     ILicenseInfo li = (ILicenseInfo)newObj; 
... 
    } 

के बाद इतना कोड भाग गया, मैं एक वस्तु है कि WChar CodeSet परिभाषित करेंगे तो यह वापसी तार ठीक से पार्स होता था, "WChar CodeSet या तो निर्दिष्ट नहीं किया है या समर्थित नहीं है" त्रुटि से बचने। लेकिन उसके बाद, यूनिकोड बाइट ऑर्डरिंग भी पीछे की ओर थी! और इसे ठीक करने का एकमात्र तरीका, जहां तक ​​मैं कह सकता था, स्ट्रिंग को बाइट्स में फिर से पार्स करना था और फिर यूनिकोड स्ट्रिंग में वापस करना था। लेकिन जब यह मेरे साथ हुआ, तो परिणाम को एक स्ट्रिंग के रूप में क्यों पूछें !? मैं सीधे बाइट्स ले सकता हूं और इस जटिलता से बच सकता हूं। काश मैंने पहले इसके बारे में सोचा था।

3

एसएपी बो 882 //LicenseInterface.idl

typedef sequence<octet> LicenseFileData; 

interface LicenseInfo 
{ 
    boolean IsUserLicensed(in wstring wstrUser, in wstring wstrModule, in wstring wstrInstallNo); 
    long GetHardwareKey(out wstring pbstrHK); 
    long GetInstallationNumberList(out wstring wbstrInstNum); 
    long GetSystemNumber(out wstring wbstrSysNum, in wstring wstrInstallNo); 
    long GetLicenseInfo(in wstring wstrModule, out long lNum, out long lAvailable, out long lStart, out long lEnd, in wstring wstrInstallNo); 
    long GetLoggedInUsers(out wstring wbstrLogUsers); 
    long StartLogging(); 
    long StopLogging(); 
    long GetLicenseNum(in wstring wstrKey, in wstring wstrInstallNo); 
    long GetLogFileName(out wstring wstrLogFileName); 
    boolean GetIsLogging(); 
    long LoadLicenseFile (in LicenseFileData arg_licenseFileData); 
    boolean IsLicenseFileExist(); 
    long ResetAllLicenses(); 
    long GetVersion(out wstring sVersion); 
    //long DeleteLicenseFile (in wstring wstrInstallNo); 
}; 

SBOLicense.idl

typedef sequence<octet> usBuffer; 

enum LicenseClientUTFType {LIC_UTF16 , LIC_UTF32}; 

exception NotAuthenticated {}; 
exception UserNotConnected {}; 

interface LicenseServer 
{ 
    long SBOConnect (in usBuffer User, in usBuffer Company, in usBuffer PCName, out usBuffer SessionE, in long lDate, in usBuffer sInstallNo) raises(NotAuthenticated); 
    long AddOnGetLicense (in usBuffer Identifier, in usBuffer User, in usBuffer Company, in usBuffer PCName, out long plSessionID, out usBuffer SessionE, in long lDate, in usBuffer sInstallNo) raises(NotAuthenticated); 
    long PollSession (in usBuffer User, in usBuffer SIDs, out usBuffer RetE) raises(NotAuthenticated); 
    long SessionsInfo (in usBuffer User, in usBuffer SessionsInfo, out usBuffer SessionsInfoE, in long lDate) raises(NotAuthenticated); 
    long SessionVerify (in usBuffer User, in long lSessionID, out usBuffer pSessionIdE) raises(NotAuthenticated); 
    long CloseSession (in usBuffer User, in long lSessionId) raises(NotAuthenticated); 
    long LockServer (in usBuffer User, in long lSessionID) raises(NotAuthenticated); 
    long UnLockServer (in usBuffer User, in long lSessionID) raises(NotAuthenticated); 
    long GetUserLicenseInfo (in usBuffer User, out usBuffer pModules, out boolean pbIsConnected) raises(NotAuthenticated); 
    long GetAllModulesStatus (out usBuffer pModulesInfo) raises(NotAuthenticated); 
    long LoadLicenseFile (in usBuffer NewLicenseFile) raises(NotAuthenticated); 
    long GetHardwareKey (out usBuffer pHK) raises(NotAuthenticated); 
    long CreateIdentifier (in usBuffer Addon, out usBuffer pIdentifier, in usBuffer sInstallNo) raises(NotAuthenticated); 
    long GetAllUsersLicenseInfo(out usBuffer pUsersLicInfo) raises(NotAuthenticated); 
    long SetAllUsersLicenseInfo(in usBuffer User, in usBuffer UsersLicInfo, out usBuffer pConnectedUser) raises(NotAuthenticated,UserNotConnected); 
    long IsDevExist (in usBuffer sInstallNo); 
    long GetInstallationNumberList(out usBuffer pInstNum); 
    long GetSystemNumber (out usBuffer pSysNum, in usBuffer sInstallNo); 
    long GetFutureExpired(in long lFutureDate, out usBuffer pModules, in usBuffer sInstallNo); 
    long GetUserSessionsInfo(in usBuffer UserName,out usBuffer pRsltSessionsInfo); 
    long GetBIGSLicense (in usBuffer User, in usBuffer Company, in usBuffer PCName, in long lNum, out usBuffer pSessionsE, in long lDate, in usBuffer sInstallNo) raises(NotAuthenticated); 
    boolean IsLicenseFileExist(); 
    long GetVersion(out usBuffer sVersion); 
    long ClearUserLicenses (in usBuffer User) raises(NotAuthenticated); 
    long UpdateUserLicenses (in usBuffer User, out usBuffer ModulesE, in long lDate, in long lSessionID, in usBuffer sCmpLocalization, in usBuffer sCmpVersion) raises(NotAuthenticated); 
    long RequestNamedLicenses (in usBuffer User, out usBuffer ModulesE, in long lDate, in long lSessionID, in usBuffer sCmpLocalization, in usBuffer sCmpVersion) raises(NotAuthenticated); 
    long IsLicenseConcurrent() raises(NotAuthenticated); 
    long GetLicenseFileGenInfo(in usBuffer sInstallNo, out usBuffer sLicGenInfo); 
    //long DeleteLicenseFile (in usBuffer sInstallNo) raises(NotAuthenticated); 

    long HandShake(in long algorithm, in usBuffer publicKey, out usBuffer sessionKey) raises(NotAuthenticated); 
    long GetCompanyDBCredentials(in long dbType, in usBuffer server, in usBuffer company, in usBuffer user, in usBuffer password, out usBuffer dbUser, out usBuffer dbPassword, out boolean useTrusted) raises(NotAuthenticated); 
    long GetDBCredentials(in long dbType, in usBuffer server, in usBuffer siteUser, in usBuffer password, out usBuffer dbUser, out usBuffer dbPassword, out boolean useTrusted) raises(NotAuthenticated); 
    long GetCompanyReadOnlyDBCredentials(in long dbType, in usBuffer server, in usBuffer company, in usBuffer user, in usBuffer password, out usBuffer dbUser, out usBuffer dbPassword) raises(NotAuthenticated); 
    long GetReadOnlyDBCredentials(in long dbType, in usBuffer server, in usBuffer siteUser, in usBuffer password, out usBuffer dbUser, out usBuffer dbPassword) raises(NotAuthenticated); 
    long GetListOfCompanies(in long dbType, in usBuffer server, in boolean refresh, out usBuffer listOfCompanies); 
    long GetCompanyEncryptionConfig(in long dbType, in usBuffer server, in usBuffer company, in usBuffer user, in usBuffer password, out long algorithm, out usBuffer keyId, out usBuffer key) raises(NotAuthenticated); 
    long GetEncryptionConfig(in usBuffer siteUser, in usBuffer password, out long algorithm, out usBuffer keyId, out usBuffer key) raises(NotAuthenticated); 
    long SetDBCredentials(in long dbType, in usBuffer server, in usBuffer siteUser, in usBuffer password, in usBuffer dbUser, in usBuffer dbPassword, in boolean useTrusted) raises(NotAuthenticated); 
    long RemoveDBCredentials(in long dbType, in usBuffer server, in usBuffer siteUser, in usBuffer password) raises(NotAuthenticated); 
    long GetServerVersion(in long dbType, in usBuffer server, out usBuffer version, in usBuffer commonDBName); 
    long SetReadOnlyDBCredentials(in long dbType, in usBuffer server, in usBuffer siteUser, in usBuffer password, in usBuffer dbUser, in usBuffer dbPassword) raises(NotAuthenticated); 
    long SetEncryptionAlghorithm(in usBuffer siteUser, in usBuffer password, in long algorithm) raises(NotAuthenticated); 
    long GenerateEncryptionKey(in usBuffer siteUser, in usBuffer password) raises(NotAuthenticated); 
    long GetServicesUserCredentials(in usBuffer siteUser, in usBuffer password, out usBuffer servicesUser, out usBuffer servicesPassword) raises(NotAuthenticated); 
    long ExportSecuritySettings(in usBuffer siteUser, in usBuffer password, out usBuffer xmlSettings) raises(NotAuthenticated); 
    long ImportSecuritySettings(in usBuffer siteUser, in usBuffer password, in usBuffer xmlSettings) raises(NotAuthenticated); 
    long GetListOfConfiguredServers(out usBuffer listOfServers); 
    long GetSiteUserName(out usBuffer siteUser); 
    long AuthenticateSiteUser(in usBuffer siteUser, in usBuffer password, out boolean result) raises(NotAuthenticated); 
    long AuthenticateServicesUser(in usBuffer siteUser, in usBuffer password, out boolean result) raises(NotAuthenticated); 
    long ChangeSiteUserPassword(in usBuffer siteUser, in usBuffer oldPassword, in usBuffer password) raises(NotAuthenticated); 
    long ChangeSiteUserPasswordByDB(in long dbType, in usBuffer server, in usBuffer dbUser, in usBuffer dbPassword, in usBuffer password) raises(NotAuthenticated); 
    long GetCompanyStaticKey(in long dbType, in usBuffer server, in usBuffer company, in usBuffer user, in usBuffer password, out usBuffer key) raises(NotAuthenticated); 
    long GetStaticKey(in usBuffer siteUser, in usBuffer password, out usBuffer key) raises(NotAuthenticated); 
    long GetEncryptionAlgorithm(out long algorithm); 
    long IsNTTrusted(in long dbType, in usBuffer server, out boolean isNTTrusted); 
    long IsDKeyUsed(out boolean result); 
    long ExportDKeys(in usBuffer siteUser, in usBuffer password, out usBuffer xmlDKeys) raises(NotAuthenticated); 
    long ImportDKeys(in usBuffer siteUser, in usBuffer password, in usBuffer xmlDKeys) raises(NotAuthenticated); 
    long GenerateDKey(in usBuffer siteUser, in usBuffer password, out usBuffer xmlDKeys) raises(NotAuthenticated); 
    long EnableDKey(in usBuffer siteUser, in usBuffer password, out usBuffer xmlDKeys) raises(NotAuthenticated); 
    long GetCompanyKeyAndKeyState(in long dbType, in usBuffer server, in usBuffer company, in usBuffer user, in usBuffer password, in usBuffer compKeyId, out long keyState, out usBuffer compKey)raises(NotAuthenticated); 
    long GetKeyAndKeyState(in usBuffer siteUser, in usBuffer password, in usBuffer compKeyId, out long keyState, out usBuffer compKey)raises(NotAuthenticated); 

}; 

interface LicenseServerFactory 
{ 
    LicenseServer GetLicenseServer(in LicenseClientUTFType ClientUTFType); 
}; 
संबंधित मुद्दे