Thomas Kramer

IT-COW | Visual Studio

UAC-Benutzerkontensteuerung in VS 2008|2010 - Projekten & VBS-Pendant

By Administrator at August 24, 2010 17:04
Filed Under: C#, VBScript, Visual Studio

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

 

Monats-Liste