Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Embed individualized code into ClickOnce setup.exe?

Tags:

c#

clickonce

I know that it is possible to pass in parameters via URL to ClickOnce apps launched online. However, most users downloads setup.exe and launch it from their machine. Is there any way that I can re-write setup.exe at download, insert a code (let's say the user's email address), and then have the app launch with knowledge of the code? Assume that we can somehow re-sign setup.exe so that it is legit.

Assume .NET 3.5.

Update The goal here is to pass on either email address and/or referrer information to setup.exe so that even when the user runs the installer from a different machine and a different ip we can figure out who did the referral.

Update 2 Assume .NET 3.5 SP1, does it help? Apparently one can now pass parameters to .application while offline. Is it possible to embed parameters into the setup.exe so that it calls .application?ref=someone right when setup.exe is run?

like image 822
tofutim Avatar asked Sep 03 '11 05:09

tofutim


2 Answers

Well, if your goal is to embed a customer id (email, code, etc) into the exe, the easiest way I can think of is using the IPropertyStorage and IPropertySetStorage interfaces. If you are feeling brave, you could call methods directly on IPropertySetStorage via p/invoke, or you could go the easy route and use Microsoft's prepared COM wrapper, which is called dsofile.dll.

Note that while dsofile is intended for office documents, it does indeed work on any file - including .exe files - you are just stuck with the pre-defined property names. Why not throw your customer id into something like the .Comments property. Just do it in such a way that you can parse it out again.

Here's a sample:

var doc = new OleDocumentPropertiesClass();
doc.Open(pathToFile);
doc.SummaryProperties.Comments = "[email protected]";
doc.Save(); 

Of course, you need to first copy it to a temp location, and some time after the user downloads it you'll want to delete it.

You can bundle dsofile.dll with your application and register it as a dependancy and use it in your installer to read the property back out. Or if you can p/invoke the IPropertyStorage without it, then you won't have the dependancy.

The other thing to look into would be using the extended file properties that are read by the Shell32.dll. I just haven't been able to find a clean way to write them easily. If you go this route, please share how you wrote the properties to your .exe.

like image 115
Matt Johnson-Pint Avatar answered Oct 10 '22 09:10

Matt Johnson-Pint


Have a look whether InPlaceHostingManager class can help you in this case. It won't probably do exactly what you have asked for. But may be able to help...

Any ClickOnce application based on an .exe file can be silently installed and updated by a custom installer. A custom installer can implement custom user experience during installation, including custom dialog boxes for security and maintenance operations. To perform installation operations, the custom installer uses the InPlaceHostingManager class.

Walkthrough: Creating a Custom Installer for a ClickOnce Application

EDIT

I am not sure whether you could achieve what you want exactly in the way that you have described in the question. Check whether these threads help you.

Accessing Local and Remote Data in ClickOnce Applications

How to include custom data files in ClickOnce deployment?

How to: Retrieve Query String Information in an Online ClickOnce Application

like image 26
CharithJ Avatar answered Oct 10 '22 09:10

CharithJ