Autor Beitrag
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Do 05.01.12 13:33 
Hall Leute,

ich habe jetzt seit kurzem ein Problem. Ein Benutzer im Netz hat plötzlich angeblich keine Schreibrechte mehr auf eine Ini-Datei. Das Ergebnis: Wenn innerhalb des Programms (im Netz abgelegt) dieser Nutzer eine bestimmte Routine erreicht, bei der Inidateien geschrieben werden sollen (welche auch von anderen Nutzern beschrieben wird), stürzt das Programm ab. Es kann dann nur durch Beendigung im Task-Manager beendet werden. Zwischenzeitlich kommt dann - nach geraumer Zeit, die Meldung: "In Datei .... kann nicht geschrieben werden".

Diese Datei liegt auf einem NAS-Laufwerk (möglicherweise, aber das weiß ich leider nicht, keine Windows-Partition). Mit Windows hat angeblich "jeder" Vollzugriff auf die Datei. Allerdings können die effektiven Berechtigungen nicht abgefragt werden. Die klappt nur bei Benutzern mit Administratorenrechten. Merkwürdig ist nur, dass nur dieser eine Benutzer das Problem hat. Er greift mit Windows 7 (32 bit) auf den Server zu. Ein anderer Benutzer, der die gleichen Rechte im Netz hat, und mit einem anderen Rechner, ebenfalls Windows 7 (32 bit), hat dieses Problem nicht.

Ich habe bisher das Problem so gelöst, dass dieser Schreibzugriff nur Administratoren gewährt wird. Dieser Nutzer hat in meinem Programm keine Administratorenrechte, so dass dieser Schreibzugriff dann nicht erfolgt und der Fehler nicht auftritt. Aber das ist keine Lösung, nur ein Umgehen des Problems.

Als Abhilfemaßnahme:
Ich habe im Netz auch eine Routine gefunden, welche die Möglichkeit abfragt, ob die Datei zu öffnen ist, und wenn
nicht, dann wird von der Routine FALSE übergeben. Aber trotz Anwendung dieser Routine als Abfrage tritt dieses
Problem auf.

Weiß jemand, wie man sicher Schreibrechte auf Dateien im Netz abfragt? (Routine, Funktion, ggfs. API-Funktion)

P.S. der gleiche Nutzer hatte auch ein Problem mit der Systemsteuerung. Diese stürzte ab. Dabei habe ich dann die CPL-Dateien aus dem Systemverzeichnis (System32) verschoben (soweit es ging) und wieder zurückkopiert. Ich habe festgestellt, dass eine zu Firebird gehörige CPL defekt war. Als diese nicht mehr im Systemverzeichnis stand, lief die Systemsteuerung wieder.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.01.12 14:32 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Weiß jemand, wie man sicher Schreibrechte auf Dateien im Netz abfragt? (Routine, Funktion, ggfs. API-Funktion)
Um sicher zu wissen, ob der Zugriff erfolgreich war, bleibt nur es zu versuchen und Fehler abzufangen (schließlich können nicht nur fehlende Rechte Probleme machen). Letzteres, also eine Fehlerbehandlung, hast du offenbar vergessen, wenn das Programm dabei abstürzt...

Wie sieht denn der Code an der Stelle aus?
Tranx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Do 05.01.12 14:54 
Ich habe es mit Try ... except .. end; schon versucht. Das klappte nicht. Der Fehler trat selbst dann auf. Wieso, weiß ich ehrlich nicht.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
// isAdm fragt nach dem Status des Benutzers (Bei Administrator wird TRUE, ansonsten FALSE übergeben
// DateiZuOeffnen fragt nach dem Status der Datei (ob zu oeffnen -> TRUE, ansonsten FALSE)
procedure Vorgabedaten;
begin
:
  if isAdm(FALSE) and DateiZuOeffnen(cGlobalDateiname) then
  begin
    GlobalIni := TIniFile.Create(cGlobaldateiname);
    with GlobalIni do
    begin
      WriteString('Global''Datenbank', DB); //DB ist ein String, der mir Angibt, ob die Datenbank online oder offline ist.
      WriteString(DB, 'AuftrDatenDir', e_AuftrDatenDir.Text);
      WriteString(DB, 'Spekzert', e_Spekzert.Text);
      WriteString(DB, 'SuchProgramm', e_SuchProgramm.Text);
      WriteString(DB, 'MitarbeiterDaten', e_MADaten.Text);
      WriteString(DB, 'AdressenDB', e_AdressenDB.Text);
      WriteString(DB, 'AuftragsDB', e_AuftragsDB.Text);
    end;
    GlobalIni.Free;
  end;
