Повышение разрешений для Visual Studio для сценария пакетного события после сборки

У меня есть пакетный файл, который копирует каталог в новое место, создает 2 других файла .bat, 2 файла .json и вставляет ключи реестра. При запуске пакетного сценария для командной строки я не получаю ошибок и все желаемые результаты. При запуске из командной строки события после сборки Я не получаю ошибок, но мне не хватает записей в реестре. Сотрудник предположил, что это может быть связано с тем, что Visual Studio не имеет разрешений администратора, тогда как командная строка может. Мой вопрос: есть ли способ (без запуска Visual Studio от имени администратора) повысить разрешения для события после сборки? Если вам интересно, почему бы просто не запустить VS как администратор, это потому, что это решение используется через TFS, и не все мои коллеги будут знать, что нужно запускать свой экземпляр VS как администратор для этого конкретного решения. Я погуглил, и мне нечего было показать. Заранее благодарим за помощь! Вот командная строка события Post-build, которую я использую. Опять же, я знаю, что это работает ... это просто не влияет на значения реестра. CMD делает. PS. Использование VS 2013 в Windows 7

if $(ConfigurationName) == Debug call "$(ProjectDir)BatchFiles\DebugHelper.bat" "$(TargetDir)" C:\CEC\Batch\Test\

person MegaMark    schedule 08.05.2015    source источник
comment
Если вы используете 64-битную версию, возможно, вы просматриваете ключи с неправильной разрядностью. Некоторые ключи виртуализированы, поэтому 32- и 64-битные программы думают, что это один и тот же ключ, но под капотом совершенно другой ключ, это также относится к папке system32. HKEY_LOCAL_MACHINE\Software HKEY_USERS\*\Software\Classes HKEY_USERS\*_Classes   -  person Trigger    schedule 09.05.2015
comment
Хорошо .... так что мне делать? Мой .bat файл выполняет HKLM \ Software \ Google \ Chrome \ NativeMessagingHosts \ abc.def.ghi   -  person MegaMark    schedule 09.05.2015


Ответы (1)


Это из Windows SDK о перенаправлении (есть также отражение и совместное использование)

Перенаправитель реестра

Перенаправитель реестра изолирует 32-битные и 64-битные приложения, предоставляя отдельные логические представления ключевых частей реестра на WOW64. Перенаправитель реестра перехватывает 32-разрядные вызовы реестра для каждого логического представления реестра и сопоставляет их с соответствующим расположением физического реестра. Процесс перенаправления прозрачен для приложения. Следовательно, 32-разрядное приложение может получить доступ к данным реестра, как если бы оно работало в 32-разрядной Windows, даже если данные хранятся в другом месте в 64-разрядной Windows.

Перенаправление включено для следующих разделов реестра:

HKEY_LOCAL_MACHINE\Software 
HKEY_USERS\*\Software\Classes 
HKEY_USERS\*_Classes 
Note  * indicates a match for all user security IDs (SID).

Следующий сценарий иллюстрирует использование этих логических представлений:

32-разрядное приложение проверяет наличие следующего раздела реестра: HKEY_LOCAL_MACHINE \ Software \ Hello. Если ключ не существует, он создает его со значением по умолчанию «Hello 32-bit world»; в противном случае он считывает и отображает значение. Это же приложение изменено для записи «Hello, 64-bit world» вместо «Hello 32-bit world» и перекомпилировано как 64-битное приложение.

Когда 32-битное приложение запускается в 64-битной Windows, оно отображает «Hello, 32-bit world». Когда 64-битное приложение запущено, оно отображает «Hello, 64-bit world». Оба приложения вызывают одни и те же функции реестра с одним и тем же предопределенным дескриптором и одним и тем же именем ключа; разница в том, что каждое приложение работает со своим логическим представлением реестра, и каждое представление сопоставляется с отдельным физическим расположением реестра, что сохраняет обе версии строки нетронутыми.

Чтобы помочь приложениям, которые записывают ключи REG_EXPAND_SZ, содержащие% ProgramFiles%, в реестр, WOW64 перехватывает эти записи и заменяет их на «% ProgramFiles (x86)%». Эта переменная среды определена для всех процессов. Например, если каталог Program Files находится на диске C, то «% ProgramFiles (x86)%» заменяется на «C: \ Program Files (x86)».

Чтобы обеспечить взаимодействие приложений через COM и другие механизмы, WOW64 использует отражение реестра, которое копирует определенные ключи и значения реестра между двумя представлениями реестра для их синхронизации. Рефлектор является интеллектуальным и копирует данные активации COM для локальных серверов между представлениями, но не внутрипроцессные данные, поскольку внутрипроцессное смешивание 32/64 данных не разрешено в 64-битной Windows.

Что делать

В программе

KEY_WOW64_64KEY 0x0100 Access a 64-bit key from either a 32-bit or 64-bit application.
Windows 2000:  This flag is not supported. 

KEY_WOW64_32KEY 0x0200 Access a 32-bit key from either a 32-bit or 64-bit application.
Windows 2000:  This flag is not supported. 

В командной строке см. reg flags /?, позволяющий вашему ключу отказаться от перенаправления.

И напоминание, что UAC также может его виртуализировать. Поскольку он перенаправляет некоторые записи в HKLM в HKCU. Предоставление пользователям разрешения на запись на ваш ключ позволит решить эту проблему.

person Trigger    schedule 08.05.2015
comment
После того, как я потратил некоторое время на то, чтобы осмыслить это ... это действительно имело смысл. CMD добавлял ключ в 32-битное место реестра, тогда как Visual Studio записывала в 64-битное местоположение (хотя сам VS 32-битный ... я думаю, потому что операционная система 64-битная ??) Спасибо связка!!! - person MegaMark; 11.05.2015