Announcement

Collapse
No announcement yet.

Kein Zugriff auf Dienst als User

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

  • Kein Zugriff auf Dienst als User

    Hallo Leute,

    Hilfe

    Ich habe einen Dienst geschrieben. Disen Dienst möchte ich über ein zweites Programm konfigurieren. Für die Kommunikation habe ich einen Shared Memory Bereich eingerichtet. Wenn beide Programme unter Admin laufen, funktioniert alles wunderbar. Wenn ich das zweite Programm jedoch als User starte, bekomme ich beim Verbindungsaufbau über CreateFileMapping die Fehlermeldung ERROR_ACCESS_DENIED.

    Dann habe ich als Kommunikation Named-Pipes benutzt. Unter Admin kein Problem, aber als User wieder die Fehlermeldung ERROR_ACCESS_DENIED.

    Die Delphi Doku hilft mir da leider nicht weiter.

    Hat jemand eine Idee was da los ist?

    Das muß ja irgendwas mit den Zugriffsrechten sein.
    Aber wie setzte ich die für einen Shared Memaory Bereich oder eine Named Pipe?

    Gruß ... Uwe

  • #2
    Hallo,

    die die Hilfeseite zu <i>CreateFileMapping</i> sagt, muss der zweite Parameter (<i>lpAttributes</i>) korrekt ausgefüllt werden, wenn ein anderer Benutzer (Konto) damit arbeiten soll: "<i>The default security descriptor is based on the default DACL of the access token belonging to the calling process. By default, the default DACL in the access token of a process allows access only to the user represented by the access token. <b>If other users must access the object, you can either create a security descriptor with a null DACL, or add ACEs to the DACL that grants access to a group of users.</b> </i>".

    Das könnte dann vom Prinzip her so aussehen:
    <pre>
    <b>const</b>
    SECURITY_DESCRIPTOR_REVISION = 1;
    ACL_REVISION = 2;
    <br>
    <b>var</b>
    sa: TSecurityAttributes;
    sd: TSecurityDescriptor;
    aclBuf: <b>array</b>[1..1024] <b>of</b> byte;
    ptr_acl: PACL;
    <br>
    <b>function</b> CreateSA(AccountsAllowed: AnsiString): Boolean;
    <b>var</b>
    sidBuffer: <b>array</b>[1..100] <b>of</b> byte;
    sidBufSz: integer;
    ptr_sid: PSID;
    domainBuf: AnsiString;
    domainBufSz: Integer;
    snu: Sid_Name_Use;
    <b>begin</b>
    InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
    ptr_acl:= @aclBuf;
    InitializeACL(ptr_acl^, 1024, ACL_REVISION);
    ptr_sid:= @sidBuffer;
    sidBufSz:= SizeOf(sidBuffer);
    SetLength(domainBuf, 80);
    domainBufSz:= 80;
    LookupAccountName(<b>nil</b>, PChar(AccountsAllowed), ptr_sid, sidBufSz,
    PChar(domainBuf), domainBufSz, snu);
    AddAccessAllowedAce(ptr_acl^, ACL_REVISION, GENERIC_READ +
    GENERIC_WRITE, ptr_sid);
    Result:= SetSecurityDescriptorDacl(@sd, true, ptr_acl, false);
    sa.nLength:= sizeOf(sa);
    sa.bInheritHandle:= false;
    sa.lpSecurityDescriptor:= @sd;
    <b>end</b>;
    </pre>
    &#10

    Comment


    • #3
      Hallo Herr Kosch,

      vielen Dank für ihre Hilfe. Es funktioniert jetzt. Ich habe es jedoch nicht geschafft, den Zugriff für einen bestimmten User zu erlauben. Bei allen mir bekannten Namen von Benutzern wurde der Zugriff verweigert. Da jedoch alle User diesen Dienst benutzen sollen, habe ich es mit einem Null DAC versucht. Es funktioniert einwandfrei. Ihre Funktione reduziert jetzt auf:

      var
      sa: TSecurityAttributes;
      sd: TSecurityDescriptor;

      function CreateSA: Boolean;
      begin
      InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
      Result:= SetSecurityDescriptorDacl(@sd, true, 0, false);
      sa.nLength:= sizeOf(sa);
      sa.bInheritHandle:= false;
      sa.lpSecurityDescriptor:= @sd;
      end;

      Gruß ... Uwe Mnic

      Comment


      • #4
        Hallo Herr Kosch
        Ich möchte einen Dienst mit einem zweiten Programm kommunizieren lassen.Dazu habe ich versucht das IpcDemo von Delphi 7 entstprechend zu modifizieren.Es scheint so, als ob keine Verbindung zustande kommt.
        Muss man bei Diensten etwas Spezielles beachten?
        Gruß Mik

        Comment

        Working...
        X