6 Stimmen

Wie erstellt man mit Delphi ein Verzeichnis zur Laufzeit mit vollen Rechten für alle Benutzer?

Ich muss ein Verzeichnis innerhalb von COMMONAPPDATA (falls es nicht existiert) mit vollen Rechten für jeden Benutzer dieses Computers erstellen (jeder wird in der Lage sein, dieses Verzeichnis zu lesen oder zu schreiben). Ich bin auf der Suche nach nativen einfachen Code, um dies in Delphi zu tun, ohne Verwendung von Drittanbieter-Bibliotheken oder Komponenten.

3 Stimmen

S

0 Stimmen

Die Jedi-Einheiten haben so viele Abhängigkeiten, dass ich sie gerne vermeiden möchte. Installer ist keine Option, da die Anwendung bereits bei mehreren Kunden/Maschinen installiert ist.

11voto

RRUZ Punkte 132753

@WarmBooter, Sie können die CreateDirectory Funktion, um diese Aufgabe zu erfüllen.

siehe dieses Beispiel:

program Project645;

{$APPTYPE CONSOLE}

uses
  AccCtrl,
  AclApi,
  Windows,
  SysUtils;

type

  PTrusteeW = ^TTrusteeW;
  TTrusteeW = record
    pMultipleTrustee: PTrusteeW;
    MultipleTrusteeOperation: DWORD;  { MULTIPLE_TRUSTEE_OPERATION }
    TrusteeForm: DWORD;  { TRUSTEE_FORM }
    TrusteeType: DWORD;  { TRUSTEE_TYPE }
    ptstrName: PWideChar;
  end;
  TExplicitAccessW = record
    grfAccessPermissions: DWORD;
    grfAccessMode: DWORD;  { ACCESS_MODE }
    grfInheritance: DWORD;
    Trustee: TTrusteeW;
  end;

Function  CreateDirectoryFullAccess(NewDirectory:String) :Boolean;
var
    SecurityAttributes  : TSecurityAttributes;
    SecurityDescriptor  : PSecurityDescriptor;
    ExplicitAccess      : array[0..0] of TExplicitAccessW;
    easize              : integer;
    pACL                : Windows.PACL;
begin
    ExplicitAccess[0].grfAccessPermissions:= STANDARD_RIGHTS_ALL or SPECIFIC_RIGHTS_ALL;
    ExplicitAccess[0].grfAccessMode:=Ord(SET_ACCESS);
    ExplicitAccess[0].grfInheritance:=SUB_CONTAINERS_AND_OBJECTS_INHERIT;
    ExplicitAccess[0].Trustee.TrusteeForm:=Ord(TRUSTEE_IS_NAME);
    ExplicitAccess[0].Trustee.TrusteeType:=Ord(TRUSTEE_IS_USER);
    ExplicitAccess[0].Trustee.ptstrName:='Everyone';//Access for all users
    SetEntriesinAclW(1,@ExplicitAccess,nil,pACL);//creates a new access control list

    //SecurityDescriptor:= AllocMem(Sizeof(SECURITY_DESCRIPTOR_MIN_LENGTH));
    SecurityDescriptor:= AllocMem(SECURITY_DESCRIPTOR_MIN_LENGTH);
    InitializeSecurityDescriptor(SecurityDescriptor,SECURITY_DESCRIPTOR_REVISION);
    SetSecurityDescriptorDacl(SecurityDescriptor,true,pacl,false);//sets information in a discretionary access control list (DACL).

    FillChar(SecurityAttributes,sizeof(SECURITY_ATTRIBUTES),#0);
    SecurityAttributes.nLength:=sizeof(SECURITY_ATTRIBUTES);
    SecurityAttributes.lpSecurityDescriptor:=SecurityDescriptor;
    SecurityAttributes.bInheritHandle:=false;
    CreateDirectory(PChar(NewDirectory),@SecurityAttributes);
    Result:=GetLastError=0;// if all ok, GetLastError = 0
end;

begin
  if CreateDirectoryFullAccess('C:\MyNewDir') then
   Writeln('Ok')
  else
   Writeln('Failed');

  Readln;
end.

0 Stimmen

Um Berechtigungen für ein bereits existierendes Verzeichnis zu setzen, verwenden Sie die SetNamedSecurityInfo() Funktion ( msdn.microsoft.com/de-us/library/aa379579%28VS.85%29.aspx ) - Google sollte einen Beispielcode liefern.

3voto

Mark Robinson Punkte 933

Ich wünschte, ich könnte einen Kommentar abgeben und fragen: "Warum?".

Die ausführbare Datei muss im Administratormodus ausgeführt werden (so dass die meisten Ihrer Benutzer die Eingabeaufforderung sehen würden)

Warum nicht die Ordner APPDATA oder LOCALAPPDATA oder die öffentliche Freigabe verwenden?

Hier ist ein Link zu einer ähnlichen Frage: Delphi 2009 Klassen/Komponenten zum Lesen/Schreiben von Dateiberechtigungen

0 Stimmen

Ganz genau. Ihre Anwendung müsste mit vollen Rechten ausgeführt werden, und erweiterte Rechte werden unter Win7 meines Wissens nach nicht einmal Administratoren gewährt, es sei denn, sie genehmigen eine Installation. Daher denke ich, dass Sie ein spezielles "Tool" mit diesem Code erstellen müssen, das der Benutzer mit erweiterten Rechten ausführen muss.

3 Stimmen

Was ist die richtige Antwort? Hier wird nicht einmal versucht, die Frage zu beantworten. Es gibt Gründe, ein solches Verzeichnis zu wollen. Sowohl APPDATA y LOCALAPPDATA sind ungeeignet für Anwendungsdaten, die von mehreren Benutzern gemeinsam genutzt werden (wie Datenbankdateien). Wie die öffentliche Freigabe ist sie für andere Dinge gedacht.

0 Stimmen

Eigentlich ist die öffentliche Freigabe der perfekte Ort für gemeinsam genutzte öffentliche Datenbankdateien, obwohl Sie in diesem Fall vielleicht auch einen Ordner auf Root-Ebene für Ihre Anwendung erstellen und ein Unterverzeichnis für die Datenbankdateien verwenden sollten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X