Wie erteile ich einer von meiner Anwendung erstellten Datei für ALLE Benutzer die volle Berechtigung?

73

Das von mir entwickelte Tool muss einer von ihm erstellten Datei Zugriffsrechte "Vollzugriff" gewähren. Es muss von allen Windows-Konten und sogar von möglichen zukünftigen Konten gelesen, geändert und gelöscht werden. Könnte dies erreicht werden?

Ich weiß, dass ich dies für einen SPECIFIC_USER versuchen kann:

FileSystemAccessRule rule = new FileSystemAccessRule(SPECIFIC_USER, FileSystemRights.FullControl, AccessControlType.Allow);
FileSecurity fSecurity = File.GetAccessControl(filePath);
fSecurity.SetAccessRule(rule);
File.SetAccessControl(filePath, fSecurity);

Aber wie kann ich es allen Benutzern gewähren? Und sogar mögliche zukünftige Konten? Wenn der letzte Teil nicht möglich ist, wie geht man dann mit der ersten Anforderung um?

Vielen Dank.

BEARBEITEN:

Dies ist der Code, der für mich funktioniert hat. Entnommen aus dem Link des Antwortenden.

private bool GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(
        new SecurityIdentifier(WellKnownSidType.WorldSid, null), 
        FileSystemRights.FullControl,
        InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,
        PropagationFlags.NoPropagateInherit,
        AccessControlType.Allow));

    dInfo.SetAccessControl(dSecurity);
    return true;
}

Beachten Sie, PropagationFlags.NoPropagateInheritwas erforderlich ist (gegenüber dem letzten im Link erwähnt). Es gewährt auch zukünftigen Konten Privilegien.

nawfal
quelle
18
Hinweis für Personen: Verwenden Sie nicht "Jeder", sondern new SecurityIdentifier(WellKnownSidType.WorldSid, null)ein SecurityIdentifier-Objekt. Jeder arbeitet nur an englischen Windows-Installationen. Mit der anderen Methode wird sichergestellt, dass es mit mehreren Sprachversionen kompatibel ist.
Angelo Vargas
@trukin kannst du es eine Antwort geben? danke
nawfal
@nawfal: Ich habe das gleiche Problem und muss nach der Installation der Anwendung Zugriff auf meinen Installationsordner gewähren. Aber wo kann ich diesen Code schreiben?
Hina Khuman
@HinaKhuman Das Installieren von Installationsordner-Berechtigungen wird vom Installationsprogramm besser behandelt. Ich weiß nicht, welches Sie verwenden, aber es sollte ziemlich einfach sein. Wenn Sie dies über C # tun möchten, rufen Sie die GrantAccess-Methode von jedem beliebigen Ort aus auf, aber Ihre Anwendung selbst sollte über die Rechte verfügen.
Nawfal
@nawfal: Danke! Siehe detaillierte Frage hier: stackoverflow.com/q/48165315/5743676
Hina Khuman

Antworten:

126

Hinweis für Benutzer.

Wenn Sie wörtliche Zeichenfolgen für das verwenden FileSystemAccessRule, sollte dies WellKnownSidType.WorldSidanstelle von sein "everyone".

Der Grund dafür ist, dass es mehrere Fenstersprachen gibt und jeder nur für EN-Sprachen gilt. Für Spanisch könnte es also "Todos" (oder etwas anderes) sein.

using System.Security.AccessControl;
using System.Security.Principal;
using System.IO;

private void GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.NoPropagateInherit, AccessControlType.Allow));
    dInfo.SetAccessControl(dSecurity);
}
Angelo Vargas
quelle
Vielen Dank. Ich hatte Probleme damit, Dateien zu dekomprimieren und Berechtigungen für MDF-Dateien festzulegen (weil ich schreibgeschützte Fehler bekam). Vielen Dank!
CularBytes
Darf ich nach dem Zweck des Rückgabewerts fragen?
hypehuman
@hypehuman oh keine wirklich, es sollte von irgendwoher aufgerufen werden und wenn es fehlschlug (sagen wir, GrantAccess hat eine Ausnahme abgefangen, dann würde es false zurückgeben), dann sollte jeder Code verwendet werden, der nicht fortgesetzt werden sollte, da keine Berechtigungen erteilt wurden.
Angelo Vargas
DirectorySecurity wurde nicht gefunden. Was ist die Referenzbibliothek? Ich habe 3 Zeilen 'using ...' hinzugefügt, immer noch Fehler.
anhtv13
13

Sie müssen der Gruppe "Jeder" auf dem Computer die volle Kontrolle geben. Fand diesen Beitrag auf MSDN, der darüber spricht.

Hoffe das funktioniert bei dir.

Amar Palsapure
quelle
Danke, ich kümmere mich darum. Gewährt dies auch Zugriff auf zukünftige Konten?
Nawfal
Vielen Dank, es hat funktioniert und gewährt auch Zugriff auf zukünftige Benutzerkonten. Bitte akzeptieren Sie meine Bearbeitung, damit andere wissen, was genau zu tun ist.
Nawfal