Delphi-PRAXiS
Seite 3 von 5     123 45      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wer hat welche Berechtigungen in einem Verzeichnis (https://www.delphipraxis.net/17094-wer-hat-welche-berechtigungen-einem-verzeichnis.html)

Sharky 24. Sep 2005 16:27

Re: Wer hat welche Berechtigungen in einem Verzeichnis
 
Zitat:

Zitat von NicoDE
Was ist denn das eigentliche Ziel?

Hai Nico,

der Hintergrund ist der:
In meinem Programm (zum Beispiel meine Buchverwaltung) möchte ich dem Anwender die Möglichkeit geben zu bestimmen wo die Datenbankdatei gespeichert werden soll (Verzeichniss der EXE, AppDir des Users, oder in einem frei wählbaren Verzeichniss).
Jetzt möchte ich natürlich gerne prüfen ob der Anwender überhaupt die Berechtigung hat in dem von ihm gewählten Verzeichniss eine Datei zu erstellen. Die könnte ich sicher auch mit try - except machen. Aber ich möchte eigentlich lieber einen Fehler verhindern als "nur auf ihn zu reagieren".

Luckie 24. Sep 2005 17:42

Re: Wer hat welche Berechtigungen in einem Verzeichnis
 
Zitat:

Zitat von Sharky
möchte ich dem Anwender die Möglichkeit geben zu bestimmen wo die Datenbankdatei gespeichert werden soll (Verzeichniss der EXE, AppDir des Users, oder in einem frei wählbaren Verzeichniss).

Dir ust aber klarr dass bei meherern benutzern sie sich die datenbankdatei gegenseitig überschreiben, wenn sie beide im gleichen Verzeichnis ablegen?

Sharky 24. Sep 2005 17:52

Re: Wer hat welche Berechtigungen in einem Verzeichnis
 
Zitat:

Zitat von Luckie
... Dir ust aber klarr dass bei meherern benutzern sie sich die datenbankdatei gegenseitig überschreiben, wenn sie beide im gleichen Verzeichnis ablegen?

Naja, ich glaube schon das ich vor dem erzeugen einer neuen Datenbankdatei prüfe ob diese in dem gewählten Verzeichniss schon vorhanden ist ;-)
Es soll, wenn mehrer Benutzer das Programm benutzen ja nur eine DB-Datei benutzt werden.

Olli 24. Sep 2005 18:21

Re: Wer hat welche Berechtigungen in einem Verzeichnis
 
Zitat:

Zitat von Olli
Na wie ist denn GetAclInformation() bei euch in Delphisyntax deklariert, Jungs?

War eigentlich auch nur als Scherzfrage gedacht, sorry :roll:

Sharky 24. Sep 2005 18:23

Re: Wer hat welche Berechtigungen in einem Verzeichnis
 
Zitat:

Zitat von Olli
...War eigentlich auch nur als Scherzfrage gedacht, sorry :roll:

:?: Verwirre doch keine kleinen Haifischlein die sich da überhaupt nicht auskennen.

NicoDE 24. Sep 2005 20:05

Re: Wer hat welche Berechtigungen in einem Verzeichnis
 
Zitat:

Zitat von Sharky
der Hintergrund ist der:

[snip]

Versuch's damit (funktioniert auch mit Verzeichnissen)
Delphi-Quellcode:
(** )
// stuff Delphi might not know...
const
  FILE_READ_DATA           = $0001; // file & pipe
  FILE_LIST_DIRECTORY      = $0001; // directory
  FILE_WRITE_DATA          = $0002; // file & pipe
  FILE_ADD_FILE            = $0002; // directory
  FILE_APPEND_DATA         = $0004; // file
  FILE_ADD_SUBDIRECTORY    = $0004; // directory
  FILE_CREATE_PIPE_INSTANCE = $0004; // named pipe
  FILE_READ_EA             = $0008; // file & directory
  FILE_WRITE_EA            = $0010; // file & directory
  FILE_EXECUTE             = $0020; // file
  FILE_TRAVERSE            = $0020; // directory
  FILE_DELETE_CHILD        = $0040; // directory
  FILE_READ_ATTRIBUTES     = $0080; // all
  FILE_WRITE_ATTRIBUTES    = $0100; // all
  FILE_ALL_ACCESS     = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $1FF;
  FILE_GENERIC_READ   = STANDARD_RIGHTS_READ or
                         FILE_READ_DATA or
                         FILE_READ_ATTRIBUTES or
                         FILE_READ_EA or
                         SYNCHRONIZE;
  FILE_GENERIC_WRITE  = STANDARD_RIGHTS_WRITE or
                         FILE_WRITE_DATA or
                         FILE_WRITE_ATTRIBUTES or
                         FILE_WRITE_EA or
                         FILE_APPEND_DATA or
                         SYNCHRONIZE;
  FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE or
                         FILE_READ_ATTRIBUTES or
                         FILE_EXECUTE or
                         SYNCHRONIZE;
(**)

function CheckAccessToFile(DesiredAccess: DWORD; const FileName: WideString): Boolean;
const
  GenericFileMapping: TGenericMapping = (
    GenericRead  : FILE_GENERIC_READ;
    GenericWrite : FILE_GENERIC_WRITE;
    GenericExecute: FILE_GENERIC_EXECUTE;
    GenericAll   : FILE_ALL_ACCESS
  );
