2015-04-01 169 views
2

我想更改所有權,然後更改註冊表項的權限。註冊表更改權限刪除其他用戶權限

這裏我到目前爲止的代碼:

 var id = WindowsIdentity.GetCurrent(); 

     if (!Win32.SetPrivilege(Win32.TakeOwnership, true)) 
      throw new Exception(); 

     if (!Win32.SetPrivilege(Win32.Restore, true)) 
      throw new Exception(); 

     var hklm = RegistryKey.OpenBaseKey(registryHive, is64Key ? RegistryView.Registry64 : RegistryView.Registry32); 
     using (RegKey = hklm.OpenSubKey(path, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.TakeOwnership)) 
     { 
      if (RegKey == null) 
       throw new Exception("clé de registre non trouvée"); 

      _security = RegKey.GetAccessControl(AccessControlSections.All); 

      var oldId = _security.GetOwner(typeof (SecurityIdentifier)); 
      _oldSi = new SecurityIdentifier(oldId.ToString()); 

      _security.SetOwner(id.User); 
      RegKey.SetAccessControl(_security); 
     } 

     using (RegKey = hklm.OpenSubKey(path, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions)) 
     { 
      _fullAccess = new RegistryAccessRule(id.User, RegistryRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow); 
      _security.AddAccessRule(_fullAccess); 
      RegKey.SetAccessControl(_security); 
     } 

一切正常,但在註冊表編輯器中,子項權只包含我的用戶,其他所有用戶都被刪除。

前:

before change permission

後:

After change permission

似乎繼承的權限被刪除。

我接近成功,它必須錯過一個參數,但我不知道哪一個。

+0

_secTemp的初始化語句在哪裏?據我所知,你已經獲得當前的訪問控制,然後修改它(添加新帳戶)並使用SetAccessControl保存(此方法覆蓋訪問控制) – 2015-04-03 15:54:37

+0

@OldFox對不起,你是對的,_secTemp是_security,我更新了代碼。 – Baptiste 2015-04-03 16:38:49

回答

3

嘗試添加此:

_security.SetAccessRuleProtection(false, false); 

調用此之前:

RegKey.SetAccessControl(_security); 

這樣做將確保 「保護從繼承」 已禁用(又名繼承是允許的)。

+0

非常感謝!實際上_security.SetAccessRuleProtection(true,true);作品。 – Baptiste 2015-04-07 13:12:27