end;

// die e_XXX sind TEDit-Felder, in denen entsprechende Informationen stehen, die gelesen und - falls geändert - gespeichert werden. 
// Da diese Daten eh nur vom Administrator verändert werden dürfen, ist hier die Abfrage isAdm sinnvoll 
// und - wie gesagt - wird das Problem dadurch umgangen. Doch was ist, wenn das Problem beim Administrator selber auftritt?
// 

//DateizuOeffnen (in anderer Unit)

procedure Wait (var N: integer);
var
  fTime: Cardinal;
begin
  fTime:= GetTickCount;
  repeat until (GetTickCount-fTime) > 500;
  N:= N+1;
end;


function DateiZuOeffnen(const FileName: string): boolean;
var
  N, IO: integer;
  F: TextFile;
begin
  N:= 0;
  AssignFile(F, FileName);
  repeat
    {$I-} Reset(f); {$I+}
    IO:= IOResult;
    if IO <> 0 then Wait(N);
  until ((IO = 0or (N = 10));
  Result:= (IO = 0);
  if Result then
    closeFile(f)
  else
    MessageDlg(Application.ExeName+': '+FileName+' ['+SysErrorMessage(IO)+'].', mtWarning, [mbOK], 0);
end;


wie gesagt, leider fragt die Dateizuoeffnen-Routine nur die Öffnenbarkeit der Datei, nicht die Beschreibbarkeit ab. Mit Rewrite das zu testen geht ja leider nicht, da dann die Datei gelöscht wird, wenn ich das richtig sehe. Und das will ich auf gar keinen Fall.

Was mich eben wundert, dass das Problem wirklich nur bei einem Nutzer von 12 auftritt, und bei den anderen - bisher - nicht. Ich habe am Server schon geschaut, ob dieser Nutzer eventuell anders im Netz ist, aber da ist nichts anderes als bei den meisten anderen Nutzern (einige gehören zu den Administratoren, die meisten nicht dazu).

Was ich bräuchte, wäre eine Routine, die die Beschreibbarkeit einer Datei im Netz abfragt.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19321
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.01.12 15:57 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe es mit Try ... except .. end; schon versucht. Das klappte nicht. Der Fehler trat selbst dann auf.
Vielleicht hilft dann SetErrorMode auf SEM_FAILCRITICALERRORS? Hast du einmal an der Stelle (Remote-)debuggt was genau passiert, wenn du keine Fehlermeldung bekommst?

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Was ich bräuchte, wäre eine Routine, die die Beschreibbarkeit einer Datei im Netz abfragt.
Die gibt es nicht. Du kannst nur abfragen, ob es theoretisch machbar wäre die Datei zu beschreiben indem du die ACLs der Datei durchgehst. Das sollte mit der JWSCL gehen.
Ob es dann tatsächlich geht, weißt du aber trotzdem nicht.
Tranx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Do 05.01.12 17:20 
Kann das leider nur am Rechner desjenigen ausprobieren, bei dem das Problem auftritt. Bei einem anderen Rechner tritt das Problem nicht auf. Aber da ich das jetzt mit der Abfrage - auch sinnigerweise, weil ja nur Administratoren diese Speicherung vornehmen dürfen - umgangen habe, werde ich sehen, ob es in Zukunft auch an meinem Rechner mal auftritt, da ich selber Administrator (Rechte innerhalb des Programms) bin.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.