| 

.NET C# Java Javascript Exception

6
Hi,

ich würde gerne feststellen, ob der aktuell angemeldete User auf einen Registry Key Lesen, Schreiben oder gar keinen Zugriff hat. Dabei soll natürlich auch berücksichtigt werden, dass u.U. die UAC den Zugriff einschränkt (Laut ACL kann er Rechte haben, aber hat das Programm nicht als Administrator gestartet) und nicht der angemeldete Benutzer entscheidend ist, sondern der, der aktuell das Programm ausführt.
Aktuell löse ich das wie folgt:

try // Is their write access?
{
k = k.OpenSubKey(this.LocalPath, true);
if (setLocalPermissions)
this.regKeyPermission = RegKeyPermissions.Write;
}
catch (SecurityException)
{
try // read access?
{
k = k.OpenSubKey(this.LocalPath, false);
if (setLocalPermissions)
this.regKeyPermission = RegKeyPermissions.Read;
}
catch (SecurityException) // Their is no access!!
{
if (setLocalPermissions)
this.regKeyPermission = RegKeyPermissions.None;
k = null;
}
}


Schön ist anders. Zum einen ist das im VS Debugger extrem langsam, zum anderen kann ich auf die Art und Weise nicht feststellen, ob z.B. ein User Zugriff auf die Rootfolder (HKCR, HKLM, ...) hat, da diese bei
k.OpenSubKey(this.LocalPath, true)
keine Exception schmeissen, auch wenn der User aufgrund aktivierter UAC keinen Schreibzugriff hat. Last but not least, fühlt sich diese Exception-Stapelei nicht gut an ;-)

Ich vermute die Lösung in der RegistrySecurity-Klasse, aber ich blicke wirklich nicht, wie ich aufgrund dieser Infos prüfen kann, wie der Benutzer, der das Programm aktuell ausführt, berechtigt ist. Hat da jemand ein nettes Snippet in der Rockfalte oder Tipp zur Herangehensweise?

Gruss Dave
News:
23.07.2013
david.koenig09 173 6
1 Antwort
0
Hier ein kleines Demo-Script auf dem du aufbauen kannst:

using System.Security;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Security.Permissions;
using Microsoft.Win32;

RegistryKey regKeyRoot = Registry.CurrentUser;
RegistrySecurity regSec = regKeyRoot.GetAccessControl(AccessControlSections.Access);
AuthorizationRuleCollection coll = regSec.GetAccessRules(true, true, typeof(NTAccount));
foreach(RegistryAccessRule x in coll){
Console.WriteLine(x.IdentityReference.Value + ' : ' + x.RegistryRights);
}
02.08.2013
Floyd 14,6k 3 9
Floyd 14,6k 3 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH