Condividi tramite


RegistrySecurity.RemoveAccessRuleSpecific(RegistryAccessRule) Metodo

Definizione

Cerca una regola di controllo di accesso che corrisponde esattamente alla regola specificata e, se trovata, la rimuove.

public:
 void RemoveAccessRuleSpecific(System::Security::AccessControl::RegistryAccessRule ^ rule);
public void RemoveAccessRuleSpecific (System.Security.AccessControl.RegistryAccessRule rule);
override this.RemoveAccessRuleSpecific : System.Security.AccessControl.RegistryAccessRule -> unit
Public Sub RemoveAccessRuleSpecific (rule As RegistryAccessRule)

Parametri

rule
RegistryAccessRule

Oggetto RegistryAccessRule da rimuovere.

Eccezioni

rule è null.

Esempio

Nell'esempio di codice seguente viene illustrato che il RemoveAccessRuleSpecific metodo rimuove una regola solo se corrisponde esattamente.

Nell'esempio vengono create due regole che consentono diritti diversi. Le regole hanno flag di ereditarietà e propagazione compatibili, quindi quando la seconda regola viene aggiunta viene unione con la prima. Nell'esempio viene chiamato il RemoveAccessRuleSpecific metodo, specificando la prima regola, ma poiché le regole vengono unite non esiste alcuna regola corrispondente. Nell'esempio viene quindi chiamato il RemoveAccessRule metodo per rimuovere la seconda regola dalla regola unita e infine chiama il RemoveAccessRuleSpecific metodo per rimuovere la prima regola.

Nota

In questo esempio non viene collegato l'oggetto di sicurezza a un RegistryKey oggetto. Vedere il metodo e il RegistryKey.GetAccessControlRegistryKey.SetAccessControl metodo.


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

public class Example
{
    public static void Main()
    {
        string user = Environment.UserDomainName + "\\"
            + Environment.UserName;

        // Create a security object that grants no access.
        RegistrySecurity mSec = new RegistrySecurity();

        // Add a rule that grants the current user the right
        // to read and enumerate the name/value pairs in a key, 
        // to read its access and audit rules, to enumerate
        // its subkeys, to create subkeys, and to delete the key. 
        // The rule is inherited by all contained subkeys.
        //
        RegistryAccessRule rule1 = new RegistryAccessRule(user, 
            RegistryRights.ReadKey | RegistryRights.WriteKey
                | RegistryRights.Delete, 
            InheritanceFlags.ContainerInherit, 
            PropagationFlags.None, 
            AccessControlType.Allow);
        mSec.AddAccessRule(rule1);

        // Add a rule that allows the current user the right
        // right to take ownership of a key, using the same 
        // inheritance and propagation flags. This rule 
        // merges with the first rule.
        RegistryAccessRule rule2 = new RegistryAccessRule(user, 
            RegistryRights.ChangePermissions, 
            InheritanceFlags.ContainerInherit,
            PropagationFlags.None, 
            AccessControlType.Allow);
        mSec.AddAccessRule(rule2);

        // Display the rules in the security object.
        ShowSecurity(mSec);

        // Attempt to use RemoveRuleSpecific to remove the
        // first rule. The removal fails, because the rule
        // in the RegistrySecurity object has been altered.
        mSec.RemoveAccessRuleSpecific(rule1);

        // Show that the rule was not removed.
        ShowSecurity(mSec);

        // Use the RemoveAccessRule method to remove rule2,
        // and then use RemoveAccessRuleSpecific to remove
        // rule1.
        mSec.RemoveAccessRule(rule2);
        mSec.RemoveAccessRuleSpecific(rule1);

        // Show that the rules have been removed.
        ShowSecurity(mSec);
    }

    private static void ShowSecurity(RegistrySecurity security)
    {
        Console.WriteLine("\r\nCurrent access rules:\r\n");

        foreach( RegistryAccessRule ar in 
            security.GetAccessRules(true, true, typeof(NTAccount)) )
        {
            Console.WriteLine("        User: {0}", ar.IdentityReference);
            Console.WriteLine("        Type: {0}", ar.AccessControlType);
            Console.WriteLine("      Rights: {0}", ar.RegistryRights);
            Console.WriteLine(" Inheritance: {0}", ar.InheritanceFlags);
            Console.WriteLine(" Propagation: {0}", ar.PropagationFlags);
            Console.WriteLine("   Inherited? {0}", ar.IsInherited);
            Console.WriteLine();
        }
    }
}

