Вставить индивидуальный код в ClickOnce setup.exe? - PullRequest
6 голосов
/ 03 сентября 2011

Я знаю, что можно передавать параметры через URL в приложения ClickOnce, запущенные онлайн.Однако большинство пользователей загружают setup.exe и запускают его со своего компьютера.Можно ли переписать файл setup.exe при загрузке, вставить код (скажем, адрес электронной почты пользователя), а затем запустить приложение со знанием кода?Предположим, что мы можем каким-то образом переподписать setup.exe, чтобы он был законным.

Предположим, что .NET 3.5.

Обновление Цель здесь - передать любое электронное письмо.адрес и / или справочную информацию для setup.exe, так что даже когда пользователь запускает установщик с другого компьютера и другого ip, мы можем выяснить, кто выполнил переход.

Обновление 2 Предположим .NET 3.5 SP1, это помогает?По-видимому, теперь можно передавать параметры в .application в автономном режиме.Можно ли встраивать параметры в setup.exe, чтобы он вызывал .application? Ref = кто-то прав, когда запускается setup.exe?

Ответы [ 5 ]

4 голосов
/ 17 сентября 2011

Что ж, если ваша цель - встроить идентификатор клиента (электронная почта, код и т. Д.) В exe, самый простой способ, о котором я могу подумать, это использовать IPropertyStorage и IPropertySetStorage интерфейсы.Если вы чувствуете себя смелым, вы можете вызывать методы непосредственно в IPropertySetStorage через p / invoke , или вы можете пойти простым путем и использовать подготовленную оболочку COM Microsoft, которая называется dsofile.dll .

Обратите внимание, что, хотя dsofile предназначен для офисных документов, он действительно работает с любым файлом - включая файлы .exe - вы просто застряли с предопределенными именами свойств.Почему бы не бросить свой идентификатор клиента во что-то вроде свойства .Comments.Просто сделайте это так, чтобы вы могли разобрать его снова.

Вот пример:

var doc = new OleDocumentPropertiesClass();
doc.Open(pathToFile);
doc.SummaryProperties.Comments = "joe@test.com";
doc.Save(); 

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

Вы можете связать dsofile.dll с вашим приложением и зарегистрировать его как зависимость и использовать его в своем установщике для считывания свойства обратно.Или, если вы можете p / вызвать IPropertyStorage без него, у вас не будет зависимости.

Другая вещь, на которую стоит обратить внимание, - это использование расширенных свойств файла, которые считываются Shell32.dll.Я просто не смог найти чистый способ написать их легко.Если вы идете по этому пути, пожалуйста, поделитесь, как вы записали свойства в свой .exe.

1 голос
/ 11 сентября 2011

Посмотрите, может ли класс InPlaceHostingManager помочь вам в этом случае.Это, вероятно, не будет делать именно то, что вы просили.Но может помочь ...

Любое приложение ClickOnce, основанное на .exe-файле, может быть автоматически установлено и обновлено с помощью пользовательского установщика.Пользовательский установщик может реализовать пользовательский интерфейс во время установки, включая настраиваемые диалоговые окна для операций безопасности и обслуживания.Для выполнения операций установки пользовательский установщик использует класс InPlaceHostingManager .

Пошаговое руководство. Создание пользовательского установщика для приложения ClickOnce

РЕДАКТИРОВАТЬ

Я не уверен, что вы могли бы достичь того, что вы хотите именно так, как вы описали в вопросе.Проверьте, помогают ли вам эти темы.

Доступ к локальным и удаленным данным в приложениях ClickOnce

Как включить пользовательские файлы данных в развертывание ClickOnce?

Как: получить информацию о строке запроса в онлайн-приложении ClickOnce

0 голосов
/ 16 сентября 2011

Вам следует объединить подход Чарита и Джоша - по сути, настройте свой веб-сервер так, чтобы вы могли сгенерировать новую настройку на основе параметров URL.Используйте пользовательский установщик, чтобы прочитать справочную информацию из ресурса для setup.exe.Проверьте эту ссылку , чтобы узнать, как манипулировать ресурсами для собственного приложения в C # - вам нужно записать файл ресурсов во время генерации установки и прочитать его из пользовательского установщика.

Еще одним способом создания пользовательской настройки будет сборка вашего исполняемого файла или вспомогательной сборки из командной строки, встраивающей необходимую информацию.А затем создайте настройку из инструментов командной строки (см. http://msdn.microsoft.com/en-us/library/xc3tc5xx.aspx).. Это кажется довольно громоздким и потребует много времени для создания пользовательской настройки, в отличие от изменения ресурса уже созданной установки.

Совершенно другой подход заключается в том, чтобы отправлять по электронной почте уникальный код реферала (регистрационный код) всякий раз, когда пользователь загружает приложение. В настройке (или приложении) используйте пользовательский установщик, чтобы запросить у пользователя этот код. Если установка вызывается через URL, то кодбудет доступен оттуда, и в этом случае Custom Installer не нужно будет запрашивать код. Электронное письмо, которое вы отправляете при загрузке пользователем установки, должно информировать пользователя о том, чтобы сохранить код в некотором текстовом файле вместе с файлом установки.

0 голосов
/ 14 сентября 2011

Вы можете попробовать встроить эту информацию в качестве ресурса в исполняемый файл. Вот пример обновления ресурса exe на c ++. http://msdn.microsoft.com/en-us/library/ms648008(v=vs.85).aspx#_win32_Updating_Resources

0 голосов
/ 03 сентября 2011

Как бы вы себе «переписали» setup.exe при загрузке?если вместо открытия приложения с предоставленной ссылкой (URL) пользователи загружают файл локально непосредственно из сетевого ресурса, вы не можете перехватить это.

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

...