2015-08-23 9 views
11

Ho un'applicazione .NET C#, racchiusa nell'installer MSI - "myprogram.exe". Ho un sito Web PHP e una pagina specifica in cui l'utente può scaricare il programma tramite un collegamento.Come scaricare il programma di installazione MSI con argomento per l'ID utente

Vorrei essere in grado di tenere traccia di determinati eventi nell'app .NET. Ad esempio - "Programma aperto".

È facile inviare eventi al mio server, tuttavia come faccio a prendere l'id utente dal server php, quindi posso sapere quale utente ha fatto cosa sull'app .NET?

Ho pensato di passare un argomento (l'id utente) al programma di installazione MSI ma non ho trovato un modo per farlo.

Come si collega tra l'ID utente PHP e l'app .NET?

Chiarimento -

Molte persone offerto di utilizzare un sistema di login di legare tra il server e applicazione.

Questa è davvero la soluzione più semplice, tuttavia sul mio sito Web non costringo l'utente a effettuare il login per scaricare l'app (né richiedo i dettagli di accesso nell'app .NET, facoltativo). Se non dovessimo chiedere i dettagli di accesso, penso che non dovremmo, l'esperienza per l'utente sarà molto migliore (molto meno passaggi per utilizzare l'app) - maggiori possibilità per l'utente di scaricare e utilizzare l'app Desktop.

Si consideri che il flusso di corrente è -> pagina web - Scarica click - Run - Usare l'applicazione (dura 10 secondi)

Con login -> pagina web - Register (conferma e-mail?) - run - Redirect - Download Clicca - Login app - Utilizza l'app (richiede 60-120 secondi per l'utente)

+0

Non ho capito bene la tua domanda. Vuoi includere un ID utente all'interno del programma di installazione MSI quando l'utente lo scarica? Perché non si implementa semplicemente un sistema di accesso in cui si inviano un nome utente e una password al server e questo risponde con un oggetto/id utente? –

+0

Tutte le soluzioni che richiedono all'utente di immettere dettagli sull'avvio dell'app e collegarsi all'app in questo modo, richiede anche all'utente di inserire i dettagli una seconda volta che è una cosa che vorrei evitare per un UX migliore – yaron

+0

Fallimento per vedere come un login potrebbe peggiorare la UX ...Cosa succede se l'utente desidera disconnettersi o utilizzare la stessa app ma con un altro utente? Inoltre, hai pensato alla sicurezza? Utilizzerai per sempre lo stesso token/chiave di autenticazione? Cosa succede se l'installazione viene compromessa? L'utente dovrà scaricare di nuovo e reinstallare la tua app? –

risposta

10

Login dal programma di

Il modo migliore è quello di lasciare il segno-in utente con le stesse credenziali nel programma. In questo modo, il tuo programma può utilizzare l'autenticazione OAuth2 sicura per comunicare con l'API back-end. Ciò rende inoltre trasparente all'utente che il programma sta comunicando con Internet.

Includere user-id nel nome del file

Un altro modo è quello di aggiungere l'user-id al nome del file del programma di installazione durante il download ed estrarre quando viene eseguito il programma di installazione. Dovrai controllare se lo strumento di installazione lo consente. Inoltre, fai questo solo se i tuoi user-id sono UUID o qualcosa di simile in quanto non vuoi che l'utente indovini gli altri id.

App.config

Una terza opzione è quella di aggiungere l'user-id al file App.config. Ci sono due modi per farlo:

  1. Crea il tuo MSI con App.config non compresso, aggiungere un ambiente user-id con UUID fissa.Lo script PHP può cercare l'UUID e sostituirlo nel .msi binary prima di inviarlo all'utente. Vedere lo snippet di codice sotto Trasformazione MST
  2. Costruire il .msi su richiesta con l'App.config personalizzato. Funzionerà solo se il tuo server web è in esecuzione su Windows o se hai un server Windows build remoto che può fare questo lavoro.

MST trasformare

