Schreibberechtigungen für den Ordner der Anwendung ermitteln

Ich habe ein c#-Programm, und ich brauche einige Ausgabe in eine Protokolldatei während des Betriebs zu dumpen. Ich wollte dem Benutzer die Möglichkeit, wo Sie die Log-Datei zu finden geben, aber durch die Clientanforderung muss es standardmäßig auf die aktuelle Lage der Anwendung ist normalerweise/Program Files /.

Wenn ich meine Anwendung auf einem Computer mit Win7/Vista bereitstellen, aber schreibt die Anwendung die Protokolldatei nicht, wenn ich das Programm als Administrator ausführen. Zur gleichen Zeit scheint es im Hintergrund umschlagen den Fall, wo es die Datei schreiben kann, wie ich bin aktuell behandelt alle Ausnahmen während der Dateierstellung und Schreibprozess.

Ich versuche derzeit fehlende Schreibberechtigung von beiden zu erkennen:

A) erstellen ein DirectorySecurity-Objekt durch Aufruf von "Directory.GetAccessControl()" und

B) Überprüfung Sicherheit Privilegien mit der Methode "SecurityManager.IsGranted(permissions)",

aber A löst keine Ausnahme, wenn ich erwarte, und B gibt True zurück, die jedes Mal.

Ich habe zahlreiche Beiträge zu diesem Thema gesehen, aber sie alle geben die Lösung nur auf Application.UserAppDataFolder oder einige Variationen davon schreiben. Mein Mandant hat ausdrücklich gefragt, den Pfad der aktuellen Anwendung standardmäßig so muss ich zumindest feststellen, dass ein Weg, um sie anmutig zu warnen, wenn Sie die Log-Datei schreiben geht im Hintergrund fehl.

Hinweis: Meine aktuellen Code-Werke finden Sie unter Windows XP (da gibt es keine UAC, ich nehme an). Im Grunde alles, was ich wissen muss deshalb alle meine Anrufe sind erzählte mir, dass Schreiben der Datei fein, geht, wenn die Datei nie überhaupt erstellt wird, es sei denn, renne ich als "admin"

Vielen Dank!

Kommentar #1

Windows Vista und 7 wird prima Dateien in das Verzeichnis "Programme" schreiben.

Na ja, nicht wirklich, aber das Programm meint, es ist prima. In Wirklichkeit wird die Datei in VirtualStore-Verzeichnis des aktuellen Benutzers geschrieben; Das heißt, in%userprofile%\AppData\Local\VirtualStore\Program Files

Sie können eine Manifeste-Datei einbinden , um deaktivieren dieses Verhalten für Ihre Anwendung die Ergebnisse erhalten, die Sie erwarten.

Kommentar #2

Sie können erzwingen, dass das Betriebssystem Ihre app als admin ausführen

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Kommentar #3

Es gibt drei Möglichkeiten, Ihre app läuft - erhoben, absichtlich nicht erhoben (manifest sagen asInvoker ), oder versehentlich nicht erhoben (kein Manifest). Erhöhten apps werden in Programm-Dateien schreiben können. Absichtlich nicht erhöhten apps erhalten Zugriff verweigert. Versehentlich nicht erhöhten apps erfolgreich, jedoch wird die Datei an anderer Stelle geschrieben. Dieser letzte Fall ist, was mit ihnen geschieht. Es fehl nicht im Hintergrund. Sie wissen nicht, wo die Dateien sind. Finden Sie unter http://www.gregcons.com/KateBlog/FindingFilesYoureSureYouWrote.aspx für Screenshots.

Also wenn der Benutzer auf das aktuelle Verzeichnis zu bestehen, Sie sollten hinzufügen ein manifest fordert asInvoker . Sie erhalten dann AccessDenied und sie sehen die Fehlermeldung. Ich denke, dass sie für sich dies wünschen ungerade sind. Fragen sie, ob sie Ordnung mit einem zusätzlichen Klick um sie zu finden sind: Wenn ja, halten Sie Ihre app Virtualisierung (ich wirklich ablehnen), indem er kein Manifest und dann trainieren sie auf die Schaltfläche Kompatibilität Dateien klicken. Meine Vorliebe: anderswo zu schreiben und zu manifestieren asInvoker . Meine zweite Wahl: Stick mit aktuellen Verzeichnis, kein Manifest trainieren sie virtualisierte Dateien zu finden. Meine dritte Wahl: bleiben Sie bei aktuellen Verzeichnis, manifest, asInvoker , Benutzern Fehlermeldungen angezeigt, wenn Log-Dateien werden nicht geschrieben, aber Protokolle verloren gehen.

Kommentar #4

Ich erlebe das gleiche Problem. Ich habe eine Xml-Datei, der ich schreibe...Wenn ich die App(C sharp) installieren und versuchen, die Anwendung auszuführen erhalte eine Ausnahme aufgrund Schreibberechtigung. Als ich die Dateiberechtigung zu ändern (geben Sie Leseberechtigung für Benutzer) es funktioniert ok...

Kommentar #5

Der ultimative Test für, ob Sie die Rechte für eine Datei zu schreiben haben soll es zum Schreiben zu öffnen. D.h.

try
{
    File.Open(path, FileMode.OpenOrCreate);
    ...
}
catch(SecurityException)
{
   ... it failed for security reasons
}
catch(Exception)
{
   ... it failed for other reasons
}

Kommentar #6

Neben Stefan P.. 's Vorschlag zu erhöhen die app ausführen als Admin, könnte Sie auch die Installation zu ändern, Ordner-Berechtigung für installieren hinzufügen die Benutzer-Gruppe um Schreibzugriff haben. Die Anwendung kann dann ebenfalls eingesetzt werden.

Der Speicherort den Protokolldatei verschieben wäre aber die passende Unterkunft.

Tags lesen