我可以读取注册表权限吗?如果是这样,怎么样?
我正在试验注册表功能,因为我还没有理解它们。我试图创建两个注册表项,一个具有只读权限,另一个具有读写权限。我已经成功创建了它们,但在继续前进之前,我想检查它们是否具有适当的权限。我知道我可以通过试图操纵它们来简单地测试它们,但我认为必须有一种方法来读取注册表项的权限。我可以读取注册表权限吗?如果是这样,怎么样?
有谁知道该怎么做?
我使用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'。
你想要的是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());
}
}
这当然似乎指向我的方向是正确的,但是当我打电话GetAccessControl(),它返回:“System.Security.AccessControl.RegistrySecurity” ,两个键的输出相同。我不知道如何使用它,尽管它绝对比我多!你介意提供一个例子,我可以看到它的实现? – MrSpudtastic
@MrSpudtastic我用示例代码更新了我的答案。 – itsme86
谢谢。我已经实现了它,但现在我得到一个错误。我编辑了原始问题以提供更多详细信息。我认为它快到了! – MrSpudtastic