2015-11-20 11 views
2

Я пытаюсь запустить некоторый неуправляемый код из C# ca в WIX. У меня есть обертка вокруг функции CryptProtectData, этот код отлично работает, если запускаться из командной строки администратора. Я назначил ca как отложенный, надеясь, что он будет работать во время поднятой сессии, но в этом контексте он не работает.Вызов API защиты данных изнутри CustomAction

Расписание выглядит следующим образом:

<CustomAction Id="SetCustomActionDataValue" Property="EncryptValues" Value="foo=bar;...;" /> 
<CustomAction Id="EncryptValues" BinaryKey="InstallerCustomAction.CA.dll" DllEntry="EncryptValues" Execute="deferred" Impersonate="no" HideTarget="no" Return="check" /> 

<InstallExecuteSequence> 
    <Custom Action="SetCustomActionDataValue" After="InstallFiles" /> 
    <Custom Action="EncryptValues" After="SetCustomActionDataValue" /> 
</InstallExecuteSequence> 

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

+0

Проверьте последовательность выполнения в ORCA и запустите свой CA после последнего пользовательского действия перед InstallFinlize. InstallFinilize - это последнее customAction, которое выполняется как отложенное. – vinay

+0

Это не помогло. Очевидно, что есть что-то в среде установщика Windows как на стадии немедленного, так и на отсрочке, которая предотвращает запуск кода DPAPI. Тот же код отлично работает при вызове из простого консольного приложения. – Ritmo2k

ответ

0

У вас есть регистрация в вашем ЦА? Можете ли вы подтвердить, что ваш CustomActionData сделал это?

Одна вещь, которую вы можете попробовать, - подключить это как простое консольное приложение и использовать PSExec для вызова приглашения cmd.exe как SYSTEM.

Я никогда не использовал этот API, но комментарий «Как правило, только пользователь с теми же учетными данными, что и пользователь, который зашифровал данные, может расшифровать данные». заставляет меня думать, что это может работать не так хорошо, как SYSTEM. Эта статья, похоже, подтверждает это. http://www.obviex.com/samples/dpapi.aspx

FWIW, я не уверен, чего вы пытаетесь достичь, но я подумал о том, чтобы переместить его из установщика в приложение, если это возможно. Установщики, как правило, лучше всего просты и надежны.

+0

Да, у меня есть регистрация. CA входит в контекст альтернативного пользователя с кодом, подобным [Код олицетворения в C#] (http://blogs.msdn.com/b/joncole/archive/2009/09/21/impersonation-code-in-c. aspx), я регистрирую нового пользователя, затем пытается использовать код DPAPI. Используя монитор процесса, я не вижу очевидной проблемы, шифрование просто терпит неудачу. Я мог бы переместить эту часть, однако у установщика есть диалог, который запрашивает всю требуемую конфигурацию времени выполнения (ее службу) и оставляя этот шаг, будет менее идеальным. – Ritmo2k

+0

Многие эксперты Windows Installer считают, что данные конфигурации должны быть исключены из программы установки и обработаны при первом запуске. В случае услуги вы можете запустить службу в режиме покоя, а затем начать обработку рабочего процесса после инициализации данных конфигурации. –