Скрытые ключи реестра / значения - PullRequest
6 голосов
/ 21 ноября 2011

После прочтения этого поста на 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, написать эту часть реестра, если мне нужно сохранить значение для каждой машины?

1 Ответ

1 голос
/ 09 января 2016

Если вы хотите это в HKLM и привилегии не позволяют, не имеет значения, какой уровень API вы используете, Reg * функции Nt * - это не позволит вам сделать это с ошибкой отказа в доступе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...