![]() |
Re: Wer hat welche Berechtigungen in einem Verzeichnis
Zitat:
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". |
Re: Wer hat welche Berechtigungen in einem Verzeichnis
Zitat:
|
Re: Wer hat welche Berechtigungen in einem Verzeichnis
Zitat:
Es soll, wenn mehrer Benutzer das Programm benutzen ja nur eine DB-Datei benutzt werden. |
Re: Wer hat welche Berechtigungen in einem Verzeichnis
Zitat:
|
Re: Wer hat welche Berechtigungen in einem Verzeichnis
Zitat:
|
Re: Wer hat welche Berechtigungen in einem Verzeichnis
Zitat:
Versuch's damit (funktioniert auch mit Verzeichnissen)
Delphi-Quellcode:
edit: nicht mein Tag heute *g*
(** )
// 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; |
Re: Wer hat welche Berechtigungen in einem Verzeichnis
Zitat:
![]() |
Re: Wer hat welche Berechtigungen in einem Verzeichnis
Zitat:
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:
Ach ja: Gibt es eine ähnliche Möglichkeit auch für Netzwerklaufwerke? |
Re: Wer hat welche Berechtigungen in einem Verzeichnis
Zitat:
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:
|
Re: Wer hat welche Berechtigungen in einem Verzeichnis
Zitat:
Zitat:
Zitat:
:hello: Also, danke nochmals! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr. |
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