Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schreibrechte einer Ini-Datei überprüfen (https://www.delphipraxis.net/78926-schreibrechte-einer-ini-datei-ueberpruefen.html)

Ralf Stehle 13. Okt 2006 09:34


Schreibrechte einer Ini-Datei überprüfen
 
Wie kann ich denn vor dem Schreiben in ein Ini-File mit
Ini.WriteString('Sektion', 'Parameter', 'Wert')
überprüfen, ob ich überhaupt Schreibrechte habe?

Mein Programm läuft in einem Netzwerk, und je nach Benutzer sind Änderungen der Ini-Datei erlaubt oder auch nicht. Daher muss ich das vorher überprüfen

Vielen Dank

Ralf

RavenIV 13. Okt 2006 09:58

Re: Schreibrechte einer Ini-Datei überprüfen
 
Bei TIniFile finde ich nichts entsprechendes.
Man kann aber bestimmt irgendwie herausfinden, ob man überhaupt Schreibrechte hat.
Entweder über File-Operationen oder über die Windows-API.

Versuch doch mal in dieser Richtung hier im Forum zu suchen...

DevilsCamp 13. Okt 2006 10:06

Re: Schreibrechte einer Ini-Datei überprüfen
 
Falls du nichts findest dann versuch folgendes:

Erstelle eine Datei mit eindeutigem Namen. Schlägt das fehl, hast du keine Schreibrechte.

ste_ett 13. Okt 2006 10:09

Re: Schreibrechte einer Ini-Datei überprüfen
 
Prüfe, ob du einen neuen Eintrag in der Datei anlegen kannst und wieder löschen kannst.
Wenn das klappt hast du Schreibrechte. :)

DevilsCamp 13. Okt 2006 10:26

Re: Schreibrechte einer Ini-Datei überprüfen
 
Das kann aber im schlimmsten Fall so weit gehen, dass die Datei komplett zerlegt wird (ist mir schon passiert).

Luckie 13. Okt 2006 14:27

Re: Schreibrechte einer Ini-Datei überprüfen
 
Probier das: http://www.michael-puff.de/Developer...ileAccess.html mal.

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;


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;
Ist von Nico.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 Uhr.

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