2017-06-12 79 views
0

我正在试验注册表功能,因为我还没有理解它们。我试图创建两个注册表项,一个具有只读权限,另一个具有读写权限。我已经成功创建了它们,但在继续前进之前,我想检查它们是否具有适当的权限。我知道我可以通过试图操纵它们来简单地测试它们,但我认为必须有一种方法来读取注册表项的权限。我可以读取注册表权限吗?如果是这样,怎么样?

有谁知道该怎么做?

我使用VisualStudio并用C#编写。我一直在尝试搜索“读取注册表项权限”,“获取密钥权限”等等,但我只是获得了关于什么是只读权限等等的很多信息。有用,但对这个特定任务没有帮助。

创建这些键的代码如下:

//Create ROKey - "ReadOnlyKey" 
RegistryKey rKey = Registry.CurrentUser.CreateSubKey("ROKey", RegistryKeyPermissionCheck.ReadSubTree); 
//Create WRKey - "ReadWriteKey" 
RegistryKey wKey = Registry.CurrentUser.CreateSubKey("WRKey", RegistryKeyPermissionCheck.ReadWriteSubTree); 

编辑:

在@ itsme86的建议,我已经包括下面的代码:

var security = rKey.GetAccessControl(); 
var rules = security.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)); 
foreach (var rule in rules.Cast<AuthorizationRule>()) 
{ 
    Console.WriteLine(rule.IdentityReference.ToString()); 
} 

security = wKey.GetAccessControl(); 
rules = security.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)); 
foreach (var rule in rules.Cast<AuthorizationRule>()){ 
    Console.WriteLine(rule.IdentityReference.ToString()); 
} 

不幸的是,我现在收到以下错误:

错误1'System.Securit y.AccessControl.AuthorizationRuleCollection'不包含'Cast'的定义,并且没有找到接受'System.Security.AccessControl.AuthorizationRuleCollection'类型的第一个参数的扩展方法'Cast'(你是否缺少using指令或程序集参考?)C:\ Users \ DoD_Admin \ Documents \ Visual Studio 2013 \ Projects \ RegistryManipulationTest \ RegistryManipulationTest \ rKeyTestClass.cs 249 40 RegistryManipulationTest

我正在使用“System”和“Microsoft.Win32”命名空间。我应该使用另一个命名空间吗?

编辑2:

我已经添加了“使用Linq;”到节目,现在它承认“演员”。缺点是,它不能识别AuthorizationRule类型。我试着“使用System.Web.Configuration;”,AuthorizationRule类的名字空间,但现在我被告知“名字空间'System.Web''中不存在类型或名称空间名'Configuration'。

回答

0

你想要的是RegistryKey.GetAccessControl()。它会返回一个RegistrySecurity对象,您可以拨打GetAccessRules()。如果您想更改权限,也有相应的SetAccessControl()方法。

您显然需要使用提升的权限运行您的应用程序。

这里有一个如何使用它的一个例子:

using (RegistryKey key = Registry.LocalMachine.OpenSubKey("software")) 
{ 
    var security = key.GetAccessControl(); 
    var rules = security.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)); 

    foreach (var rule in rules.Cast<AuthorizationRule>()) 
    { 
     Console.WriteLine(rule.IdentityReference.ToString()); 
    } 
} 
+0

这当然似乎指向我的方向是正确的,但是当我打电话GetAccessControl(),它返回:“System.Security.AccessControl.RegistrySecurity” ,两个键的输出相同。我不知道如何使用它,尽管它绝对比我多!你介意提供一个例子,我可以看到它的实现? – MrSpudtastic

+0

@MrSpudtastic我用示例代码更新了我的答案。 – itsme86

+0

谢谢。我已经实现了它,但现在我得到一个错误。我编辑了原始问题以提供更多详细信息。我认为它快到了! – MrSpudtastic

相关问题