Si potrebbe anche usare un MST trasformare e utilizzare lo stesso binario sostituire trucco, come ho spiegato per il punto 1 sotto App.config.

Per entrambe le opzioni, è possibile utilizzare uno script PHP che utilizza funzioni binarie-safe per sostituire i valori nel programma di installazione e invia il file per l'utente per il download:

<?php 
$userId = // TODO get userId from the session or database 
$data = file_get_contents("./my-installer.msi"); 
// I would use UUID's for template and userId, this way the size of the installer remains the same after replace 
$data = str_replace("{fe06bd4e-4bed-4954-be14-42fb79a79817}", $userId, $data); 
// Return the file as download 
header("Cache-Control: public"); // needed for i.e. 
header('Content-Disposition: attachment; filename=my-installer.msi'); 
header('Content-Type: application/x-msi'); 
header("Content-Transfer-Encoding: Binary"); 
echo $data; 
?> 

Numero di serie

L'ultimo metodo a cui posso pensare è di consentire al programma di richiedere un numero di serie al primo avvio e di consentire al sito Web di generare un numero di serie univoco per ciascun utente.

+0

La trasformazione MST "trucco" fa la magia per me, grazie. – yaron

+0

Buona risposta (che ti ha svalutato nonostante abbia il distintivo sportivo), ti meriti la taglia. Penso che questo approccio sia applicabile a un vasto pubblico al di là di PHP o C# e sto ripagando la domanda per soddisfare :) –

+1

Grazie, anche la tua risposta mi piace. Non pensavo alla trasformazione MST, in primo luogo, perché puoi usare lo stesso approccio con un app.config non compresso per ciò che l'OP vuole ottenere. –

4

Quando il file viene chiamato invia un parametro di UserID, se stai utilizzando un framework MVC nel tuo PHP avresti bisogno di un nuovo controller che ottiene il file msi e lo rinomina in name-userID.exe e quindi restituisce il file da scaricare tramite il browser.

+0

quando ho risposto al post non ci sono state risposte che mostrano –

7

Um OK, si noti che molto probabilmente questo è non quello che vuoi fare. Non di meno ti spiego un paio di modi per farlo ..

Utilizzo di file MST con MSI:

È possibile creare file MST con una proprietà user-id e generare questi per ciascun utente quando scaricano il msi e farli installare il msi con una trasformazione:

msiexec -i c:\temp\The.msi transforms=c:\temp\YourPerso.mst 

Visualizza maggiori informazioni qui: Install a transform using the command line.

I file MST vengono utilizzati molto nelle organizzazioni di grandi dimensioni, in cui tutti gli MSI dispongono di file MST con numeri di serie ed ecc. Incorporati.

Per creare un file MST è necessario scaricare e installare Microsofts Orca Tool, its part of the Microsoft Windows SDK.

Aprire Orca e creare un file MST fuori dal file MSI. Fondamentalmente si apre il file MSI passare alla tabella "Proprietà", lì si vede un elenco di parametri. Nota nel file MSI vengono visualizzati i parametri che richiedono il valore predefinito.

Prima di aggiungere/modificare parametri, creare una nuova trasformazione facendo clic nel menu su "Trasforma" -> "Nuova trasformazione".

enter image description here

In seguito è possibile modificare i parametri o aggiungerne di nuovi, come si desidera. Al termine delle modifiche dei parametri, utilizzare la funzione "Genera trasformazione" nel menu "Trasforma" per generare un file MST.

enter image description here

Se quindi si apre il file mst con una HexEditor si può vedere la proprietà appena aggiunto:

enter image description here

Si potrebbe modificare il file per ogni download, semplicemente modificando il valore , ad esempio:

enter image description here

Potrà cours e (e probabilmente dovrebbe) farlo nel modo corretto usando l'API di WindowsInstaller.Installer. Ecco un esempio:

