Announcement

Collapse
No announcement yet.

Client Computername bestimmen

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

  • Client Computername bestimmen

    Hallo

    Wie kann ich in einem Remote COM-Server (Intranet) den Computernamen des Clients bestimmen?
    Gestartet wird der Server mit CreateRemote('Computer Name')

    Gruss, Michael

  • #2
    Hallo,

    wenn der DCOM-Server in einer COM+ Anwendung installiert ist, stehen die Security-Interfaces zur Verfügung, so dass die Daten direkt abgerufen werden können, wenn die Typbiblithek von COM+ (<i>COMSVCSLib_TLB.pas</i>) eingebunden wird:
    <pre>
    procedure TObjectSecurity.DoSafeWork(const sTxt: WideString;
    out sMsg: WideString);
    var
    aSC : ISecurityCallContext;
    sTmp : String;
    iCount : Integer;
    iLevel : Integer;
    vTmp : OleVariant;
    aSCC : ISecurityCallersColl;
    iCCount: Integer;
    aSIC : ISecurityIdentityColl;
    vName : OleVariant;
    begin
    OleCheck(CoGetCallContext(IID_ISecurityCallContext , @aSC));
    // ist die Sicherheitsprüfung aktiviert?
    if aSC.IsSecurityEnabled then
    sTmp := 'IsSecurityEnable = True'
    else
    sTmp := 'IsSecurityEnable = False';
    // COM+ Role prüfen
    if aSC.IsCallerInRole('Delphi') then
    sTmp := sTmp + #13#10 + 'Caller ist in der Rolle »Delphi«'
    else
    sTmp := sTmp + #13#10 + 'Caller ist nicht in der Rolle »Delphi«';
    //
    iCount := aSC.Get_Item('NumCallers');
    sTmp := sTmp + #13#10 + Format('%d Aufrufer', [iCount]);
    //
    iLevel := aSC.Get_Item('MinAuthenticationLevel');
    sTmp := sTmp + #13#10 + Format('MinAuthenticationLevel: %d', [iLevel]);
    //
    vTmp := aSC.Get_Item('Callers');
    aSCC := IDispatch(vTmp) as ISecurityCallersColl;
    iCCount := aSCC.Get_Count;
    sTmp := sTmp + #13#10 + Format('%d Einträge in »Callers«', [iCCount]);
    //
    aSIC := aSCC.Get_Item(0);
    vName := aSIC.Get_Item('AccountName');
    sTmp := sTmp + #13#10 + Format('Benutzerkonto: %s', [vName]);
    //
    if aSC.IsUserInRole(vName, 'Dummy') then
    sTmp := sTmp + #13#10 + 'IsUserInRole »Dummy« = True'
    else
    sTmp := sTmp + #13#10 + 'IsUserInRole »Dummy« = False';
    //
    sMsg := sTmp;
    SetComplete;
    end;
    </pre>

    Wenn es allerdings noch ein "alter" DCOM-Server ist, hilft die Suche auf den Hilfeseiten des Microsoft Platform SDK für die folgenden Stickwörter weiter: CoQueryClientBlanket, CoImpersonateClient, CoRevertToSelf, CoQueryProxyBlanket, CoSetProxyBlanket

    Comment


    • #3
      Danke für die schnelle Hilfe

      Beim Compilieren erhielt ich einen Fehler (Funktion nicht definiert) in der Typenbibliothek COMSVCSLib_TLB. Durch manuelles Ändern des einen Funktionsaufrufes ist er aber schnell beseitigt.

      function TCRMClerk.Get_TransactionUOW(out pVal: WideString): HResult;
      begin
      // Result := DefaultInterface.TransactionUOW[pVal]; <-- falscher Aufruf
      Result := DefaultInterface.Get_TransactionUOW(pVal);
      end

      Comment


      • #4
        Hallo, nur eine kurze Frage:

        ich habe das probiert (steht übrigens auch im Buch von Herrn Kosch) leider bekomme ich sofort nach OleCheck(CoGetCallContext(IID_ISecurityCallContext , @aSC));
        eine "Schnittstelle nicht unterstützt" Exception. Hat irgendjemand eine Idee

        Comment

        Working...
        X