После прочтения этого поста на SO я попытался написать небольшое приложение, которое мне нужно, чтобы прочитать и записать скрытые ключи / значения реестра.
Я проверил Управление реестром с использованием собственных API NT и Создание «скрытых» значений реестра ссылок.
Первый дал мне кое-что для работы, но он написан на C ++, а второй - проект Delphi, работающий хорошо.
Я не могу преобразовать сначала, и я мог бы попытаться преобразовать второе, но мне нужно было бы найти некоторый код для чтения ключей / значений тоже. По этой причине я хотел бы знать, есть ли что-то «готовое» и протестированное в C #.
Я также скачал исходный код Proces Hacker v1.11 и использовал его для частичного преобразования примера Delphi, как показано ниже, но скрытый ключ реестра доступен (в то время как в Delphi его не было) и нет API-интерфейсов. для записи значений.
static void Main(string[] args)
{
string KeyNameBuffer = @"\Registry\User\S-1-5-21-3979903645-2167650815-2353538381-1001\SOFTWARE";
string NewKeyNameBuffer = "Systems Internals";
string HiddenKeyNameBuffer = "Can't touch me\0";
string HiddenValueNameBuffer = "Hidden Value";
// Apro la chiave di registro
IntPtr SoftwareKeyHandle = CreateKey(KeyNameBuffer, IntPtr.Zero);
if (SoftwareKeyHandle != IntPtr.Zero)
{
IntPtr SysKeyHandle = CreateKey(NewKeyNameBuffer, SoftwareKeyHandle);
if (SysKeyHandle != IntPtr.Zero)
{
// This key shouldn't be accessible, but it is
IntPtr HiddenKeyHandle = CreateKey(HiddenKeyNameBuffer, SysKeyHandle);
if (HiddenKeyHandle != IntPtr.Zero)
{
// I don't have APIs to write values
}
}
}
}
static IntPtr CreateKey(string keyName, IntPtr rootKey)
{
IntPtr res;
KeyCreationDisposition disp;
ObjectAttributes attributes = new ObjectAttributes(keyName,
ObjectFlags.CaseInsensitive,
new NativeHandle(rootKey));
NtStatus st = Win32.NtCreateKey(out res, KeyAccess.All,
ref attributes, 0,
IntPtr.Zero, RegOptions.NonVolatile, out disp);
return st == NtStatus.Success ? res : IntPtr.Zero;
}
Наконец: начиная с Vista, вы не можете написать \Registry\Machine
часть, если вы не запускаете свое приложение от имени администратора, поэтому в примере я использовал мой раздел реестра пользователя. Есть ли способ для нас, нативных API, написать эту часть реестра, если мне нужно сохранить значение для каждой машины?