Skip to main content


User Account Control, Praxis

Die meisten Desktop-Anwendungen müssen nie schreibend auf nur für Administratoren zugängliche Verzeichnisse oder Registry Keys zugreifen oder nur Administratoren zugängliche Funktionen nutzen, sodass sie problemlos mit den Rechten eines Standardnutzers laufen können. Sie müssen nur darauf vorbereitet sein, denn viele Programme für Windows XP bräuchten eigentlich gar keine Administratorrechte, wenn sie nicht z.B. ihre Konfigurationsdatei im ab Vista für Standardnutzer nicht mehr beschreibbaren Programmverzeichnis speichern würden.

Aber auch wenn ein Programm für einen Teil seiner Funktionen Administratorrechte benötigt, sollte das Programm selbst mit Standardrechten laufen und die Administratorrechte nur bei Bedarf gezielt anfordern. Es ist bei entsprechender Vorbereitung für ein mit Standardrechten laufendes Programm kein Problem, bei Bedarf einen weiteren Prozess mit Administratorrechten zu starten. Allerdings kann ein mit Administratorrechten gestartetes Programm diese nicht wieder los werden. Trennen Sie also alle Programmteile, die Administratorrechte benötigen, von denen, die ohne auskommen, sodass sie als separater Prozess mit Administratorrechten gestartet werden können.

Wohin mit den Daten?

Für Programme, die mit den Standardrechten laufen, sind einige Verzeichnisse nicht zugänglich, so kann z.B. die Konfigurationsdatei nicht mehr zusammen mit der Programmdatei im Programmverzeichnis gespeichert werden. Für das Speichern der Benutzerdaten gibt es daher unter Windows 7 einige empfohlene Verzeichnisse:

Benutzerdaten:

  • FOLDERID_RoamingAppData / System.Environment.SpecialFolder.ApplicationData
    (Default-Wert: %appdata%) für Daten, auf die nicht über den Windows-Explorer zugegriffen werden muss.
  • FOLDERID_LocalAppData / System.Environment.SpecialFolder.LocalApplicationData
    (Default-Wert: %localappdata%) für Daten, auf die nicht über den Windows-Explorer zugegriffen werden muss und die auf dem lokalen Rechner gespeichert werden sollen.
  • FOLDERID_Documents / System.Environment.SpecialFolder.MyDocuments
    (Default-Wert: %userprofile%\documents) für Daten, auf die im Windows-Explorer zugegriffen werden soll.

Programmdaten:

  • FOLDERID_ProgramData / System.Environment.SpecialFolder.CommonApplicationData
    (Default-Wert: %systemdrive%) für Daten, auf die nicht über den Windows-Explorer zugegriffen werden muss und die für alle Benutzer des Rechners gelten sollen.
  • FOLDERID_Public / FOLDERID_PublicDocuments / System.Environment.GetEnvironmentVariable("public")
    (Default-Wert: %public%) für Daten, auf die im Windows-Explorer zugegriffen werden soll.

Generell sollten Sie keine festen Pfade verwenden. Verwenden Sie stattdessen das API Known Folders und die Funktion SHGetKnownFolderPath zum Ermitteln des passenden Pfads.

Höhere Rechte anfordern

Es gibt verschiedene Möglichkeiten, höhere Benutzerrechte anzufordern: Entweder vorab über das Manifest oder bei Bedarf durch das Programm selbst, entweder indem die eigenen Rechte angehoben oder indem ein neuer Prozess mit den höheren Rechten gestartet wird.

Höhere Rechte über das Manifest

An Vista und Windows 7 angepasste Programme verfügen über das sog. Manifest, eine XML-Datei zur Spezifikation von Abhängigkeiten, visuellen Styles und weiteren Programmeigenschaften. Darüber können sie auch höhere Benutzerrechte anfordern. Der Sicherheitsabschnitt in einem Manifest-Dokument kann z.B. so aussehen:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  
<assemblyIdentity type="win32"
                    processorArchitecture="*"
                    version="1.0.0.0"
                    name="Demoanwendung.exe"/>

  <description>Eine Demoanwendung für Vista und Windows 7</description>

  <ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2">
    <ms_asmv2:security>
      <ms_asmv2:requestedPrivileges>
        <ms_asmv2:requestedExecutionLevel level="asInvoker"/>
      </ms_asmv2:requestedPrivileges>
    </ms_asmv2:security>
  </ms_asmv2:trustInfo>

