これはあなたがやりたいことではない可能性が非常に高いことに注意してください。それでもなお、それを行うためのいくつかの方法を説明します..
MSI で MST ファイルを使用する:
ユーザー ID プロパティを使用して MST ファイルを作成し、ユーザーが msi をダウンロードしてトランスフォームを使用して msi をインストールするときに、ユーザーごとにこれらを生成できます。
msiexec -i c:\temp\The.msi transforms=c:\temp\YourPerso.mst
詳細については、こちらを参照してください:コマンド ラインを使用して変換をインストールします。
MST ファイルは、すべての MSI にシリアル番号などが埋め込まれた MST ファイルがある大規模な組織で多く使用されていました。
MST ファイルを作成するには、Microsoft Windows SDK の一部である Microsoft Orca Toolをダウンロードしてインストールする必要があります。
Orca を開き、MSI ファイルから MST ファイルを作成します。基本的に、MSI ファイルを開き、テーブル "Property" に移動すると、パラメータのリストが表示されます。
MSI ファイルには、デフォルト値を必要とするパラメーターが表示されます。
パラメータを追加/変更する前に、メニューの [Transform] -> [New Transform] をクリックして、新しい Transformation を作成します。

その後、必要に応じてパラメーターを変更したり、新しいパラメーターを追加したりできます。パラメータの変更が完了したら、[Transform] メニューの [Generate Transform] 機能を使用して MST ファイルを生成します。

その後、HexEditor で mst ファイルを開くと、追加したばかりのプロパティが表示されます。

値を編集するだけで、ダウンロードごとにファイルを編集できます。たとえば、次のようになります。

もちろん、WindowsInstaller.Installer の API を使用して、適切な方法でこれを行うことができます (そしておそらくそうすべきです)。次に例を示します。
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
ヒント:マネージ コードでこれを行うには、 http:Microsoft.Deployment.WindowsInstaller.dll
//wix.codeplex.com/ の一部として入手可能なものを使用するのが最善です。
ユーザーごとに MSI を作成します。
Nullsoft (WiX、InstallShield、INNO など)を使用してこれを行い、各ユーザーの MSI を構築する方がはるかに簡単です。これを行うには、一意のユーザー ID をnsi スクリプトなどに埋め込み、ダウンロードごとに MSI ビルドを開始します。インストール中に、一意のユーザー ID がファイル、レジストリ キーなどに保存されます。この NSIS Wizard Editorを使用して、基本的な NSI インストール スクリプトをすばやく作成し、コマンド ラインで MSI をビルドすることをお勧めします: makensis。
注:「MSI ファイル名にユーザー ID を含める」ことは、ユーザーごとに MSI を作成するよりも簡単ですが、ユーザーはファイル名を簡単に変更できます。ユーザーが組み込みのユーザー ID を見つけるために Orca を使用して MSI を監査する可能性は非常に低いです。
最も簡単で論理的な方法:
サーバーにイベントを送信するのは簡単ですが、.NET アプリでどのユーザーが何をしたかを知るために、php サーバーからユーザー ID を取得するにはどうすればよいですか?
@Jhuliano Moreno と @WouterHuysentruit が推奨することを実行します。
アプリケーションを初めて起動するときは、Web サイトの資格情報を使用してユーザーをプログラムにログインさせ、構成ファイル、レジストリ キー、またはデータベース レコードにユーザー ID を記録するだけです。基本的に Cookie を作成して、次回プログラムを開いたときにそれらを認識できるようにするか、毎回ログインさせます。