RegistryKeyPermissionCheck Перечисление
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Указывает, выполняются ли проверки безопасности при открытии разделов реестра и доступе к парам имен и значений.
public enum class RegistryKeyPermissionCheck
public enum RegistryKeyPermissionCheck
type RegistryKeyPermissionCheck =
Public Enum RegistryKeyPermissionCheck
- Наследование
Поля
| Имя | Значение | Описание |
|---|---|---|
| Default | 0 | Раздел реестра наследует режим родительского элемента. Проверки безопасности выполняются при попытке доступа к вложенным ключам или значениям, если родитель не был открыт с ReadSubTree помощью или ReadWriteSubTree режимом. |
| ReadSubTree | 1 | Проверки безопасности не выполняются при доступе к вложенным ключам или значениям. Проверка безопасности выполняется при попытке открыть текущий ключ, если родитель не был открыт с ReadSubTree или ReadWriteSubTree. |
| ReadWriteSubTree | 2 | Проверки безопасности не выполняются при доступе к вложенным ключам или значениям. Проверка безопасности выполняется при попытке открыть текущий ключ, если родитель не был открыт.ReadWriteSubTree |
Примеры
В следующем примере кода создается подраздел, содержащий 100 пар "ключ-значение" и закрывается. В примере открывается подраздел с параметром Default и записывается время, необходимое для чтения всех значений. Затем в примере открывается подраздел с помощью ReadSubTree и записывается время, необходимое для чтения всех значений. Наконец, в примере вычисляется и отображается процентное улучшение.
using System;
using Microsoft.Win32;
using System.Diagnostics;
public class Example
{
public static void Main()
{
const int LIMIT = 100;
RegistryKey cu = Registry.CurrentUser;
const string testKey = "RegistryKeyPermissionCheckExample";
Console.WriteLine("Generating {0} key/value pairs.", LIMIT);
RegistryKey rk = cu.CreateSubKey(testKey);
for (int i = 0; i < LIMIT; i++)
{
rk.SetValue("Key" + i, i);
}
rk.Close();
Stopwatch s = new Stopwatch();
// On the default setting, security is checked every time
// a key/value pair is read.
rk = cu.OpenSubKey(testKey, RegistryKeyPermissionCheck.Default);
s.Start();
for (int i = 0; i < LIMIT; i++)
{
rk.GetValue("Key" + i, i);
}
s.Stop();
rk.Close();
long delta1 = s.ElapsedTicks;
s.Reset();
// When the key is opened with ReadSubTree, security is
// not checked when the values are read.
rk = cu.OpenSubKey(testKey, RegistryKeyPermissionCheck.ReadSubTree);
s.Start();
for (int i = 0; i < LIMIT; i++)
{
rk.GetValue("Key" + i, i);
}
s.Stop();
rk.Close();
long delta2 = s.ElapsedTicks;
double faster = (double) (delta1 - delta2) / (double) delta1;
Console.WriteLine("ReadSubTree is {0}% faster for {1} values.",
(faster * 100).ToString("0.0"), LIMIT);
cu.DeleteSubKey(testKey);
}
}
/* This code example produces output similar to the following:
Generating 100 key/value pairs.
ReadSubTree is 23.4% faster for 100 values.
*/
Imports Microsoft.Win32
Imports System.Diagnostics
Public Class Example
Public Shared Sub Main()
Const LIMIT As Integer = 100
Dim cu As RegistryKey = Registry.CurrentUser
Const testKey As String = "RegistryKeyPermissionCheckExample"
Console.WriteLine("Generating {0} key/value pairs.", LIMIT)
Dim rk As RegistryKey = cu.CreateSubKey(testKey)
For i As Integer = 0 To LIMIT
rk.SetValue("Key" & i, i)
Next i
rk.Close()
Dim s As New Stopwatch()
' On the default setting, security is checked every time
' a key/value pair is read.
rk = cu.OpenSubKey(testKey, _
RegistryKeyPermissionCheck.Default)
s.Start()
For i As Integer = 0 To LIMIT
rk.GetValue("Key" & i, i)
Next i
s.Stop()
rk.Close()
Dim delta1 As Long = s.ElapsedTicks
s.Reset()
' When the key is opened with ReadSubTree, security is
' not checked when the values are read.
rk = cu.OpenSubKey(testKey, _
RegistryKeyPermissionCheck.ReadSubTree)
s.Start()
For i As Integer = 0 To LIMIT
rk.GetValue("Key" & i, i)
Next i
s.Stop()
rk.Close()
Dim delta2 As Long = s.ElapsedTicks
Dim faster As Double = _
CDbl(delta1 - delta2) * 100.0 / CDbl(delta1)
Console.WriteLine("ReadSubTree is {0}% faster for {1} values.", _
faster.ToString("0.0"), LIMIT)
cu.DeleteSubKey(testKey)
End Sub
End Class
' This code example produces output similar to the following:
'
'Generating 100 key/value pairs.
'ReadSubTree is 23.4% faster for 100 values.
'
Комментарии
Когда приложение сохраняет или извлекает большое количество параметров реестра из набора вложенных ключей, выполняются многочисленные избыточные проверки безопасности. Это перечисление указывает, когда проверки безопасности ключа должны быть опущены.
В следующей таблице показано, когда выполняются проверки безопасности на основе способа открытия родительского ключа и текущего ключа.
| Родительский ключ, открытый с помощью | Текущий ключ, открытый с помощью | Результат |
|---|---|---|
| По умолчанию | По умолчанию | Проверка безопасности выполняется при доступе к любому значению в текущем ключе или при попытке доступа к подразделу. Это поведение в .NET Framework версии 1.0 и 1.1. |
| По умолчанию | ReadSubTree | Проверка безопасности выполняется при попытке открыть текущий ключ. |
| По умолчанию | ReadWriteSubTree | Проверка безопасности выполняется при попытке открыть текущий ключ. |
| ReadSubTree | Значение по умолчанию или ReadSubTree | При открытии текущего ключа или его значений проверка безопасности не выполняется. |
| ReadSubTree | ReadWriteSubTree | Проверка безопасности выполняется при попытке открыть текущий ключ. |
| ReadWriteSubTree | Любое | При открытии текущего ключа или его значений проверка безопасности не выполняется. |