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".
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.
Se quindi si apre il file mst con una HexEditor si può vedere la proprietà appena aggiunto:
Si potrebbe modificare il file per ogni download, semplicemente modificando il valore , ad esempio:
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.
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? –
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
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? –