2009-09-16 7 views
2

J'ai un morceau de code comme celui-ciVérifier l'autorisation d'enregistrement sans jeter exception

try 
{ 
    RegistryKey regKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\xxxx\\yyyyy"); 
    // more code 
} 
catch 
{ 
} 

Je n'aime pas l'utilisation du bloc catch vide. Mais, c'est utile parce que si l'utilisateur n'a pas les permissions pour accéder au registre, rien ne devrait être fait. Cette pièce de code est appelée plusieurs fois et, à part une mauvaise pratique, je pense qu'elle a de mauvaises performances.

Je cherchais un moyen de vérifier les autorisations de registre avant d'essayer d'y accéder, mais la seule façon que j'ai trouvé de le faire, il est de vérifier une exception avec

RegistryPermission.Demand()

et vérifier une exception. Donc, cela ne me donne aucun avantage avec l'approche initiale.

¿Y at-il un moyen de vérifier les autorisations d'accès au registre sans lancer artificiellement ou avoir à vérifier les exceptions?

Edit:

Eh bien, ressemble à la façon préférée .NET de faire cela tente d'accéder à la ressource et vérifier les exceptions. L'article pointé par Yannick montre à quel point il est complexe de traiter le modèle de sécurité de Windows, en cherchant l'accès désiré manuellement. Donc, ce que je vais faire est de reconcevoir un peu ce code afin qu'il ne vérifie qu'une seule fois l'accès (attraper l'exception) et conserve cette information, au lieu de lancer constamment des exceptions. Cela a l'inconvénient que si l'utilisateur change les paramètres de sécurité "à la volée", le code continuera à refuser l'accès au Registre. Cependant, ceci est préférable s'il n'y a pas un moyen simple et propre de vérifier l'accès.

Répondre

2

Puisque vous créez une nouvelle clé, ne devriez-vous pas simplement vérifier les permissions du parent une fois?

Edit: Je ne suis pas sûr s'il y a CheckAccess() gérés moyens, mais vous pouvez essayer de Stdprov.dll: http://msdn.microsoft.com/en-us/library/aa384911%28VS.85%29.aspx

Edit2: Avez-vous essayé http://msdn.microsoft.com/en-us/library/1w66447a.aspx?

Edit3:

26) contrôles d'accès dans .NET

Dans la partie 2, nous sommes allés en effectuant contrôles d'accès en utilisant l'API Win32 AccessCheck . Malheureusement, il ne semble pas y avoir de fonction équivalente pouvant gérer la tâche . Il n'est pas recommandé pour vous d'effectuer une vérification d'accès dans .NET. Au lieu de cela, vous devez utiliser la sécurité basée sur les rôles pour effectuer un contrôle d'accès pour vous (C'est ce ReadSD fait. Avant ReadSD écrit un descripteur de sécurité , il doit vérifier si vous êtes autorisé à modifier le descripteur de sécurité: en lisant le descripteur de sécurité et en appelant GenericPrincipal.IsInRole à pour vérifier l'appartenance au groupe).Cela fonctionne uniquement si vos objets sont conçus pour la sécurité basée sur les rôles . Il ne fonctionne pas avec des objets sécurisés par des descripteurs de sécurité .

Si vous devez effectuer un contrôle d'accès sur un objet avec un titre descripteur (clé du Registre dans notre cas), vous pas utiliser AccessCheck de le faire (même dans Win32). La méthode correcte est pour ouvrir la clé de registre, et si le descripteur de sécurité refuse l'accès, vous obtiendrez une exception "accès refusé" .

Dans les contrôles d'accès simples, vous pouvez être en mesure d'effectuer le contrôle d'accès vous à l'aide d'une sécurité basée sur les rôles impératif (fig 38.):

http://www.codeproject.com/KB/system/accessctrl3.aspx

+0

Non , J'utilise CreateSubKey pour ouvrir une sous-clé, pas pour le créer. Si la sous-clé demandée existe déjà, la fonction l'ouvre. –

Questions connexes