private function createTransform(mstfile, msi, config) 
    writeLog InfoLog, "Generating transform " & mstfile 

    dim vars: set vars = configvars(config) 

    dim createPropertyTable: createPropertyTable = "create table `Property` " & _ 
     "(`Property` char(72) not null, `Value` longchar localizable " & _ 
     "primary key `Property`)" 
    dim addProperty: addProperty = "insert into `Property` (`Property`, `Value`) values (?, ?)" 
    dim updateProperty: updateProperty = "update `Property` set `Value` = ? where `Property` = ?" 

    dim wi: set wi = createObject("WindowsInstaller.Installer") 
    dim base: set base = wi.openDatabase("base.msi", msiOpenDatabaseModeCreate) 
    base.openview(createPropertyTable).execute 
    dim tgt: set tgt = wi.openDatabase("tgt.msi", msiOpenDatabaseModeCreate) 
    tgt.openview(createPropertyTable).execute 
    dim props: set props = createObject("scripting.dictionary") 
    dim view: set view = msi.openView("select `Property`, `Value` from `Property`") 
    view.execute   
    dim record: set record = view.fetch 
    while not record is nothing 
     props(record.stringdata(1)) = true 
     base.openview(addProperty).execute record 
     tgt.openview(addProperty).execute record  
     set record = view.fetch 
    wend 

    set record = wi.createRecord(2) 
    dim prop 
    for each prop in properties_ 
     on error resume next 
     dim val: val = expand(vars, prop(DepPropertyValueIdx)) 
     if err then 
      writeLog ErrorLog, err.description 
      exit function 
     end if 
     on error goto 0 
     writeLog InfoLog, "Property " & prop(DepPropertyNameIdx) & "=" & val 
     if props.exists(prop(DepPropertyNameIdx)) then 
      record.stringdata(2) = prop(DepPropertyNameIdx) 
      record.stringdata(1) = val 
      tgt.openview(updateProperty).execute record 
     else 
      record.stringdata(1) = prop(DepPropertyNameIdx) 
      record.stringdata(2) = val 
      tgt.openview(addProperty).execute record 
     end if 
    next 
    if not tgt.generateTransform(base, mstfile) then 
     writeLog ErrorLog, "Failed to create transform" 
     exit function 
    end if 
    tgt.createTransformSummaryInfo msi, mstfile, 0, 0 
    createTransform = true 
end function 

Suggerimento: di fare questo con codice gestito si sta meglio fuori usando i Microsoft.Deployment.WindowsInstaller.dll questo è disponibile come parte del http://wix.codeplex.com/


Costruire un MSI per ogni utente :

IMHO sarebbe molto più facile farlo con Nullsoft (WiX, InstallShield, INNO, ecc.) e crea un MSI per ciascun utente. Per fare ciò incorpora un ID utente univoco, ad esempio an nsi script, e avvia una build MSI per ogni download. Durante l'installazione l'ID utente univoco verrebbe archiviato in un file, una chiave di registro o così via. Ti suggerisco di fare questo tentativo utilizzando questo NSIS Wizard Editor per creare rapidamente uno script di installazione NSI di base e build the MSI via a command line: makensis.

Nota: Mentre "Includere l'id utente nel nome file MSI" è più semplice della creazione di un MSI per ciascun utente, gli utenti possono facilmente modificare il nome file. È molto, molto meno probabile che un utente verificherà l'MSI usando Orca per trovare un id utente integrato.


Il modo più semplice e logica:

E 'facile per inviare eventi al mio server, ma come faccio a afferro il user-id dal server php, così posso sapere quale utente ha fatto cosa sull'app .NET?

Fai quello @WouterHuysentruit consigliato @Jhuliano Moreno e poi:

Quando l'applicazione si avvia per la prima volta è sufficiente fare il login utente al programma utilizzando le credenziali del sito web e registrare il loro user id in un config file, chiave di registro o record del database. Fondamentalmente creando un cookie in modo da conoscerli la prossima volta che si apre il programma - o farli accedere ogni volta.

Problemi correlati