Announcement

Collapse
No announcement yet.

Word-Dok. speichern in ein Verzeichnis mit nur Lese-Recht

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

  • Word-Dok. speichern in ein Verzeichnis mit nur Lese-Recht

    Hallo zusammen,

    ich habe folgendes Problem. Ich muss mit meinem Delphi6-Pgm automatisch wichtige Befund-Dokumente(Word2000) erstellen und in einem Verzeichnis ablegen, auf welches der angemeldete Benutzer nur Lese-Rechte besitzt. Über die Funktion LogonUser mit berechtigtem Benutzer kann ich auch auf das Verzeichnis zugreifen, jedoch wird das über CopyFile erstellte Dokument schreibgeschützt erstellt, so dass ich dieses nach programmgesteuerter Bearbeitung nicht mit SaveAs speichern kann.

    Wie kann ich den Schreibschutz aufheben oder gibt es andere Möglichkeiten, meine Anforderungen zu erfüllen.

    Hat jemand Tipps? Ich wäre sehr dankbar.

    Gruß Karl-Heinz Huber

  • #2
    Hallo,

    wo liegt dieses schreibgeschützte Verzeichnis - auf dem Rechner des Benutzers oder auf einem File-Server? Im Fall eines File-Servers, welches Betriebssystem wird dort verwendet?

    Die eleganteste und universellste Lösung besteht darin, den Inhalt der DOC-Dateien in komprimierter Form in einer Datenbank zu speichern und von dort aus abzurufen.

    Alternativ könnte man alle Dateizugriffe auch über ein DCOM-Objekt laufen lassen, das unter einem eigenen Benutzerkonto ausgeführt hat, das Schreibrechte auf diesem Verzeichnis hat. Der Anwender ruft nur das DCOM-Objekt auf, das dann mit höheren Rechten agiert. Der Umweg über LogonUser ist dann nicht notwendig, da das DCOM-Objekt diese Funktionalität implizit übernimmt. Da der Client nur über die Interfaces des DCOM-Objekts zugreifen kann, regelt man dort die Zugriffsberechtigungen.

    Wenn das nicht in Frage kommt, wass passiert, wenn die Automation-Instanz von MS Word erst nach dem Aufruf von <i>LogonUser</i> und <i>ImpersonateLoggedOnUser/RevertToSelf</i> aufgerufen wird? In diesem Fall sollte die Word-Instanz im Kontext des anderen Benutzers ausgeführt werden und somit die Rechte am Verzeichnis haben. Das folgende Beispiel demonstriert das Prinzip:
    <pre>
    uses ImpersonateSrv_TLB;

    procedure TFormClt.ButtonUserClick(Sender: TObject);
    var
    szBuffer : array[0..63] of Char;
    dwSize : DWORD;
    begin
    MemoLog.Lines.Clear;
    dwSize := SizeOf(szBuffer);
    GetUserName(szBuffer, dwSize);
    LogMsg('GetUserName:' + szBuffer);
    // COM-Server aufrufen
    CallCOMSrv;
    end;

    procedure TFormClt.ButtonAdminClick(Sender: TObject);
    var
    szBuffer : array[0..63] of Char;
    dwSize : DWORD;
    phToken : THandle;
    bRet : LongBool;
    begin
    MemoLog.Lines.Clear;
    // Login als lokaler Administrator
    if LogonUser('Administrator', 'DomainController', 'passwort',
    LOGON32_LOGON_BATCH,
    LOGON32_PROVIDER_DEFAULT, phToken) then
    begin
    LogMsg(' -> LogonUser als Administrator war erfolgreich');
    bRet := ImpersonateLoggedOnUser(phToken);
    if bRet then
    LogMsg(' -> ImpersonateLoggedOnUser war erfolgreich');
    dwSize := SizeOf(szBuffer);
    GetUserName(szBuffer, dwSize);
    LogMsg('GetUserName:' + szBuffer);
    // COM-Server aufrufen
    CallCOMSrv;
    //
    bRet := RevertToSelf;
    if bRet then
    LogMsg(' -> RevertToSelf war erfolgreich');
    dwSize := SizeOf(szBuffer);
    GetUserName(szBuffer, dwSize);
    LogMsg('GetUserName:' + szBuffer);
    end
    else
    LogMsg(' -> LogonUser ist fehlgeschlagen.');
    end;

    procedure TFormClt.CallCOMSrv;
    var
    aSrv : IImpersonateClientSrv;
    swMsg : WideString;
    begin
    LogMsg('CoImpersonateClientSrv.Create...');
    try
    aSrv := CoImpersonateClientSrv.CreateRemote(EditIP.Text);;
    try
    aSrv.DoWork('Client-Text', swMsg);
    LogMsg(swMsg);
    except
    on e: Exception do
    LogMsg(' -> DoWork: ' + e.Message);
    end;
    except
    on e: Exception do
    LogMsg(' -> CoImpersonateClientSrv.Create: ' + e.Message);
    end;
    end;

    procedure TFormClt.LogMsg(sMsg: String);
    begin
    MemoLog.Lines.Add(sMsg);
    end;
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch,

      vielen Dank für Ihre Hilfe. Das schreibgeschützte Verzeichnis liegt auf einem NT-File-Server. Die Möglichkeit des LogonUser hat sich in der Zwischenzeit für mich erledigt, da unsere Netzwerk-Verantwortliche es ablehnen, dass die erforderlichen Benutzer das dafür nötigte Privileg erhalten.

      Deshalb wären die anderen genannten Möglichkeiten für mich sehr interessant. Wie kann ich eine DOC-Datei in komprimierter Form in einer Datenbank speichern und wieder abrufen oder die Zugriffe über ein DCOM-Objekt. Hätten Sie dafür vielleicht ein Beispiel (Ihr Buch liegt vor).

      Über nochmalige Hilfe wäre ich Ihnen sehr dankbar.

      Gruß
      Karl-Heinz Hube

      Comment


      • #4
        Hallo,

        &gt;da unsere Netzwerk-Verantwortliche es ablehnen, dass die erforderlichen Benutzer das dafür nötigte Privileg erhalten

        das ist eine verständliche Reaktion :-)

        &gt;Hätten Sie dafür vielleicht ein Beispiel ...

        Ja. Die Speicherung der komprimierten DOC-Dateien in einer Datenbank demonstriere ich im Beispielprojekt RedSys, das hier im Forum im Ordner <i>Delphi | IBX | RedSys</i> vollständig als Sourcode heruntergeladen werden kann. Eine ausführlichere Beschreibung ist in meinem InterBase-Buch zu finden.

        Die Übertragung zu einem eigenen DCOM-Objekt beschreibe ich in meinem <i>COM/DCOM/COM+ Buch</i> (Seite 358ff), wobei ich dort eine JPG-Datei von einem Rechner zu anderen transportiere. Der Inhalt der Datei ist jedoch völlig egal, da alles in ein Variant-Array als Byte-Block verpackt und übertragen wird

        Comment


        • #5
          Hallo Herr Kosch,

          nochmals vielen Dank für Ihre Hilfe. Ihre genannten Beispiele werde ich mir ansehen. Ich hoffe, dass diese mir weiterhelfen.

          Gruß Karl-Heinz Hube

          Comment

          Working...
          X