Установщик Unicode NSIS и подключаемый модуль UAC: как обмениваться данными между внутренними и внешними экземплярами

Я хочу установить пакет MSI на уровне пользователя и установить несколько ключей реестра в HKLM. Второй требует уровня администратора, и я могу сделать это с помощью плагина NSIS::UAC. Но мне нужен способ уведомить InnerInstance (с правами администратора) о том, какие флажки выбрал пользователь. Существуют следующие возможные способы обмена такой информацией (всего 1 или 0)

  • Ini-файл в папке, к которой оба экземпляра могут получить доступ

безуспешно, APPDATA отличается, а COMMONAPPDATA требует уровня администратора, TMP также не подходит, потому что это зависит от имени профиля

  • Глобальная переменная приложения

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

  • Напишите плагин, который устанавливает и получает семафор

Предположим, что это слишком сложно для простой установки, но выберет его, если другой вариант будет недоступен.

  • Макросы SyncVariable

!macro _SyncVariable _variable !define Lprefix L${LINE} push $R0 goto _SyncVariableInner${Lprefix} _SyncVariableOuter${Lprefix}: StrCpy $R0 ${_variable} return _SyncVariableInner${Lprefix}: !insertmacro UAC_AsUser_Call Label _SyncVariableOuter${Lprefix} ${UAC_SYNCREGISTERS} StrCpy ${_variable} $R0 !undef Lprefix pop $R0 !macroend !define SyncVariable !insertmacro _SyncVariable

он должен работать, но не

  • Получить новый плагин UAC - не видел, где взять двоичный файл, потому что последняя версия не поддерживала сборку юникода NSIS.

Итак, может ли кто-нибудь помочь мне ссылками, мыслями?


person se_pavel    schedule 06.02.2012    source источник
comment
Какую версию плагина вы используете?   -  person Anders    schedule 06.02.2012


Ответы (1)


Официальной сборки Unicode для NSIS не существует, есть разветвленный проект, но плагин UAC не поддерживается в этой конфигурации и, следовательно, не предоставляет для него скомпилированную DLL (вы можете получить скомпилированную версию, если спросите в NSIS). IRC-канал).

Такой гибридный установщик сложно сделать правильно, и его не следует делать ИМХО. Если вы используете подключаемый модуль контроля доступа, чтобы предоставить всем пользователям доступ на запись к $windir\temp\{yourguid} или HKLM\Software\{yourguid}, возможно, вы сможете обмениваться информацией, но это также является потенциальной дырой в безопасности. Та же проблема существует с именованными глобальными объектами ядра (семафор, карты памяти и т. д.).

person Anders    schedule 07.02.2012
comment
Мне нужно всего несколько ключей HKLM, поэтому я решил написать небольшую программу на C++, которая повысит привилегии, а весь установщик NSIS останется на уровне пользователя. - person se_pavel; 07.02.2012