RegistryKey.OpenSubKey Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает заданный подраздел.
Перегрузки
OpenSubKey(String, Boolean) |
Получает указанный подраздел и определяет, следует ли предоставить доступ для записи в этот раздел. |
OpenSubKey(String, RegistryKeyPermissionCheck, RegistryRights) |
Возвращает заданный подраздел с доступом для чтения или для чтения и записи с запросом заданных прав доступа. |
OpenSubKey(String, RegistryRights) |
Возвращает подраздел с указанным именем и правами доступа. Доступно начиная с .NET Framework 4.6. |
OpenSubKey(String) |
Возвращает подраздел с доступом только для чтения. |
OpenSubKey(String, RegistryKeyPermissionCheck) |
Возвращает заданный подраздел с доступом для чтения или для чтения и записи. |
OpenSubKey(String, Boolean)
- Исходный код:
- RegistryKey.cs
Получает указанный подраздел и определяет, следует ли предоставить доступ для записи в этот раздел.
public:
Microsoft::Win32::RegistryKey ^ OpenSubKey(System::String ^ name, bool writable);
public Microsoft.Win32.RegistryKey OpenSubKey (string name, bool writable);
public Microsoft.Win32.RegistryKey? OpenSubKey (string name, bool writable);
member this.OpenSubKey : string * bool -> Microsoft.Win32.RegistryKey
Public Function OpenSubKey (name As String, writable As Boolean) As RegistryKey
Параметры
- name
- String
Имя или путь для открываемого вложенного раздела.
- writable
- Boolean
Если для раздела необходим доступ на запись, следует задать значение true
.
Возвращаемое значение
Запрошенный вложенный раздел или null
при неудачном выполнении операции.
Исключения
name
имеет значение null
.
Раздел RegistryKey является закрытым (доступ к закрытым разделам невозможен).
У пользователя отсутствуют разрешения, необходимые для доступа к разделу реестра в заданном режиме.
Примеры
В следующем примере кода создается тестовый ключ и используется OpenSubKey метод для его открытия, демонстрируя обе перегрузки метода .
#using <Microsoft.VisualBasic.dll>
using namespace System;
using namespace Microsoft::Win32;
using namespace Microsoft::VisualBasic;
int main()
{
// Delete and recreate the test key.
Registry::CurrentUser->DeleteSubKey( L"RegistryOpenSubKeyExample", false );
RegistryKey ^ rk = Registry::CurrentUser->CreateSubKey( L"RegistryOpenSubKeyExample" );
rk->Close();
// Obtain an instance of RegistryKey for the CurrentUser registry
// root.
RegistryKey ^ rkCurrentUser = Registry::CurrentUser;
// Obtain the test key (read-only) and display it.
RegistryKey ^ rkTest = rkCurrentUser->OpenSubKey( L"RegistryOpenSubKeyExample" );
Console::WriteLine( L"Test key: {0}", rkTest );
rkTest->Close();
rkCurrentUser->Close();
// Obtain the test key in one step, using the CurrentUser registry
// root.
rkTest = Registry::CurrentUser->OpenSubKey( L"RegistryOpenSubKeyExample" );
Console::WriteLine( L"Test key: {0}", rkTest );
rkTest->Close();
// Open the test key in read/write mode.
rkTest = Registry::CurrentUser->OpenSubKey( L"RegistryOpenSubKeyExample", true );
rkTest->SetValue( L"TestName", L"TestValue" );
Console::WriteLine( L"Test value for TestName: {0}", rkTest->GetValue( L"TestName" ) );
rkTest->Close();
return 0;
} //Main
using System;
using Microsoft.Win32;
using Microsoft.VisualBasic;
public class Example
{
public static void Main()
{
// Delete and recreate the test key.
Registry.CurrentUser.DeleteSubKey("RegistryOpenSubKeyExample", false);
RegistryKey rk = Registry.CurrentUser.CreateSubKey("RegistryOpenSubKeyExample");
rk.Close();
// Obtain an instance of RegistryKey for the CurrentUser registry
// root.
RegistryKey rkCurrentUser = Registry.CurrentUser;
// Obtain the test key (read-only) and display it.
RegistryKey rkTest = rkCurrentUser.OpenSubKey("RegistryOpenSubKeyExample");
Console.WriteLine("Test key: {0}", rkTest);
rkTest.Close();
rkCurrentUser.Close();
// Obtain the test key in one step, using the CurrentUser registry
// root.
rkTest = Registry.CurrentUser.OpenSubKey("RegistryOpenSubKeyExample");
Console.WriteLine("Test key: {0}", rkTest);
rkTest.Close();
// Open the test key in read/write mode.
rkTest = Registry.CurrentUser.OpenSubKey("RegistryOpenSubKeyExample", true);
rkTest.SetValue("TestName", "TestValue");
Console.WriteLine("Test value for TestName: {0}", rkTest.GetValue("TestName"));
rkTest.Close();
} //Main
} //Example
Imports Microsoft.Win32
Public Class Example
Public Shared Sub Main()
' Delete and recreate the test key.
Registry.CurrentUser.DeleteSubKey("RegistryOpenSubKeyExample", False)
Dim rk As RegistryKey = Registry.CurrentUser.CreateSubKey("RegistryOpenSubKeyExample")
rk.Close
' Obtain an instance of RegistryKey for the CurrentUser registry
' root.
Dim rkCurrentUser As RegistryKey = Registry.CurrentUser
' Obtain the test key (read-only) and display it.
Dim rkTest As RegistryKey = rkCurrentUser.OpenSubKey("RegistryOpenSubKeyExample")
Console.WriteLine("Test key: {0}", rkTest)
rkTest.Close
rkCurrentUser.Close
' Obtain the test key in one step, using the CurrentUser registry
' root.
rkTest = Registry.CurrentUser.OpenSubKey("RegistryOpenSubKeyExample")
Console.WriteLine("Test key: {0}", rkTest)
rkTest.Close
' Obtain the test key in read/write mode.
rkTest = Registry.CurrentUser.OpenSubKey("RegistryOpenSubKeyExample", True)
rkTest.SetValue("TestName", "TestValue")
Console.WriteLine("Test value for TestName: {0}", rkTest.GetValue("TestName"))
rkTest.Close
End Sub
End Class
Комментарии
Если запрошенный ключ не существует, этот метод возвращает null
вместо создания исключения.
Если writable
имеет значение true
, ключ будет открыт для чтения и записи, в противном случае ключ будет открыт только для чтения.
Чтобы использовать OpenSubKey метод , необходимо иметь экземпляр RegistryKey метода . Чтобы получить экземпляр RegistryKey, используйте один из статических Registry членов класса .
См. также раздел
- CreateSubKey(String)
- DeleteSubKey(String)
- DeleteSubKeyTree(String)
- GetSubKeyNames()
- OpenRemoteBaseKey(RegistryHive, String)
- SubKeyCount
- Registry
Применяется к
OpenSubKey(String, RegistryKeyPermissionCheck, RegistryRights)
- Исходный код:
- RegistryKey.cs
Возвращает заданный подраздел с доступом для чтения или для чтения и записи с запросом заданных прав доступа.
public:
Microsoft::Win32::RegistryKey ^ OpenSubKey(System::String ^ name, Microsoft::Win32::RegistryKeyPermissionCheck permissionCheck, System::Security::AccessControl::RegistryRights rights);
public Microsoft.Win32.RegistryKey OpenSubKey (string name, Microsoft.Win32.RegistryKeyPermissionCheck permissionCheck, System.Security.AccessControl.RegistryRights rights);
public Microsoft.Win32.RegistryKey? OpenSubKey (string name, Microsoft.Win32.RegistryKeyPermissionCheck permissionCheck, System.Security.AccessControl.RegistryRights rights);
[System.Runtime.InteropServices.ComVisible(false)]
public Microsoft.Win32.RegistryKey OpenSubKey (string name, Microsoft.Win32.RegistryKeyPermissionCheck permissionCheck, System.Security.AccessControl.RegistryRights rights);
member this.OpenSubKey : string * Microsoft.Win32.RegistryKeyPermissionCheck * System.Security.AccessControl.RegistryRights -> Microsoft.Win32.RegistryKey
[<System.Runtime.InteropServices.ComVisible(false)>]
member this.OpenSubKey : string * Microsoft.Win32.RegistryKeyPermissionCheck * System.Security.AccessControl.RegistryRights -> Microsoft.Win32.RegistryKey
Public Function OpenSubKey (name As String, permissionCheck As RegistryKeyPermissionCheck, rights As RegistryRights) As RegistryKey
Параметры
- name
- String
Имя или путь создаваемого или открываемого подраздела.
- permissionCheck
- RegistryKeyPermissionCheck
Одно из значений перечисления, определяющее, с какими правами открывается раздел: только для чтения или для чтения и записи.
- rights
- RegistryRights
Побитовое сочетание значений перечисления, которое определяет требуемый доступ безопасности.
Возвращаемое значение
Запрошенный вложенный раздел или null
при неудачном выполнении операции.
- Атрибуты
Исключения
name
равно null
Параметр permissionCheck
содержит недопустимое значение.
Раздел RegistryKey является закрытым (доступ к закрытым разделам невозможен).
Параметр rights
содержит недопустимые значение прав доступа к реестру.
-или-
У пользователя отсутствуют запрошенные разрешения.
Комментарии
Вместо того чтобы вызывать исключение, этот метод возвращает значение null
, если запрошенный ключ не существует.
Если permissionCheck
имеет значение RegistryKeyPermissionCheck.ReadWriteSubTree, ключ открывается для чтения и записи; если permissionCheck
имеет значение RegistryKeyPermissionCheck.ReadSubTree или RegistryKeyPermissionCheck.Default, ключ открывается для чтения, если родительский ключ не был открыт с RegistryKeyPermissionCheck.ReadWriteSubTreeпомощью .
Доступ, указанный для , permissionCheck
имеет приоритет над доступом, указанным для rights
. Например, если указать RegistryKeyPermissionCheck.ReadSubTree для permissionCheck
и RegistryRights.WriteKey для rights
, попытка записи в подраздел вызывает исключение.
Чтобы использовать OpenSubKey метод , необходимо иметь экземпляр RegistryKey класса . Чтобы получить экземпляр RegistryKey, используйте один из статических Registry членов класса .
См. также раздел
- CreateSubKey(String)
- DeleteSubKey(String)
- DeleteSubKeyTree(String)
- GetSubKeyNames()
- OpenRemoteBaseKey(RegistryHive, String)
- SubKeyCount
- Registry
Применяется к
OpenSubKey(String, RegistryRights)
- Исходный код:
- RegistryKey.cs
Возвращает подраздел с указанным именем и правами доступа. Доступно начиная с .NET Framework 4.6.
public:
Microsoft::Win32::RegistryKey ^ OpenSubKey(System::String ^ name, System::Security::AccessControl::RegistryRights rights);
public Microsoft.Win32.RegistryKey OpenSubKey (string name, System.Security.AccessControl.RegistryRights rights);
public Microsoft.Win32.RegistryKey? OpenSubKey (string name, System.Security.AccessControl.RegistryRights rights);
[System.Runtime.InteropServices.ComVisible(false)]
public Microsoft.Win32.RegistryKey OpenSubKey (string name, System.Security.AccessControl.RegistryRights rights);
member this.OpenSubKey : string * System.Security.AccessControl.RegistryRights -> Microsoft.Win32.RegistryKey
[<System.Runtime.InteropServices.ComVisible(false)>]
member this.OpenSubKey : string * System.Security.AccessControl.RegistryRights -> Microsoft.Win32.RegistryKey
Public Function OpenSubKey (name As String, rights As RegistryRights) As RegistryKey
Параметры
- name
- String
Имя или путь создаваемого или открываемого подраздела.
- rights
- RegistryRights
Права для раздела реестра.
Возвращаемое значение
Запрошенный вложенный раздел или null
при неудачном выполнении операции.
- Атрибуты
Исключения
name
имеет значение null
.
Раздел RegistryKey является закрытым (доступ к закрытым разделам невозможен).
У пользователя отсутствуют разрешения, необходимые для доступа к разделу реестра в заданном режиме.
Комментарии
Необходимо открыть ключ, прежде чем им можно будет управлять с помощью других методов и свойств. Чтобы изменить ключ, необходимо открыть его с помощью перегрузки OpenSubKey метода , которая позволяет указать доступ на запись.
Применяется к
OpenSubKey(String)
- Исходный код:
- RegistryKey.cs
Возвращает подраздел с доступом только для чтения.
public:
Microsoft::Win32::RegistryKey ^ OpenSubKey(System::String ^ name);
public Microsoft.Win32.RegistryKey OpenSubKey (string name);
public Microsoft.Win32.RegistryKey? OpenSubKey (string name);
member this.OpenSubKey : string -> Microsoft.Win32.RegistryKey
Public Function OpenSubKey (name As String) As RegistryKey
Параметры
- name
- String
Имя или путь для подраздела, открываемого только для чтения.
Возвращаемое значение
Запрошенный вложенный раздел или null
при неудачном выполнении операции.
Исключения
name
равно null
Раздел RegistryKey является закрытым (доступ к закрытым разделам невозможен).
У пользователя отсутствуют разрешения, необходимые для чтения раздела реестра.
Примеры
В следующем примере кода создается тестовый ключ и используется OpenSubKey метод для его открытия, демонстрируя обе перегрузки метода .
#using <Microsoft.VisualBasic.dll>
using namespace System;
using namespace Microsoft::Win32;
using namespace Microsoft::VisualBasic;
int main()
{
// Delete and recreate the test key.
Registry::CurrentUser->DeleteSubKey( L"RegistryOpenSubKeyExample", false );
RegistryKey ^ rk = Registry::CurrentUser->CreateSubKey( L"RegistryOpenSubKeyExample" );
rk->Close();
// Obtain an instance of RegistryKey for the CurrentUser registry
// root.
RegistryKey ^ rkCurrentUser = Registry::CurrentUser;
// Obtain the test key (read-only) and display it.
RegistryKey ^ rkTest = rkCurrentUser->OpenSubKey( L"RegistryOpenSubKeyExample" );
Console::WriteLine( L"Test key: {0}", rkTest );
rkTest->Close();
rkCurrentUser->Close();
// Obtain the test key in one step, using the CurrentUser registry
// root.
rkTest = Registry::CurrentUser->OpenSubKey( L"RegistryOpenSubKeyExample" );
Console::WriteLine( L"Test key: {0}", rkTest );
rkTest->Close();
// Open the test key in read/write mode.
rkTest = Registry::CurrentUser->OpenSubKey( L"RegistryOpenSubKeyExample", true );
rkTest->SetValue( L"TestName", L"TestValue" );
Console::WriteLine( L"Test value for TestName: {0}", rkTest->GetValue( L"TestName" ) );
rkTest->Close();
return 0;
} //Main
using System;
using Microsoft.Win32;
using Microsoft.VisualBasic;
public class Example
{
public static void Main()
{
// Delete and recreate the test key.
Registry.CurrentUser.DeleteSubKey("RegistryOpenSubKeyExample", false);
RegistryKey rk = Registry.CurrentUser.CreateSubKey("RegistryOpenSubKeyExample");
rk.Close();
// Obtain an instance of RegistryKey for the CurrentUser registry
// root.
RegistryKey rkCurrentUser = Registry.CurrentUser;
// Obtain the test key (read-only) and display it.
RegistryKey rkTest = rkCurrentUser.OpenSubKey("RegistryOpenSubKeyExample");
Console.WriteLine("Test key: {0}", rkTest);
rkTest.Close();
rkCurrentUser.Close();
// Obtain the test key in one step, using the CurrentUser registry
// root.
rkTest = Registry.CurrentUser.OpenSubKey("RegistryOpenSubKeyExample");
Console.WriteLine("Test key: {0}", rkTest);
rkTest.Close();
// Open the test key in read/write mode.
rkTest = Registry.CurrentUser.OpenSubKey("RegistryOpenSubKeyExample", true);
rkTest.SetValue("TestName", "TestValue");
Console.WriteLine("Test value for TestName: {0}", rkTest.GetValue("TestName"));
rkTest.Close();
} //Main
} //Example
Imports Microsoft.Win32
Public Class Example
Public Shared Sub Main()
' Delete and recreate the test key.
Registry.CurrentUser.DeleteSubKey("RegistryOpenSubKeyExample", False)
Dim rk As RegistryKey = Registry.CurrentUser.CreateSubKey("RegistryOpenSubKeyExample")
rk.Close
' Obtain an instance of RegistryKey for the CurrentUser registry
' root.
Dim rkCurrentUser As RegistryKey = Registry.CurrentUser
' Obtain the test key (read-only) and display it.
Dim rkTest As RegistryKey = rkCurrentUser.OpenSubKey("RegistryOpenSubKeyExample")
Console.WriteLine("Test key: {0}", rkTest)
rkTest.Close
rkCurrentUser.Close
' Obtain the test key in one step, using the CurrentUser registry
' root.
rkTest = Registry.CurrentUser.OpenSubKey("RegistryOpenSubKeyExample")
Console.WriteLine("Test key: {0}", rkTest)
rkTest.Close
' Obtain the test key in read/write mode.
rkTest = Registry.CurrentUser.OpenSubKey("RegistryOpenSubKeyExample", True)
rkTest.SetValue("TestName", "TestValue")
Console.WriteLine("Test value for TestName: {0}", rkTest.GetValue("TestName"))
rkTest.Close
End Sub
End Class
Комментарии
Необходимо открыть ключ, прежде чем им можно будет управлять с помощью других методов и свойств. Чтобы изменить ключ, необходимо открыть его с помощью перегрузки OpenSubKey метода , которая позволяет указать доступ на запись, например перегрузку OpenSubKey(String, RegistryKeyPermissionCheck) или перегрузку OpenSubKey(String, Boolean) .
Если указанный подраздел не найден, null
возвращается .
Чтобы использовать OpenSubKey метод , необходимо иметь экземпляр RegistryKey. Чтобы получить экземпляр RegistryKey, используйте один из статических Registry членов класса .
См. также раздел
- CreateSubKey(String)
- DeleteSubKey(String)
- DeleteSubKeyTree(String)
- GetSubKeyNames()
- OpenRemoteBaseKey(RegistryHive, String)
- SubKeyCount
- Registry
Применяется к
OpenSubKey(String, RegistryKeyPermissionCheck)
- Исходный код:
- RegistryKey.cs
Возвращает заданный подраздел с доступом для чтения или для чтения и записи.
public:
Microsoft::Win32::RegistryKey ^ OpenSubKey(System::String ^ name, Microsoft::Win32::RegistryKeyPermissionCheck permissionCheck);
public Microsoft.Win32.RegistryKey OpenSubKey (string name, Microsoft.Win32.RegistryKeyPermissionCheck permissionCheck);
public Microsoft.Win32.RegistryKey? OpenSubKey (string name, Microsoft.Win32.RegistryKeyPermissionCheck permissionCheck);
[System.Runtime.InteropServices.ComVisible(false)]
public Microsoft.Win32.RegistryKey OpenSubKey (string name, Microsoft.Win32.RegistryKeyPermissionCheck permissionCheck);
member this.OpenSubKey : string * Microsoft.Win32.RegistryKeyPermissionCheck -> Microsoft.Win32.RegistryKey
[<System.Runtime.InteropServices.ComVisible(false)>]
member this.OpenSubKey : string * Microsoft.Win32.RegistryKeyPermissionCheck -> Microsoft.Win32.RegistryKey
Public Function OpenSubKey (name As String, permissionCheck As RegistryKeyPermissionCheck) As RegistryKey
Параметры
- name
- String
Имя или путь создаваемого или открываемого подраздела.
- permissionCheck
- RegistryKeyPermissionCheck
Одно из значений перечисления, определяющее, с какими правами открывается раздел: только для чтения или для чтения и записи.
Возвращаемое значение
Запрошенный вложенный раздел или null
при неудачном выполнении операции.
- Атрибуты
Исключения
name
равно null
Параметр permissionCheck
содержит недопустимое значение.
Раздел RegistryKey является закрытым (доступ к закрытым разделам невозможен).
У пользователя отсутствуют разрешения, необходимые для чтения раздела реестра.
Примеры
В следующем примере кода создается подраздел, содержащий 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.
'
Комментарии
Вместо того чтобы вызывать исключение, этот метод возвращает значение null
, если запрошенный ключ не существует.
Если permissionCheck
имеет значение RegistryKeyPermissionCheck.ReadWriteSubTree, ключ открывается для чтения и записи; если permissionCheck
имеет значение RegistryKeyPermissionCheck.ReadSubTree или RegistryKeyPermissionCheck.Default, ключ открывается для чтения, если родительский ключ не был открыт с RegistryKeyPermissionCheck.ReadWriteSubTreeпомощью .
Чтобы использовать OpenSubKey метод , необходимо иметь экземпляр RegistryKey класса . Чтобы получить экземпляр RegistryKey, используйте один из статических Registry членов класса .
См. также раздел
- CreateSubKey(String)
- DeleteSubKey(String)
- DeleteSubKeyTree(String)
- GetSubKeyNames()
- OpenRemoteBaseKey(RegistryHive, String)
- SubKeyCount
- Registry