Seit Windows Vista die Benutzerkontensteuerung (User Account Control) eingeführt hat, existieren für einen Benuter in Windows zwei Tokens. Ein Token, nämlich der eingeschränkte Token erhält die Berechtigungen eines Standardanwenders. Der andere administrative Token erhält mehr Rechte (üblicherweise administrative Berechtigungen). Im Standardfall werden Applikation mit dem eingeschränkten Token gestartet. Für Aktionen, die administrative Berechtigungen benötigen, kann sich die Applikation mit dem zweiten Token (mit administrativen Berechtigungen) erneut starten und diese ausführen. Um diese Aktion anzuprogrammieren, sollte man zunächst abfragen ob die Applikation mit dem administrativen Token (häufig auch elevated Token genannt). Nachfolgend will ich drei Standardaufgaben erläutern:

  1. Anzeige des Shield-Icons
  2. Abfagen, ob die eigene Applikation elevated läuft (C++) bzw. in C# (wie gehabt) ob der Adminrechte hat
  3. Die eigene Applikation elevated neu starten

Hierzu einige Codeschnipsel ein C#:

1. Anzeige des Shield-Icons

private void DisplayShieldBasedOnAdmin()
{

if ( !IsAdmin() )
{

// Mit Service Pack 1 des .NET Framework v2.0 kommt ein neues Icon dazu:  SystemIcons.Shield
btn_RestartElevated.Image = Bitmap.FromHicon( SystemIcons.Shield.Handle );
btn_RestartElevated.TextImageRelation =
TextImageRelation.ImageBeforeText;

}

}

2. Abfagen, ob die eigene Applikation elevated läuft (C++) bzw. in C# (wie gehabt) ob der Adminrechte hat

using System.Security;
using
System.Security.Principal;

public static Boolean IsElevated()
{

WindowsIdentity id = WindowsIdentity.GetCurrent();

WindowsPrincipal p = new WindowsPrincipal(id);

return p.IsInRole(WindowsBuiltInRole.Administrator);

}


3. Die eigene (Windows Forms) Applikation elevated neu starten

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

private void RestartAppElevated()
{

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

try
{

Process p = Process.Start(si);

}
catch
{

return;

}

Application.Exit();

this.Activate();

}