2009-11-11 18 views
5

Meine Anwendung enthält eine ausführbare Datei mit Selbstaktualisierung, die zum Aktualisieren der Anwendung verwendet wird.Schreibzugriff auf den Ordner "Programme"

Einer der ersten Schritte der Updater ist ausführt zu prüfen, ob es

Schreibberechtigung für den Anwendungsordner hat

IPermission perm = new FileIOPermission(FileIOPermissionAccess.AllAccess, _localApplicationCodebase);

 if (!SecurityManager.IsGranted(perm)) 
     { 
      OnProgressChanged("Security Permission Not Granted \n The updater does not have read/write access to the application's files (" + 
           _localApplicationCodebase + ")",MessageTypes.Error); 
      return false; 
     } 

     OnProgressChanged("Updater have read/write access to local application files at " + _localApplicationCodebase); 
     return true; 

Wenn unter Win7/Vista ausgeführt wird, diesen Code Pass (was bedeutet, dass nach CAS, der Code hat Schreibzugriff), aber wenn ich versuche, Dateien zu schreiben, bekam ich einen Zugriff verweigert (und ich habe bestätigt, dass die Dateien nicht verwendet werden)

Ich verstehe, dass Vista/Win7 UAC Benutzer davon abhält Schreiben von Dateien in den Ordnern der Programmdateien. Ich jedoch nicht verstehen, was ist, warum die Erlaubnis erteilt, wenn in Wirklichkeit ist es nicht

Grüße,

Eric Girard

PS: Wenn ich den gleichen Code mit ‚Ausführen als Administrator‘ ausführen funktioniert es gut

+0

Ist die Anwendung versucht, sich zu lassen, zu überschreiben, während es läuft? –

+0

Wie ich schrieb, nein ist es nicht, der Updater ist ein anderer .exe, dass keine Abhängigkeiten von lokalen dll –

+0

Ich denke, wenn Sie kein Administrator sind, dann dürfen Sie keine ausführbare Datei in irgendwelchen Programmdateien schreiben Unterordner. Versucht Ihr Updater, ausführbare Dateien zu schreiben? –

Antwort

4

Der beste Weg, um ein Auto-Updater zu schreiben, ist eine sekundäre Anwendung zu haben. Das erste Programm ruft das zweite mit erhöhten Rechten auf und fordert UAC an. Dann kann die zweite Anwendung die Patches installieren.

+0

Oder machen Sie die Anwendung selbst erneut mit erhöhten Rechten aufrufen. Wenn es diese Privilegien nicht hat, sollte es sich selbst wieder laufen lassen und die UAC nach mehr Rechten fragen ... –

+0

Genau das mache ich gerade, aber das beantwortet meine Frage immer noch nicht: Warum ist SecurityManager? IsGranted gibt TRUE für diesen Ordner zurück, wenn er in Wirklichkeit nicht für den Ordner der Programmdateien gewährt wird? –

4

Die wichtige Information über UAC ist, dass kein Code mit Administratorrechten ausgeführt wird und daher nicht in das Programmverzeichnis schreiben kann. Selbst wenn Sie als Administrator angemeldet sind, werden die Apps mit Standardbenutzerrechten gestartet.

Es gibt zwei Möglichkeiten. Sie können festlegen, dass der Benutzer die App mit dem Menübefehl Als Administrator ausführen startet. Dies beruht jedoch darauf, dass sich der Benutzer an etwas erinnert. Das bessere war, ist embed a manifest in Ihrer ausführbaren Datei, die Administratorrechte anfordert. Setzen Sie im Manifest requestedExecutionLevel auf requiryAdministrator. Dies führt dazu, dass die Benutzerkontensteuerung den Benutzer nach dem Start der App zur Eingabe von Administratoranmeldeinformationen auffordert.

Wie Daniel sagte, ist die beste Lösung, die Aktualisierungsfunktionalität in eine separate Anwendung zu bringen. Ihre primäre App verfügt über ein Manifest, das den angefordertenExecutionLevel auf "asInvoker" und Ihre Updater-App mit der Anforderung "requireAdministrator" festlegt. Ihre primäre App kann mit Standardberechtigungen ausgeführt werden. Wenn das Update durchgeführt werden muss, verwenden Sie Process.Start, um die Updater-Anwendung zu starten, für die der Benutzer die Administratoranmeldeinformationen eingeben muss.

1

Ich bin mir nicht sicher, ob das ist, was Sie versuchen zu tun, aber ich habe diesen Beitrag hilfreich gefunden. Mit dem enthaltenen Code können Sie feststellen, ob Ihre App unter Vista läuft, ob die UAC aktiviert ist und ob der Benutzer erhöht ist.

http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html

starten Sie Ihre App mit runas Benutzer elevate Berechtigungen

ProcessStartInfo processInfo = new ProcessStartInfo(); 
processInfo.Verb = "runas"; 
processInfo.FileName = Application.ExecutablePath; 
Process.Start(processInfo);