2011-06-23 91 views
6

Tôi hiện đang gặp sự cố khi viết ứng dụng để đặt quyền trên một số khóa Legacy. Các khóa cũ được khóa lại hoàn toàn và thực sự sửa đổi chúng trong regedit bạn phải sở hữu và sau đó thêm chính mình với toàn quyền kiểm soát. Khi cố gắng để nhân rộng này trong mã tôi không thể có được chìa khóa để viết với lỗi "Truy cập bị từ chối". Mã ví dụ:Truy cập Bảo mật Đăng ký bị từ chối. C#

RegistrySecurity rs = new RegistrySecurity(); 
rs.AddAccessRule(new RegistryAccessRule("Administrators", RegistryRights.FullControl, AccessControlType.Allow)); 
rs.SetOwner(new NTAccount("Administrators")); 
return LocalMachine.CreateSubKey(post, RegistryKeyPermissionCheck.ReadWriteSubTree, rs); 

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao. Tôi cũng đã thử OpenSubKey với quyền truy cập ghi được yêu cầu và tôi không thể lấy khóa.

Xin cảm ơn các bạn.

Trả lời

7

Cuối cùng tôi đã tìm được giải pháp. Bạn phải mở khóa với "ChangePermissions" và sau đó thay đổi sự cho phép cho chính mình ... THEN mở lại chìa khóa với toàn quyền kiểm soát để thay đổi chủ sở hữu. Đây là cách thực hiện.

RegistryKey rk = LocalMachine.OpenSubKey(subkey, RegistryKeyPremissionsCheck.ReadWriteSubTree, RegistryRights.ChangePermissions | RegistryRights.ReadKey);//Get the registry key desired with ChangePermissions Rights. 
RegistrySecurity rs = new RegistrySecurity(); 
rs.AddAccessRule(new RegistryAccessRule("Administrator", RegistryRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));//Create access rule giving full control to the Administrator user. 
rk.SetAccessControl(rs); //Apply the new access rule to this Registry Key. 
rk = LocalMachine.OpenSubKey(subkey, RegistryKeyPremissionsCheck.ReadWriteSubTree, RegistryRights.FullControl); // Opens the key again with full control. 
rs.SetOwner(new NTAccount("Administrator"));// Set the securitys owner to be Administrator 
rk.SetAccessControl(rs);// Set the key with the changed permission so Administrator is now owner. 

Điều này phù hợp với tôi. Hãy cho tôi biết nếu nó hoạt động cho bạn :)

Rõ ràng là thay đổi Quản trị viên cho người dùng khác nếu bạn không đăng nhập với tư cách quản trị viên hoặc nếu bạn cần quyền cho người dùng khác.

0

Khi bạn chạy ứng dụng của mình với mã đó, bạn nhấp chuột phải vào exe và chọn "Chạy với tư cách quản trị viên"?

+0

Hi Steve, tôi chạy Visual Studio as administrator để gỡ lỗi nên chạy như admin? Tôi cũng đã thử chạy như admin và nó không hoạt động được. các khóa cũ được khóa hoàn toàn với quyền truy cập chỉ vào Hệ thống và mọi người được đặt là chỉ đọc. Tôi đã tìm thấy một giải pháp và sẽ đăng nó ngay. – Skintkingle

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

Đầu tiên phải thiết lập một sự cho phép với quyền Full-Access để khóa

RegistryKey rkey = LocalMachine.OpenSubKey(_subKey, RegistryKeyPermissionCheck.ReadWriteSubTree, gistryRights.ChangePermissions); 
if (rkey == null) 
throw new Exception("Not Open"); 
//------- 
RegistrySecurity _registrySecurity =new RegistrySecurity();//Or rkey.GetAccessControl(); 
WindowsIdentity _windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent(); 
RegistryAccessRule _accessRule = new RegistryAccessRule(_windowsIdentity.Name, RegistryRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow); 
_registrySecurity.AddAccessRule(_accessRule); 
_registrySecurity.SetAccessRuleProtection(false, true); 
rkey.SetAccessControl(_registrySecurity); 

//--------Now, Set owner 

_registrySecurity.SetGroup(new NTAccount("Administrators")); //This is optional 
var SID = new System.Security.Principal.NTAccount("XXX\\Users"); 
_registrySecurity.SetOwner(SID); 
rkey.SetAccessControl(_registrySecurity); 

XXX: Tên tài khoản của bạn

-2

Microsoft Visual Studio 2015 (Quản trị viên)

_subKey = SOFTWARE\Wow6432Node\Norton

rkey.SetAccessControl(_registrySecurity);-> "Đã cố gắng cho mỗi tạo thành một hoạt động trái phép. "`

+0

Chính xác thì bạn đang trả lời cái gì? Tôi xin lỗi tôi không làm theo. – Skintkingle

-1
 RegistryKey rkey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Norton\SecurityStatusSDK", RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions); 
     if (rkey == null) 
      throw new Exception("Not Open"); 
     //------- 
     RegistrySecurity _registrySecurity = new RegistrySecurity();//Or rkey.GetAccessControl(); 
     WindowsIdentity _windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent(); 
     RegistryAccessRule _accessRule = new RegistryAccessRule(_windowsIdentity.Name, RegistryRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow); 
     _registrySecurity.AddAccessRule(_accessRule); 
     _registrySecurity.SetAccessRuleProtection(false, true); 
     try 
     { 
      rkey.SetAccessControl(_registrySecurity);// <---"Attempted to perform an unauthorized operation." 
     } 
     catch (UnauthorizedAccessException e) 
     { 

     } 

     //--------Now, Set owner 

     _registrySecurity.SetGroup(new NTAccount("Administrators")); //This is optional 
     var SID = new System.Security.Principal.NTAccount("XXX\\Users"); 
     _registrySecurity.SetOwner(SID); 
     rkey.SetAccessControl(_registrySecurity); 

Tôi đã cài đặt Norton Internet Security

Các vấn đề liên quan