Ab Vista und Visual Studio 2005 gibt es Manifest-Dateien für .net-Programme, mit denen die Rechte (UAC) festgelegt werden, die die Anwendung zum Ausführen benötigt. Vorhin las ich den Artikel Enabling your Application for UAC und war etwas irritiert, gibt es den Button View UAC Settings in meiner Visual Studio 2010-Ultimate-Testversion sowie der 2008er Express-Version doch gar nicht.
Bei meinen Versionen habe ich in den Projekteigenschaften an der Stelle nur eine Combobox mit den Optionen "Manifest mit Standardeinstellungen einbetten" und "Anwendung ohne Manifest erstellen", einen Dateiauswahldialog zu öffnen ist auch nicht möglich.
Aber nicht weiter tragisch, wenn man nur die Standard-Rechte für die Anwendung benötigt kann man die Datei einfach zur Kompilierzeit vom Compiler selbst erstellen lassen - ansonsten fügt man im Projektmappen-Explorer mit Hinzufügen\Neues Element die Manifest-Datei hinzu, über den Punkt "Anwendungsmanifestdatei".
Diese Datei ist eine einfache XML-Datei; über das XML-Element requestedExecutionLevel können höhere Rechte wie das Administrator-Privileg angefordert werden.
Gemäß dem Artikel Vista UAC Elevation (deutsch) ist es nicht möglich Administrator-Rechte für eine einzelne Aktion abzufragen, sondern immer nur für das ganze Programm - sein Codeschnippsel von CodeProject ermöglicht es aber die Anwendung mit Admin-Rechten neu zu starten, aber dann kann man es IMHO auch direkt über die Manifest-Datei festlegen.
Man kann es demnach trotzdem indirekt erreichen, indem man seinen Codeschnippsel ausführt der abfragt ob der Prozess Admin-Rechte hat und wenn ja ein neues Programm ausführt das diese Rechte benötigt und die spezielle Aufgabe ausführt.
Ergänzung: Ich habe seinen Code gerade getestet, die using-Klauseln fehlten oder ich habe sie übersehen, aber ansonsten funktioniert die Abfrage - ob der aktuelle Windows-Benutzer Admin-Rechte hat - einwandfrei:
using System.Security.Principal;
using System.Runtime.InteropServices;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("user32")]
public static extern UInt32 SendMessage
(IntPtr hWnd, UInt32 msg, UInt32 wParam, UInt32 lParam);
internal const int BCM_FIRST = 0x1600; //Normal button
internal const int BCM_SETSHIELD = (BCM_FIRST + 0x000C); //Elevated button
static internal bool IsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal p = new WindowsPrincipal(id);
return p.IsInRole(WindowsBuiltInRole.Administrator);
}
private void button1_Click(object sender, EventArgs e)
{
if (IsAdmin())
{
MessageBox.Show("Ja, Admin-Rechte vorhanden");
}
else
{
MessageBox.Show("Nein, keine Admin-Rechte vorhanden");
}
}
}
Weitere Links
VBS-Pendant
Übrigens, hier habe ich noch ein Skript gespeichert welches dieselbe Aufgabe in einem VBS-Skript ausführt:
Quelle: Link
Ein Unterstrich bedeutet in VBS übrigens das die darauffolgende Zeile zur vorangegangenen zählt...
'************ IsNTAdmin.vbs CMDR 080120 ******************
Option Explicit
Function IsNTAdmin
Const HKCU = &H80000001
Const AdminGroupSID = "S-1-5-32-544"
Dim objNet,strUName,strHost,objReg,strBaseKey
Dim ret,i,arrValueNames,arrValueTypes,strValueName
IsNTAdmin = false
strHost = "."
Set objReg = GetObject("winmgmts://" & strHost & _
"/root/default:StdRegProv")
strBaseKey = "Software\Microsoft\Windows\" _
&"CurrentVersion\Group Policy\GroupMembership"
ret=objReg.EnumValues(HKCU,strBaseKey,arrValueNames,arrValueTypes)
If (ret<>0 Or Err.number<>0) then Exit Function
For i=0 To UBound(arrValueNames)
If (arrValueTypes(i)=1) then
ret=objReg.GetStringValue(HKCU,strBaseKey,arrValueNames(i),strValueName)
If(strValueName=AdminGroupSID) then
IsNTAdmin=true
Exit Function
End If
End If
Next
End Function
If (IsNTAdmin) then
MsgBox "Glückwunsch, Sie genießen Administratorrechte auf diesem System !",,"Hinweis"
else
MsgBox "So ein Pech, Sie besitzen keine Administratorrechte auf diesem System !",,"Hinweis"
end if