/* This code example produces output similar to following:

Current access rules:

        User: TestDomain\TestUser
        Type: Allow
      Rights: SetValue, CreateSubKey, Delete, ReadKey, ChangePermissions
 Inheritance: ContainerInherit
 Propagation: None
   Inherited? False


Current access rules:

        User: TestDomain\TestUser
        Type: Allow
      Rights: SetValue, CreateSubKey, Delete, ReadKey, ChangePermissions
 Inheritance: ContainerInherit
 Propagation: None
   Inherited? False


Current access rules:

*/
Option Explicit
Imports System.Security.AccessControl
Imports System.Security.Principal
Imports System.Security
Imports Microsoft.Win32

Public Class Example

    Public Shared Sub Main()

        Dim user As String = Environment.UserDomainName _ 
            & "\" & Environment.UserName

        ' Create a security object that grants no access.
        Dim mSec As New RegistrySecurity()

        ' Add a rule that grants the current user the right
        ' to read and enumerate the name/value pairs in a key, 
        ' to read its access and audit rules, to enumerate
        ' its subkeys, to create subkeys, and to delete the key. 
        ' The rule is inherited by all contained subkeys.
        '
        Dim rule1 As New RegistryAccessRule(user, _
            RegistryRights.ReadKey Or RegistryRights.WriteKey _
                Or RegistryRights.Delete, _
            InheritanceFlags.ContainerInherit, _
            PropagationFlags.None, _
            AccessControlType.Allow)
        mSec.AddAccessRule(rule1)

        ' Add a rule that allows the current user the right
        ' right to take ownership of a key, using the same 
        ' inheritance and propagation flags. This rule 
        ' merges with the first rule.
        Dim rule2 As New RegistryAccessRule(user, _
            RegistryRights.ChangePermissions, _
            InheritanceFlags.ContainerInherit, _
            PropagationFlags.None, _
            AccessControlType.Allow)
        mSec.AddAccessRule(rule2)

        ' Display the rules in the security object.
        ShowSecurity(mSec)

        ' Attempt to use RemoveRuleSpecific to remove the
        ' first rule. The removal fails, because the rule
        ' in the RegistrySecurity object has been altered.
        mSec.RemoveAccessRuleSpecific(rule1)

        ' Show that the rule was not removed.
        ShowSecurity(mSec)

        ' Use the RemoveAccessRule method to remove rule2,
        ' and then use RemoveAccessRuleSpecific to remove
        ' rule1.
        mSec.RemoveAccessRule(rule2)
        mSec.RemoveAccessRuleSpecific(rule1)

        ' Show that the rules have been removed.
        ShowSecurity(mSec)

    End Sub 

    Private Shared Sub ShowSecurity(ByVal security As RegistrySecurity)
        Console.WriteLine(vbCrLf & "Current access rules:" & vbCrLf)

        For Each ar As RegistryAccessRule In _
            security.GetAccessRules(True, True, GetType(NTAccount))

            Console.WriteLine("        User: {0}", ar.IdentityReference)
            Console.WriteLine("        Type: {0}", ar.AccessControlType)
            Console.WriteLine("      Rights: {0}", ar.RegistryRights)
            Console.WriteLine(" Inheritance: {0}", ar.InheritanceFlags)
            Console.WriteLine(" Propagation: {0}", ar.PropagationFlags)
            Console.WriteLine("   Inherited? {0}", ar.IsInherited)
            Console.WriteLine()
        Next

    End Sub
End Class 

'This code example produces output similar to following:
'
'Current access rules:
'
'        User: TestDomain\TestUser
'        Type: Allow
'      Rights: SetValue, CreateSubKey, Delete, ReadKey, ChangePermissions
' Inheritance: ContainerInherit
' Propagation: None
'   Inherited? False
'
'
'Current access rules:
'
'        User: TestDomain\TestUser
'        Type: Allow
'      Rights: SetValue, CreateSubKey, Delete, ReadKey, ChangePermissions
' Inheritance: ContainerInherit
' Propagation: None
'   Inherited? False
'
'
'Current access rules:
'

Commenti

La regola viene rimossa solo se corrisponde rule esattamente a tutti i dettagli, inclusi i flag. Altre regole con lo stesso utente e AccessControlType non sono interessate.

Importante

Una regola rappresenta una o più voci di controllo di accesso sottostanti (ACE) e queste voci vengono suddivise o combinate in base alle esigenze quando si modificano le regole di sicurezza di accesso per un utente. Pertanto, una regola potrebbe non esistere più nel formato specifico che aveva quando è stata aggiunta e in questo caso il RemoveAccessRuleSpecific metodo non può rimuoverlo.

Si applica a