var
  LastError: DWORD;
  LengthNeeded: DWORD;
  SecurityDescriptor: PSecurityDescriptor;
  ClientToken: THandle;
  AccessMask: DWORD;
  PrivilegeSet: TPrivilegeSet;
  PrivilegeSetLength: DWORD;
  GrantedAccess: DWORD;
  AccessStatus: BOOL;
begin
  Result := False;
  LastError := GetLastError;
  if not GetFileSecurityW(PWideChar(FileName), OWNER_SECURITY_INFORMATION or
    GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION, nil, 0,
    LengthNeeded) and (GetLastError <> ERROR_INSUFFICIENT_BUFFER) then
    Exit;
  SetLastError(LastError);
  Inc(LengthNeeded, $1000);
  SecurityDescriptor := PSecurityDescriptor(LocalAlloc(LPTR, LengthNeeded));
  if not Assigned(SecurityDescriptor) then
    Exit;
  try
    if not GetFileSecurityW(PWideChar(FileName), OWNER_SECURITY_INFORMATION or
      GROUP_SECURITY_INFORMATION or DACL_SECURITY_INFORMATION,
      SecurityDescriptor, LengthNeeded, LengthNeeded) then
      Exit;
    if not ImpersonateSelf(SecurityImpersonation) then
      Exit;
    try
      if not OpenThreadToken(GetCurrentThread, TOKEN_QUERY or
        TOKEN_IMPERSONATE or TOKEN_DUPLICATE, False, ClientToken) then
        Exit;
      try
        AccessMask := DesiredAccess;
        MapGenericMask(AccessMask, GenericFileMapping);
        PrivilegeSetLength := SizeOf(TPrivilegeSet);
        if AccessCheck(SecurityDescriptor, ClientToken, AccessMask,
          GenericFileMapping, PrivilegeSet, PrivilegeSetLength, GrantedAccess,
          AccessStatus) then
          Result := AccessStatus;
      finally
        CloseHandle(ClientToken);
      end;
    finally
      RevertToSelf;
    end;
  finally
    LocalFree(HLOCAL(SecurityDescriptor));
  end;
end;

////////////////////////////////////////////////////////////////////////////////
// Test

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    ShowMessage(BoolToStr(
      CheckAccessToFile(GENERIC_WRITE, // check for generic write access
      OpenDialog1.FileName), True) + ': ' + SysErrorMessage(GetLastError));
end;
edit: nicht mein Tag heute *g*

NicoDE 24. Sep 2005 21:15

Re: Wer hat welche Berechtigungen in einem Verzeichnis
 
Zitat:

Zitat von Luckie
Ich wollte ermitteln welcher Benutzer Schreib- und Leserechte in einem angegebenen Verzeichnis auf NT ff. Systemen hat. Sprich, ich gebe ein Verzeichnis an und bekomme zurück, wer lesend und wer schreibend darauf zugreifen kann.

Colin Wilson - Delphi 6/7 - NT Low Level Utilities - TFileObject

Sharky 25. Sep 2005 10:00

Re: Wer hat welche Berechtigungen in einem Verzeichnis
 
Zitat:

Zitat von NicoDE
...Versuch's damit (funktioniert auch mit Verzeichnissen)

Hai Nico,
ersteinmal DANKE für die schöne Funktion :-D
Lokal funktioniert sie auch. Allerdings habe ich da noch eine Frage:
Wenn die Funktion TRUE zurückgibt steht in GetLastError immer:
Zitat:

Der an einen Systemaufruf übergebene Datenbereich ist zu klein
Kannst Du mir sagen warum das so ist?

Ach ja: Gibt es eine ähnliche Möglichkeit auch für Netzwerklaufwerke?

NicoDE 25. Sep 2005 10:20

Re: Wer hat welche Berechtigungen in einem Verzeichnis
 
Zitat:

Zitat von Sharky
Wenn die Funktion TRUE zurückgibt steht in GetLastError immer:
Zitat:

Der an einen Systemaufruf übergebene Datenbereich ist zu klein
Kannst Du mir sagen warum das so ist?

a) Bitte nachsehen ob du aktuelle Version hast (hatte heute morgen deswegen noch den Code ergänzt um den 'LastError' zu sichern).

Der Fehlercode ist nur bei Rückgabe von False interessant (in dem Beispiel so einfach gehalten weil ich keine Lust hatte dort noch ein if einzubauen *g*).
Ansonsten wird der 'LastError' im Erfolgsfalle normalerweise nicht geändert (deswegen wird er oben gesichert, da der erste Aufruf von GetFileSecurity den von dir genannten Fehlercode generieren muss)...

Zitat:

Zitat von Sharky
Ach ja: Gibt es eine ähnliche Möglichkeit auch für Netzwerklaufwerke?

Öhm, "\\foo\bar.42" funktioniert bei mir problemlos...

Sharky 25. Sep 2005 10:49

Re: Wer hat welche Berechtigungen in einem Verzeichnis
 
Zitat:

Zitat von NicoDE
... Bitte nachsehen ob du aktuelle Version hast

Nö, hatte natürlich die Version von gestern :-P

Zitat:

Der Fehlercode ist nur bei Rückgabe von False interessant
Jo, es hatte mich nur interessiert warum diese Meldung gekommen war. Jetzt wo Du es sagst habe ich es selber gesehen.
Zitat:

Öhm, "\\foo\bar.42" funktioniert bei mir problemlos...
*g* Bei mir jetzt auch. Ich hatte da einen kleinen "Denk"fehler.

:hello: Also, danke nochmals!


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.
Seite 3 von 5     123 45      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz