Как работать, x64 укусил версию реестра из cmd.exe, расположенного под c:\windows\sysWow64

Ваш протест, что производительность должна была бы контролироваться тщательно, будет верен независимо от решения, которое наконец улажено на. Нижняя строка - то, что процесс получения и сохранения контрольных данных собирается стоить Вам ресурсов (ввод-вывод, ЦП, устройство хранения данных, и т.д.).

Вы заявляете, что встроенный аудит Oracle совершил нападки больше всего, если не все Ваши требования. Почему альтернативу должны рассмотреть? Думайте о том, что Oracle потратила значительное усилие в оптимизации аудита людьми, которые знакомы с внутренностями Oracle. Я серьезно сомневаюсь, что большинство организаций имеет ресурсы, чтобы сделать это лучше. Если Вы, самокрутка, или даже идут с некоторым решением других производителей, ОЧЕНЬ подготовлены найти свой организационный аудит поддержки, вместо того, чтобы контролировать поддержку Вашей организации.

Если бы это был я, то я рекомендовал бы использовать встроенную технологию и при необходимости, создав что-то внутреннее, это имело дело с требованиями, у Вас есть тот Аудит Oracle, не удовлетворяет. Вы могли бы также рассмотреть, насколько важный такие требования действительно.

Тем не менее там существует много сторонних инструментов. Быстрый поиск Google приводит к нескольким возможностям. Я заметил один (Инструменты DB для Oracle) работы путем генерации триггеров для Вас.

6
задан 7 May 2014 в 14:31
3 ответа

Версия по умолчанию regedit.exe в 64-битной ОС Windows - это 64-битная версия .

Исполняемый файл regedit находится в C: \ Windows \ SysWOW64 - это 32-разрядная версия, а исполняемый файл в C: \ Windows - 64-разрядная версия.

Итак ... вот почему вы видите 32-битную версию при запуске из SysWOW64 . Потому что вы используете 32-битную версию. SysWOW64 - это место, где находится 32-разрядная версия и откуда она используется (поскольку она запускается 64-разрядной системой для обеспечения совместимости).

Вы можете проверить / проверить, какую версию regedit вы используете выполняется при наличии ключа Wow6432Node в HKEY_LOCAL_MACHINE \ SOFTWARE . Когда вы запускаете regedit из C: \ Windows , этот узел будет существовать (он отображает 32-битную версию ваших ключей реестра). Если вы запустите regedit из C: \ Windows \ SysWOW64 , этого ключа не будет, потому что вы уже просматриваете 32-разрядный реестр.

C: \ Windows \ regedit.exe < => 64-разрядная версия regedit.
C: \ Windows \ SysWOW64 \ regedit.exe <=> 32-разрядная версия regedit.

3
ответ дан 3 December 2019 в 00:15

В 64-битной Windows существует так называемое перенаправление файловой системы и реестра. Они существуют для совместимости со старыми приложениями, написанными для 32-битной Windows, и для приложений, разработанных для более старых версий Windows. WoW64 перехватывает все системные вызовы, сделанные 32-разрядными процессами, так что если мое 32-разрядное приложение, работающее в 64-разрядной версии Windows, вызывает C: \ Windows \ System32, WoW64 прозрачно перенаправит его на C: \ Windows \ SysWoW64, и т. д. Виртуальный каталог C: \ Windows \ Sysnative указывает на родную версию (64-разрядную версию) каталога, независимо от разрядности потока, ссылающегося на этот путь файловой системы.

Аналогичный механизм существует для реестра, и для этого и предназначен ключ WoW6432Node. Технически я бы назвал эти 32-битные и 64-битные представления реестра, если бы я хотел быть кратким ... Или педантичным.

Я написал код (на C #) не так давно для доступ к ключу в собственной (64-битной) части улья из 32-битного процесса. Вот сокращенный фрагмент:

// Accessing 64-bit registry key from 32-bit process
enum RegAccessFlag
{
    NONE                   = 0,
    KEY_QUERY_VALUE        = 0x0001,
    KEY_SET_VALUE          = 0x0002,
    KEY_CREATE_SUB_KEY     = 0x0004,
    KEY_ENUMERATE_SUB_KEYS = 0x0008,
    KEY_NOTIFY             = 0x0010,
    KEY_CREATE_LINK        = 0x0020,
    KEY_WOW64_64KEY        = 0x0100, // This is the ticket
    KEY_WOW64_32KEY        = 0x0200,
    KEY_WOW64_RES          = 0x0300
}

public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);

[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int RegOpenKeyEx(UIntPtr hkey, string subKey, int ulOptions, int samDesired, out UIntPtr hkResult);

static void Main(string[] args)
{
    int statusCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE", 0, (int)RegAccessFlag.KEY_WOW64_64KEY | (int)RegAccessFlag.KEY_QUERY_VALUE, out hKey);
}

Конечно, вам все равно нужно прочитать значение из ключа после того, как вы его открыли, или создать новое значение, а затем не забудьте закрыть ключ, когда закончите, но это даст вам запускался, если вы хотели написать какой-либо код.

Но поскольку вы говорите о порождении 32-битного процесса из другого 32-битного процесса, чтобы этот дочерний процесс мог получить доступ к собственному представлению реестра на 64-битной платформе ... вы имеете дело с комбинацией перенаправления файловой системы и реестра, которые мешают вам. И в довершение всего, regedit.exe - своего рода специальная утилита в этом отношении.

TL; DR: Дайте C: \ Windows \ sysnative \ regedt32.exe попробуйте вместо regedit.exe .

https://stackoverflow.com/questions/12233396/open-64-bit-regedit-from-32-bit-application

6
ответ дан 3 December 2019 в 00:15

Похоже, что "% systemroot% \ regedit.exe" также выполняет какое-то перенаправление.

Начиная с Vista, это работает, когда вы используете 32-разрядную версию cmd в 64-битной системе:

"%systemroot%\sysnative\cmd.exe" /c "%systemroot%\regedit.exe"
1
ответ дан 3 December 2019 в 00:15

Теги

Похожие вопросы