soa*_*gem 3 .net c# windows registry permissions
当我将一些机器升级到 Windows 10 时,我遇到了一个奇怪的问题,其中 RuntimeBroker 的权限不正确导致了问题。我在网上找到了一个建议更改权限的解决方案(首先在注册表中,然后在 DCOM 配置中),我正在尝试编写一个小型 .NET 应用程序来自动化该过程。
目前相关注册表项的所有者是NT SERVICE\TrustedInstaller,我正在尝试将其更改为COMPUTER\Administrators. 我有一个简单的 WPF 应用程序,将 requestsExecutionLevel 设置为“requireAdministrator”,但我仍然遇到问题。下面是一段代码来说明问题:
using System.Security.AccessControl;
using System.Security.Principal;
using Microsoft.Win32;
namespace PermissionFixer
{
public class Fixer
{
public void Fix()
{
var subKey = Registry.ClassesRoot.OpenSubKey(@"AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}", true);
if (subKey != null)
{
var admins = new NTAccount("Administrators");
var ac = subKey.GetAccessControl();
ac.SetOwner(admins);
ac.AddAccessRule(new RegistryAccessRule(admins, RegistryRights.FullControl, AccessControlType.Allow));
subKey.SetAccessControl(ac);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是它甚至没有OpenSubKey()在点击SecurityException“不允许请求的注册表访问”之前通过调用。我认为这是因为管理员还没有访问权限(记住它属于 TrustedInstaller),但它变得有点鸡和蛋的问题。奇怪的是,当我使用regedit的手,让我很允许的所有者更改为管理员,我敢肯定我的注册表编辑器的实例运行为管理员。
我怎样才能在 .NET 中使用它?
我想通了,幸运的是可以使用 .NET 类来实现。以下是您必须如何调用 OpenSubKey:
var subKey = Registry.ClassesRoot.OpenSubKey(@"AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.TakeOwnership);
Run Code Online (Sandbox Code Playgroud)
然后,您必须取消对AddAccessRule()...的调用,直到您拥有所有权才能对其进行修改;并且您必须连续执行这两个操作。所以先获取所有权,然后重新打开具有不同访问权限的密钥以添加访问规则。
编辑:我今天发现您必须首先通过挂接到 P/Invoke 调用来操作运行应用程序的令牌。我在另一个堆栈溢出问题中找到了一个名为 TokenManipulator 的类。在您的项目中包含该类,然后在调用OpenSubKey. 所以你的方法最终看起来像这样:
try
{
TokenManipulator.AddPrivilege("SeRestorePrivilege");
TokenManipulator.AddPrivilege("SeBackupPrivilege");
TokenManipulator.AddPrivilege("SeTakeOwnershipPrivilege");
var subKey = Registry.ClassesRoot.OpenSubKey(@"AppID\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.TakeOwnership);
// code to change owner...
}
finally
{
TokenManipulator.RemovePrivilege("SeRestorePrivilege");
TokenManipulator.RemovePrivilege("SeBackupPrivilege");
TokenManipulator.RemovePrivilege("SeTakeOwnershipPrivilege");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2768 次 |
| 最近记录: |