</assembly>

 

Für das Attribut requestedExecutionLevel stehen drei verschiedene Werte zur Verfügung:

  • asInvoker (Start mit den Rechten des übergeordneten Prozesses)
  • highestAvailable (Start mit den höchsten Rechten des aktuellen Benutzers (*) )
  • requireAdministrator (Start mit den Rechten eines Administrators, die ggf. über einen UAC-Dialog bestätigt werden müssen)

Zusätzlich sollte das Programm signiert werden, sodass der Benutzer prüfen kann, von wem es stammt und ob es unverändert ist.

(*) Bei der Verwendung von highestAvailable werden beim Programmstart durch einem Administrator über einen UAC-Dialog Administratorrechte angefordert, bei einem Standardnutzer läuft das Programm mit dessen eingeschränkten Rechten.

Höhere Rechte über runas in .NET

In .NET können über den Befehl runas Administratorrechte angefordert werden. In C# kann z.B. ein laufender Prozess mit Administratorrechten folgendermaßen neu gestartet werden:

using System;
using System.Diagnostics;
using System.Windows.Forms;

private void RestartAppElevated() {

   ProcessStartInfo psi = new ProcessStartInfo();
   psi.UseShellExecute = true;
   psi.WorkingDirectory = Environment.CurrentDirectory;
   psi.FileName = Application.ExecutablePath;
   psi.Verb = "runas";

   try {
      Process p = Process.Start(psi);
   }

   catch {
      // evtl. ist der Benutzer nicht einverstanden
      return;
   }

   Application.Exit();
   this.Activate();
}

 

Um in C# einen neuen Prozess mit Administratorrechten zu starten, kann z.B. folgender Code verwendet werden:

System.Diagnostics.Process proc = new System.Diagnostics.Process();

proc.StartInfo.FileName = "C:\\Windows\\system32\\notepad.exe";
proc.StartInfo.Verb = "runas";
proc.Start();

 

Ausführliche Beispiele für die Nutzung des UAC finden Sie unter den "All-In-One Security Code Samples" des All-In-One Code Frameworks.

Weiterführende Links

[1] User Account Control (UAC) Documentation for Windows 7, Windows Vista, Windows Server 2008 R2, and Windows Server 2008 (englisch)
This collection contains links to detailed information about User Account Control (UAC) for the IT professional.

[2] User Account Control Step-by-Step Guide (englisch)
This step-by-step guide provides the instructions necessary to use User Account Control (UAC) in a test environment.

[3] Windows 7 APIs (Teil 3 von 6) - User Account Control & Co.
Dieser Webcast geht auf Themen ein, die bei Windows 7 im Zusammenhang mit der User Account Control relevant sind. Er erläutert, welche APIs in Verbindung zur UAC stehen und wirft dabei einen Blick auf UIPI, Virtualization, Session 0 Isolation, Installer Detection und Version Checking.

[4] Windows 7 Security Features (englisch)
Windows 7 includes new and improved security features that make it easier for developers to improve, use, and manage the security of their applications. It comes with a variety of new security features that not only help protect against threats but also limit the damage that attackers can do if they gain access to a computer.


 

Autor des Artikels

Dipl.-Inform. Carsten Eilers ( www.ceilers-it.de) ist als freier Berater und Coach für IT-Sicherheit und technischen Datenschutz tätig und als Autor verschiedener Artikel und des Buches "Ajax Security" bekannt.  Seinen Blog finden Sie hier.

 



These postings are provided "AS IS" with no warranties, and confers no rights. Use of included code samples are subject to the terms specified at Microsoft - Information on Terms of Use. The content of these security articles are the own personal opinions from Carsten Eilers.

Microsoft führt eine Onlineumfrage durch, um Ihre Meinung zur -Website zu erfahren. Wenn Sie sich zur Teilnahme entscheiden, wird Ihnen die Onlineumfrage angezeigt, sobald Sie die -Website verlassen.

Möchten Sie teilnehmen?