Um OK, обратите внимание, что это очень вероятно, это не что вы хотите сделать. Тем не менее, я объясню несколько способов сделать это ..
Использование MST файлов с ССИ:
Вы можете создать MST-файлы со свойством ID пользователя и генерировать их для каждого пользователя, когда они скачать MSI и заставить их установить MSI с преобразованием:
msiexec -i c:\temp\The.msi transforms=c:\temp\YourPerso.mst
Смотреть подробнее здесь: Install a transform using the command line.
Вы видите, что файлы MST используются много в крупных организациях, где все MSI имеют файлы MST с серийными номерами и т. Д.
Чтобы сделать MST-файл, вам необходимо скачать и установить Microsofts Orca Tool, its part of the Microsoft Windows SDK.
Откройте Orca и создайте файл MST из файла MSI. В основном вы открываете файл MSI, переходите к таблице «Свойство», там вы видите список параметров. Примечание. В файле MSI вы увидите параметры, которые требуют значения по умолчанию.
Прежде чем добавлять/изменять параметры, создайте новое преобразование, нажав в меню «Трансформация» -> «Новое преобразование».
После этого вы можете изменить параметры или добавить новые, как вы хотите. Когда вы закончите изменение параметров, используйте функцию «Generate Transform» в меню «Transform», чтобы сгенерировать MST-файл.
Если затем открыть MST-файл с двоичным редактором вы можете увидеть свойство, которое вы только что добавили:
Вы можете отредактировать файл для каждой загрузки, просто редактируя значение , например:
Вы можете из Кур e (и, вероятно, должен) сделать это надлежащим образом с использованием API-интерфейса WindowsInstaller.Installer. Вот пример:
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
Совет: Чтобы сделать это с помощью управляемого кода вы лучше с помощью Microsoft.Deployment.WindowsInstaller.dll
Thats, доступной в рамках http://wix.codeplex.com/
Построить MSI для каждого пользователя :
IMHO было бы намного проще сделать это с помощью Nullsoft (WiX, InstallShield, INNO и т. Д.) и построить MSI для каждого пользователя. Для этого вы должны вставлять уникальный идентификатор пользователя, например, an nsi script и запускать сборку MSI для каждой загрузки. Во время установки уникальный идентификатор пользователя будет храниться в файле, в разделе реестра или т. Д. Я предлагаю вам проделать это с помощью этого NSIS Wizard Editor, чтобы быстро взломать базовый сценарий установки NSI и build the MSI via a command line: makensis.
Примечание: Хотя «Включение идентификатора пользователя в имя файла MSI» проще, чем создание MSI для каждого пользователя, пользователи могут легко изменить имя файла. Его гораздо менее вероятно, что пользователь проверит MSI, используя Orca, чтобы найти встроенный идентификатор пользователя.
Самый простой и логичный путь:
Это легко отправлять события на мой сервер, но как я могу захватить идентификатор пользователя от сервера PHP, так что я могу знать какой пользователь сделал то, что в приложении .NET?
Делайте то, что @WouterHuysentruit рекомендуется @Jhuliano Морено, а затем:
При запуске приложения в первый раз просто сделайте логин пользователя к программе, используя свои учетные данные веб-сайта и записать их идентификатор пользователя в конфиге файл, ключ реестра или запись базы данных. В основном создайте файл cookie, чтобы вы узнали их в следующий раз, когда откроете программу, или сделайте их входе в систему каждый раз.
Я не совсем понял ваш вопрос. Вы хотите включить идентификатор пользователя в установщик MSI, когда пользователь загрузит его? Почему бы вам просто не внедрить систему входа, в которой вы отправляете имя пользователя и пароль на сервер, и отвечает ли пользовательским объектом/идентификатором? –
Все решения, требующие от пользователя ввода информации о запуске приложения и привязки к приложению таким образом, также требуют, чтобы пользователь вводил свои данные во второй раз, что я бы хотел избежать для лучшего UX – yaron
Я терплю неудачу чтобы увидеть, как логин сделает UX хуже ...Что делать, если пользователь хочет выйти или использовать одно и то же приложение, но с другим пользователем? Кроме того, знаете ли вы о безопасности? Вы навсегда будете использовать один и тот же токен/ключ? Что делать, если установка становится скомпрометированной? Будет ли пользователь повторно загружать и переустанавливать ваше приложение? –