vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - G?nnen Sie Ihrem SQL-Kommando diesen kr?nenden Abschlu?!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2017
 
zurück
Rubrik: .NET   |   VB-Versionen: VB2005, VB200803.08.09
UAC-konforme Anwendungen entwickeln

Die Benutzerkontensteuerung wird von einigen Anwendern und Entwicklern verflucht. Dieser Workshop zeigt, wie eigene Anwendungen abgestimmt werden müssen, damit diese unter Windows Vista und Windows 7 korrekt arbeiten.

Autor:  Ralf EhlertBewertung:     [ Jetzt bewerten ]Views:  26.771 

Summer-Special bei Tools & Components!
Gute Laune Sommer bei Tools & Components
Top Summer-Special - Sparen Sie teilweise bis zu 120,- EUR
Alle sev-Entwicklerkomponenten und Komplettpakete jetzt bis zu 25% reduziert!
zum Beispiel:
  • Developer CD nur 479,20 EUR statt 599,- EUR
  • sevDTA 3.0 nur 224,30 EUR statt 299,- EUR
  •  
  • vb@rchiv   Vol.6 nur 20,00 EUR statt 24,95 EUR
  • sevCoolbar 3.0 nur 55,20 EUR statt 69,- EUR
  • - Werbung -Und viele weitere Angebote           Aktionspreise nur für kurze Zeit gültig

    Die Benutzerkontensteuerung von Windows Vista und 7 meistern

    Der Sinn von Benutzerrechten

    Benutzergruppen als Sicherheitsfeature
    Sicherheit ist ein wichtiges Thema und Windows bietet zahlreiche Funktionen, dieser Anforderung gerecht zu werden.

    Welche Aktionen ein Benutzer ausführen darf regeln die Benutzerrechte. Diese können einem individuellem Benutzer zugewiesen werden oder einer ganzen Benutzergruppe.

    Mit der Installation von Windows werden einige Standardbenutzergruppen eingerichtet. Zwei davon sind besonders wichtig: Administrator und Benutzer.

    Ein Administrator ist mit sehr weitreichenden Rechten ausgestattet und darf nahezu alles am System. Seine Aufgabe ist es, das System zu verwalten und zu warten. Dazu gehört das Hinzufügen/Entfernen von Programmen, die Änderung von Systemeinstellungen oder neue Benutzer einrichten.

    Benutzer hingegen haben bedeutend weniger Rechte. Sie haben lediglich Zugriff auf das eigene Benutzerprofil, aber nicht auf das komplette Dateisystem. Weiterhin können sie installierte Programme nutzen oder benutzerbezogene Systemeinstellungen ändern (z.B. Hintergrundbild des Desktops).

    Anwendungen haben dieselben Berechtigungen wie der angemeldete Benutzer, der die Anwendung ausführt. Somit besitzen Schadprogramme unter einem administrativen Konto ein wesentlich höheres Schadenspotenzial als unter einem Standardkonto. Daher sind wir als Programmierer mit gefördert, aktiv bei der Sicherheit mitzuwirken, dass unsere Programme unter Standardrechte lauffähig sind.

    Benutzerkontensteuerung - Warum?
    Durch die historische Entwicklung von Windows bedingt arbeiten viele Benutzer mit administrativen Berechtigungen. Windows XP vereinigte die Produktlinien NT (Windows NT und 2000) und DOS (Windows 9x/Me). Letztere kennen keine Benutzerrechte - jeder Benutzer darf alles.

    Benutzer arbeiten aus drei Gründen als Administrator:

    • Es ist der Standardkontotyp bis Windows XP
    • Es ist für einen Anwender schwer ersichtlich, wann eine Operation erhöhte Rechte benötigt
    • Viele Programme erzwingen unnötigerweise Adminrechte

    Das Schild-Symbol kennzeichnet ab Windows Vista Aufgaben, die höher privilegierte Berechtigungen benötigen. Dieses Symbol sollte auch in eigenen Anwendungen die Bereiche kennzeichnen, die weiterreichende Berechtigungen benötigen.

    Ab Windows 2000 gibt es den Befehl „runas“, welcher es erlaubt, eine Anwendung unter einem anderen Benutzerkonto (Identität) auszuführen. Hierdurch wird ermöglicht, das Arbeiten mit administrativen Rechten auf die notwendigen Aufgaben zu minimieren und nicht generell als Administrator zu arbeiten.

    Dieser Befehl hat aber den Nachteil, dass nicht jede Art von Anwendung so als Administrator ausgeführt werden kann. MSI-Pakete, welche dazu dienen, Software zu installieren und zu warten, unterstützen „runas“ nicht. Damit es doch klappt, muss ein Eingabeaufforderungsfenster mit administrativen Rechten gestartet werden und darüber das MSI-Paket ausgeführt werden. Für einen Standardanwender kein gangbarer Weg.

    Die Benutzerkontensteuerung (UAC, User Account Control) erlaubt es mittels Knopfdruck bei Bedarf in einen administrativen Kontext für die Aufgabenausführung zu wechseln.

    UAC im Detail
    Welche Rechte ein Benutzer hat wird durch ein Security Token beschrieben. Dieses verwendet Windows um zu entscheiden, ob ein Ressourcenzugriff erfolgen darf oder nicht.

    Ab Windows Vista besitzen Benutzer mit erweiterten Rechten (d.h. alle Rechte außerhalb der Benutzergruppe Benutzer) zwei Security Token: Eins mit allen Rechten und ein gefiltertes, welches vom Rechteumfang des eines Standardbenutzers entspricht.

    Das erste Programm, welches bei der Benutzeranmeldung gestartet wird, ist der Windows Explorer. Damit werden die Windows-Startleiste und der Desktop angezeigt. Der Explorer wird mit dem gefilterten Security Token gestartet. Alle weiteren Programme erben standardmäßig dieses Token, womit diese ebenfalls nur Standardberechtigungen besitzen.

    Ein Programm kann beim Starten auch erweiterte Benutzerrechte anfordern. Dies erfolgt über das Anwendungsmanifest. Werden diese erweiterten Benutzerrechte angefordert, erscheint der Bestätigungsdialog der UAC und der Benutzer muss dieser Heraufstufung zustimmen. Die Benutzerentscheidung wird nicht gespeichert, d.h. der Benutzer muss diese bei jeder Rechteerweiterung genehmigen.

    Der Bestätigungsdialog wird hierbei auf dem s.g. Secure Desktop ausgeführt. Dieses ist isoliert und kann programmatisch nicht ferngesteuert werden. Erkennbar ist der Secure Desktop an dem abgedunkelten Desktophintergrund.

    UAC-kompatible Anwendungen entwickeln

    Wann werden Adminrechte benötigt?
    Den wenigsten Aufwand hat man, wenn man erst gar keine erweiterten Rechte benötigt. Dies trifft für sehr viele Anwendungen zu und selbst für die Softwareentwicklung sind in vielen Fällen keine Adminrechte notwendig.

    Leider geht es nicht immer als Standardbenutzer und es werden weiterreichende Berechtigungen benötigt. Nämlich dann, wenn systemweite Änderungen durchgeführt werden sollen.

    Typische Aufgaben, die Adminrechte erzwingen (und in vielen Fällen vermeidbar sind):

    • Schreiben ins Programme-Verzeichnis
    • Direktes schreiben auf C: etc.
    • Schreiben in HKLM

    Diese Probleme lassen sich vermeiden, in dem man alternative Speicherorte verwendet. Diese lassen sich sehr bequem über System.Enviroment.GetFolderPath() auslesen. Die SpecialFolder-Enumeration definiert zahlreiche „besondere“ Orte. Sehr wichtig sind folgende:

    • LocalApplicationData für benutzerspezifische Daten
    • ApplicationData für benutzerspezifische Daten, welche im Roaming-Profil abgelegt werden
    • CommonApplicationData für anwendungsspezifische Daten

    Das Schreiben ins Programme Verzeichnis ist einer der häufigsten Ursachen, warum eine Anwendung unnötigerweise Adminrechte benötigt.

    Damit bereits bei der Entwicklung auffällt, welche Aktionen weiterreichende Rechte benötigen, ist es sehr empfehlenswert, als Standardbenutzer zu entwickeln.

    Aufgaben mit dem Schild-Symbol kennzeichnen
    Aktionen, die erhöhte Rechte erfordern, sollen mit dem UAC-Schild-Symbol gekennzeichnet werden. Dafür wird ein eigenes Steuerelement entwickelt, um das wiederholte Setzen von Eigenschaften zu vermeiden.

    Als erstes wird ein Klassenbibliotheksprojekt namens UacButton erstellt.

    Bevor mit der Programmierung begonnen werden kann, müssen noch einige Vorbereitungen durchgeführt werden. Dazu werden die Projekteigenschaften durch einen Doppelklick auf My Project geöffnet. Unter Verweise werden Referenzen auf die .NET-Assemblies System.Drawing und System.Windows.Forms hinzugefügt.

    Im Bereich Ressourcen wechselt man auf Bilder und fügt die Grafiken Shield16.png, Shield32.png und Shield48.png hinzu. Diese drei Dateien können hier als Zip-Archiv heruntergeladen werden. Weiterhin wählt man im Eigenschafsfenster unter Persistence die Option „Eingebettet in .resx“ aus. Alle bisherigen Änderungen sollten jetzt gespeichert werden.

    Ersetzen Sie als nächstes den Code der Class1 durch nachfolgenden Code:

    Option Strict On
     
    Imports System.Drawing
    Imports System.Windows.Forms
     
    Public Class UacButton
      Inherits Button
     
    End Class

    Es werden zwei Namensräume eingebunden, die für die Erstellung von eigenen Steuerelementen benötigt werden. Weiterhin erbt unser UacButton von dem Standard-Button-Steuerelement.

    Unser Button soll das UAC-Symbol links vor dem Buttontext darstellen. Dieses soll sich automatisch der Buttongröße anpassen. Dafür wird die Methode DisplayUacShield geschrieben:

    Private Sub DisplayUacShield()
      If Me.Height > 55 AndAlso Me.Width > 55 Then
        Me.Image = My.Resources.Shield48
      ElseIf Me.Height > 39 AndAlso Me.Width > 39 Then
        Me.Image = My.Resources.Shield32
      Else
        Me.Image = My.Resources.Shield16
      End If
    End Sub

    Diese Methode werden wir im Konstruktor aufrufen sowie im Resize-Event, damit das Symbol passend dargestellt wird. Im Konstruktor werden noch einige Eigenschaften gesetzt, so dass die komplette Klasse wie folgt aussieht:

    Option Strict On
     
    Imports System.Drawing
    Imports System.Windows.Forms
     
    Public Class UacButton
      Inherits Button
     
      Public Sub New()
        ' Konstruktor der Basisklasse aufrufen
        MyBase.New()
     
        ' Eigenschaften setzen
        Me.ImageAlign = ContentAlignment.MiddleLeft
        Me.TextImageRelation = Windows.Forms.TextImageRelation.ImageBeforeText
        Me.Size = New Size(90, 23)
     
        ' UAC-Symbol anzeigen
        DisplayUacShield()
      End Sub
     
      Private Sub UacButton_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
        DisplayUacShield()
      End Sub
     
      Private Sub DisplayUacShield()
        If Me.Height > 55 AndAlso Me.Width > 55 Then
          Me.Image = My.Resources.Shield48
        ElseIf Me.Height > 39 AndAlso Me.Width > 39 Then
          Me.Image = My.Resources.Shield32
        Else
          Me.Image = My.Resources.Shield16
        End If
      End Sub
    End Class

    Damit ist das Steuerelement fertig und kann verwendet werden:

    Hinweis:
    Bevor Sie das Steuerelement auf die Form platzieren können, müssen Sie die Anwendung zunächst einmalig starten und beenden. Anschließend steht Ihnen das neue Steuerelement ganz oben in der Toolbox zur Auswahl zur Verfügung.

    Das Anwendungsmanifest konfigurieren

    Anhand des Manifests können Anwendungen eine von drei verschiedenen Berechtigungsstufen anfordern, welche beim Starten des Prozesses ausgewertet werden. Diese können sehr einfach über Visual Studio konfiguriert werden, in dem man in den Projekteigenschaften auf die Schaltfläche „Einstellungen für die Benutzerkontensteuerung anzeigen“ klickt.

    Das Manifest ist eine XML-Datei und durch die Kommentare wird ersichtlich, wie diese ggf. geändert werden muss. Die drei Levels sind:

    • asInvoker: Anwendung läuft mit den Berechtigungen, wie der Prozess, der die Anwendung startet. Das ist i.d.R. der Windows Explorer, womit die Anwendung Standardberechtigungen erhält.
    • highestAvailable: Die Anwendung erhält die maximalen Berechtigungen des Benutzers. Dies müssen nicht unbedingt Administratorrechte sein, da es auch weitere privilegierte Benutzergruppen gibt (z.B. Sicherungsoperator oder Domain-Administrator).
    • requireAdministrator: Die Anwendung fordert Administratorrechte an.

    Die eigene Anwendung sollte i.d.R. mit asInvoker lauffähig sein. Vereinzelte Aufgaben, die erhöhte Berechtigungen benötigen, werden in einen separaten Prozess ausgelagert, welche dann die höheren Berechtigungen anfordern über highestAvailable oder requireAdministrator.

    Einen Prozess mit erhöhten Rechten starten
    Das Starten eines Prozesses erfolgt durch die Klassen Process und ProcessStartInfo aus dem Namensraum System.Diagnostics:

    Dim info As New ProcessStartInfo(processPath)
    info.UseShellExecute = True
    info.Verb = "runas"
    Process.Start(info)

    Wichtig ist es, dass die Eigenschaften UseShellExecute und Verb gesetzt werden, damit der UAC-Dialog erscheint:

    Unter Windows XP erscheint übrigens folgender Dialog:

    Sollte der Benutzer den Dialog mit Abbrechen schließen, wird eine Win32Exception ausgelöst, auf die reagiert werden kann.

    Wirkt der Vista-Dialog nicht etwas abschreckend für einen normalen Anwender? Denn bei den Windows-Befehlen sieht der Dialog freundlicher aus:

    Freundliche UAC-Dialoge für eigene Anwendungen
    Welcher Dialog erscheint hängt davon ob, ob die eigene Anwendung digital signiert ist oder nicht. Dafür benötigt man zuerst ein Zertifikat für Codesignierung. Dieses kann entweder selbst erstellt (z.B. für interne Anwendungsbereiche) oder von einer bekannten CA (Certificate Authority - Zertifikatsherausgabestelle) wie VeriSign, Thawte oder Globalsign gekauft werden. Eine Anleitung zur Signierung findet sich auf  MSDN-Solve.

    Dieser Workshop wurde bereits 26.771 mal aufgerufen.

    Über diesen Workshop im Forum diskutieren
    Haben Sie Fragen oder Anregungen zu diesem Workshop, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

    Aktuelle Diskussion anzeigen (6 Beiträge)

    nach obenzurück


    Anzeige

    Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
    (einschl. Beispielprojekt!)

    Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
    - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
    - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
    Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
     
       

    Druckansicht Druckansicht Copyright ©2000-2017 vb@rchiv Dieter Otter
    Alle Rechte vorbehalten.
    Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

    Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel