RegistrySecurity.AddAccessRule(RegistryAccessRule) Metoda

Definicja

Wyszukuje pasującą kontrolę dostępu, za pomocą której można scalić nową regułę. Jeśli żadna z nich nie zostanie znaleziona, doda nową regułę.

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

Parametry

rule
RegistryAccessRule

Reguła kontroli dostępu do dodania.

Wyjątki

rule to null.

Przykłady

Poniższy przykład kodu tworzy reguły dostępu do rejestru i dodaje je do RegistrySecurity obiektu, pokazując, jak reguły zezwalające i odmawiające praw pozostają oddzielne, podczas gdy zgodne reguły tego samego rodzaju są scalane.

Uwaga

W tym przykładzie obiekt zabezpieczeń nie jest dołączany do RegistryKey obiektu. Przykłady dołączania obiektów zabezpieczeń można znaleźć w elementach RegistryKey.GetAccessControl i RegistryKey.SetAccessControl.

Przykładowy kod, który demonstruje flagi dziedziczenia i propagacji, można znaleźć w RegistryAccessRule klasie .

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

public class Example
{
    public static void Main()
    {
        // Create a string representing the current user.
        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 the key.
        RegistryAccessRule rule = new RegistryAccessRule(user, 
            RegistryRights.ReadKey, 
            AccessControlType.Allow);
        mSec.AddAccessRule(rule);

        // Add a rule that denies the current user the 
        // right to change permissions on the Registry.
        rule = new RegistryAccessRule(user, 
            RegistryRights.ChangePermissions, 
            AccessControlType.Deny);
        mSec.AddAccessRule(rule);

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

        // Add a rule that allows the current user the 
        // right to read permissions on the Registry. This 
        // rule is merged with the existing Allow rule.
        rule = new RegistryAccessRule(user, 
            RegistryRights.WriteKey, 
            AccessControlType.Allow);
        mSec.AddAccessRule(rule);

        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();
        }
    }
}

/* This code example produces output similar to following:

Current access rules:

        User: TestDomain\TestUser
        Type: Deny
      Rights: ChangePermissions

        User: TestDomain\TestUser
        Type: Allow
      Rights: ReadKey


Current access rules:

        User: TestDomain\TestUser
        Type: Deny
      Rights: ChangePermissions

        User: TestDomain\TestUser
        Type: Allow
      Rights: SetValue, CreateSubKey, ReadKey
 */
Imports Microsoft.Win32
Imports System.Security.AccessControl
Imports System.Security.Principal

Public Class Example

    Public Shared Sub Main()

        ' Create a string representing the current user.
        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 the key.
        Dim rule As New RegistryAccessRule(user, _
            RegistryRights.ReadKey, _
            AccessControlType.Allow)
        mSec.AddAccessRule(rule)

        ' Add a rule that denies the current user the 
        ' right to change permissions on the Registry.
        rule = New RegistryAccessRule(user, _
            RegistryRights.ChangePermissions, _
            AccessControlType.Deny)
        mSec.AddAccessRule(rule)

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

        ' Add a rule that allows the current user the 
        ' right to read permissions on the Registry. This 
        ' rule is merged with the existing Allow rule.
        rule = New RegistryAccessRule(user, _
            RegistryRights.WriteKey, _
            AccessControlType.Allow)
        mSec.AddAccessRule(rule)

        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()
        Next

    End Sub
End Class 

'This code example produces output similar to following:
'
'Current access rules:
'
'        User: TestDomain\TestUser
'        Type: Deny
'      Rights: ChangePermissions
'
'        User: TestDomain\TestUser
'        Type: Allow
'      Rights: ReadKey
'
'
'Current access rules:
'
'        User: TestDomain\TestUser
'        Type: Deny
'      Rights: ChangePermissions
'
'        User: TestDomain\TestUser
'        Type: Allow
'      Rights: SetValue, CreateSubKey, ReadKey

Uwagi

Metoda AddAccessRule wyszukuje reguły z tym samym użytkownikiem lub grupą i taką samą AccessControlType jak rule. Jeśli żaden z nich nie zostanie znaleziony, rule zostanie dodany. Jeśli zostanie znaleziona reguła dopasowania, prawa w rule pliku zostaną scalone z istniejącą regułą.

Nie można scalić reguł, jeśli mają różne flagi dziedziczenia. Jeśli na przykład użytkownik ma dostęp do odczytu bez flag dziedziczenia i AddAccessRule jest używany do dodawania reguły dającej użytkownikowi dostęp do zapisu z dziedziczeniem dla podkluczy (InheritanceFlags.ContainerInherit), nie można scalić dwóch reguł.

Reguły z różnymi AccessControlType wartościami nigdy nie są scalane.

Zasady wyrażają prawa w najbardziej ekonomiczny sposób. Jeśli na przykład użytkownik ma QueryValuesNotify prawa i ReadPermissions dodajesz regułę zezwalającą na EnumerateSubKeys prawa, użytkownik ma wszystkie części składowe ReadKey praw. Jeśli wykonasz zapytanie dotyczące praw użytkownika, zobaczysz regułę zawierającą ReadKey prawa. Podobnie, jeśli usuniesz EnumerateSubKeys prawa, inne składniki ReadKey praw zostaną ponownie wyświetlone.

Dotyczy