Announcement

Collapse
No announcement yet.

Zugriff auf COM-Objekte (Win 2000 Server) funktioniert nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zugriff auf COM-Objekte (Win 2000 Server) funktioniert nicht

    Hallo

    Ich habe ein MTS-Datenmodul erstellt und Local (WinNt) getetest. Der Zugriff klappt einwandfrei.

    Nun sollte der Zugriff auf einen Windows 2000 Server erfolgen. Es
    erscheint immer die Fehlermeldung "Schnittstelle nicht unterstützt".

    Package und Typbibliothek (tregsvr.exe auf Server kopiert) habe ich auf den Server bereits registriert.

    Der Client ruft das Objekt wie folgt auf:

    var aObj: IOnlTest;
    sMsg: WideString;
    begin
    aObj := CoOnlTest.CreateRemote('TSW2000');
    aObj.SrvConnect(sMsg);
    ShowMessage(sMsg);

    Außerdem habe ich versucht mit der DCOMConnection-Komponente eine
    Verbindung zum Server herzustellen. Fazit: "Schnittstelle nicht
    unterstützt".

    Mit der TSocketConnection wird die Verbindung hergestellt.

    Wenn ich den Client auf dem Windows 2000 Server entwickle (s. Quell-
    code oben) klappt auch alles einwandfrei.

    Woran kann das liegen ? Kann mir jemand helfen ?

    Danke

    y.isa

  • #2
    Hallo,

    ich würde folgende prüfen: <br>

    1. Sind auf beiden Rechnern alle die Typbibliotheken installiert und registriert, die der Typbibliotheks-Editor des MTS-Objekts auf der Registerseite <b>Verwendet</b> anzeigt? Beim Zugriff über den <i>Borland Socket Server</i> wird die <b>späte Bindung</b> über IDispatch verwendet, so dass der Standard-Marshaler von COM die eigenen TLBs <b>nicht</b> benötigt. Um diesen Sonderfall zu prüfen, würde ich den folgenden Test machen (dabei zur Sicherheit zuerst die IP-Adresse des Servers verwenden):
    <pre>
    var
    FSrvOle : OleVariant;
    swMsg : WideString;
    begin
    FSrvOle := CreateRemoteComObject('192.168.1.1', CLASS_OnlTest) as IDispatch;
    FSrvOle.SrvConnect(swMsg);
    ShowMessage(swMsg);
    end;
    </pre>

    2. Wenn beide Rechner nicht einer <b>gemeinsamen</b> Domäne angehören, tritt das Problem auch dann auf, wenn das MTS-Objekt im Kontext des interaktiv angemeldeten Benutzers ausgeführt wird und sich der <i>Administrator</i> auf <b>beiden</b> Rechnern mit der exakt gleichen Benutzernamen/Passwort-Kombination anmeldet? Wenn dieser Zugriff erfolgreich ist, liegt die Ursache des o.g. Problems in der Konfiguration von COM+ Security (Abschottung der COM+ Anwendung sowie des installierten Objekts)

    Comment


    • #3
      Hallo Herr Kosch

      Danke für die Antwort.

      Ich habe eine neues Objekt erstellt und auf dem Server sowie auf
      meinem Rechner Compiliert. Anschließend einen Client erstellt und
      versucht auf das Objekt zuzugreifen. Es erscheint dieselbe Fehlermeldung: "Schnittstelle nicht unterstützt".

      Es ist wohl tatsächlich ein Problem von COM+ Security. Ich habe
      mehrere Einstellungen versucht wie z. B.
      "Zugriffsprüfung f. diese Anwendung erzwingen" deaktiviert.

      Mittlerweile bin ich soweit das ich doch über die TSocketConnection
      das Objekt aufrufe und hoffe darauf irgendwann einmal (stehe zur Zeit unter Zeitdruck) diesen Fehler beheben zu können.

      Hat dieser Weg gravierende Nachteile ???

      Vielen Dank

      y.is

      Comment


      • #4
        Hallo,

        ja - mit TSocketConnection wird der langsamste Weg genutzt, außerdem steht nur ein Bruchteil der Möglichkeiten von DCOM zur Verfügung. War der IDispatch-Zugriff erfolgreich? Sind die Rechner in der gleichen Domäne? Wenn nicht, hat der Server seinen Gast-Benutzereinsteig freigeschaltet? Haben beide Rechner (Windows 2000: COM+ Dialoge; Windows NT: DCOMCNFG-Dienstprogramm) ihre Sicherheitseinstellungen heruntergehängt? Bei geeigneter Konfiguration ist DCOM auch dann erfolgreich möglich, wenn der NT-Rechner nicht in der gleichen Domäne hängt und der Benutzername beim Windows 2000-Server unbekannt ist

        Comment


        • #5
          Hallo

          - Der IDispatch-Zugriff war nicht erfolgreich:
          (EIntfCastError: Schnittstelle nicht unterstützt)
          - Gast-Benutzereinstieg ist aktiviert.
          - Sicherheitseinstellungen heruntergehängt.

          Ich habe es mit folgenden Rechnern getestet:

          1. -WinNt Workstation -> WIN2000 Server
          -befinden sich in unterschiedlicher Domäne
          Ergebnis: EIntfCastError

          2. -WinNt Server (WebServer) -> WIN2000 Server
          -befinden sich in gleicher Domäne
          Ergebnis: EInfCastError

          Es macht nichts aus ob sich der Server o. die Workstation in der
          selben Domäne befinden. Ich bekomme immer die selbe Fehlermeldung.

          Gruß

          y.is

          Comment


          • #6
            Hallo,

            in diesem Fall würde ich ein neues MTS-Objekt zusammenbauen, das ein schlichtes Interface mit nur einer Interface-Methode verwendet, die ein Integer-Wert zurückliefert. Mit diesem Mini-Objekt sollte der Versuch wiederholt werden. Dazu die folgenden Schritte verwenden - wenn ein MTS-Objekt entwickelt wird, darf der normale Weg über regsrv32 <b>nicht</b> verwendet werden, sondern das MTS-Objekt <b>muss</b> im MTS (Windows NT4) oder COM+ (Windows 2000) installiert werden:

            1. Komponentendienste | Arbeitsplatz Eigenschaften: <br>
            a) <i>DCOM auf diesem Computer aktivieren</i> muss aktiviert sein<br>
            b) Standardauthentifzierungsebene: <i>Aufruf</i><br>
            c) Standard-Identitätswechselebene: <i>Identifizieren</i> <br>

            2. Gast-Benutzerkonto aktivieren

            3. VCL-Standard-Typbibliothek registrieren: <br>
            <i>regsvr32 stdvcl40.dll</i> (ggf. auch MIDAS.DLL)

            4. Komponentendienste: COM+ Anwendung <i>Test</i> als neue Server-Anwendung erstellen und konfigurieren: <br>
            a) Zugriffsüberprüfung erzwingen abwählen <br>
            b) Sicherheitsstufe: Zugriffsüberprüfung nur auf Prozessebene...

            5. Komponentendienste | COM+ Anwendung <i>Test</i> : Eigenes MTS-Objekt (DLL) über den <b>COM+ Assistenten</b> installieren.

            6. Komponentendienste | Komponente konfigurieren: <br>
            a) Registerseite Sicherheit: Checkbox <i>Zugriffsüberprüfung ...</i> abwählen <br>
            b) Registerseite Aktivierung: Prüfen, ob <i>Just-In-Time-Aktivierung</i> ausgewählt ist<br>

            Ist das erfolgreich

            Comment


            • #7
              Hallo Herr Kosch

              Als erstes vielen Dank für Ihre Hilfe.

              Ich habe es mir einmal einfach gemacht und den Win2000 Server neu installiert. Und siehe da, es funktioniert. Keine Ahnung wo ich mir was mit den Berechtigungen verbogen habe.

              Kaum ist ein Problem gelöst kommt schon das nächste:

              Mein Projekt sieht wie folgt aus:
              - Es existert eine SoapService-Anwendung die unsere Clients
              aufrufen.
              - Diese Anwendung ruft ein MTS/COM+ Objekt auf, welches eine
              Verbindung zur AS400 herstellt und informationen zurückgibt.

              Nun zum Problem:
              Ich wollte mal testen (alles auf einem PC mit WINNT 4.0) wie die Antwortzeiten sind wenn 2 Clients gleichzeitig den die SoapService-Anwendung starten. Nun tritt das Phänomen auf das wenn der 1. Client
              beendet hat, hängen die anderen Clients auf.

              Warum ???

              Client:
              var i: Integer;
              s: String;
              begin
              SoapSrv := HTTPRIO1 as ISoapSrv;
              for i := 0 to 100 do
              begin
              Memo1.Lines.Add(eSoapSrv.ASConnect + ' [' + IntToStr(i) + '] ' +
              TimeToStr(now));
              sleep(5);
              Application.ProcessMessages;
              end;
              end;

              SoapServer:
              var
              AsServer: IAsServer;
              FGUID: WideString;
              begin
              try
              AsServer := COASServer.CreateRemote(WinNt40);
              AsServer.Login(Username, Password, FGUID);
              Result := FGUID;
              finally
              AsServer := Nil;
              end;
              end;

              Das MTS/COM+ Objekt:

              function TASServer.Login(const FUsername, FPassword: WideString;
              out FGUID: WideString): WordBool;
              begin
              try
              ....
              ....
              finally
              SetComplete;
              end;
              end;

              Vielen Dank

              y.is

              Comment


              • #8
                Hallo nochmal

                Bezüglich Zugriff auf COM+ Objekte auf WIN2000 Server läuft trotzdem nicht. Es läuft nur DCOM.
                Ich habe alles so gemacht wie Sie mir beschrieben haben, jedoch Punkt
                6a kann ich nicht anwählen. Es ist Disabled und hat einen haken.

                mfg

                y.is

                Comment


                • #9
                  Und noch einmal

                  Zugriff auf COM+ (WIN2000 Server)

                  Ich habe nun folgendes getestet:

                  Ergebnis bei Zugriff und Aufruf:

                  1. Mit CreateRemote: Ergebnis "Schnittstelle nicht unterstützt"
                  2. Mit CreateRemoteComObject: funktioniert
                  3. Mit TDComConnection: funktioniert

                  Kann ich nun den Zugriff mit Punkt 2 o. 3 ohne Nachteile nutzen ??

                  mfg

                  y.is

                  Comment

                  Working...
                  X