11

MSIインストーラー「myprogram.exe」内にラップされた.NET C#アプリケーションがあります。PHP Web サイトと、ユーザーがリンク経由でプログラムをダウンロードできる特定のページがあります。

.NET アプリで特定のイベントを追跡できるようにしたいと考えています。例 - 「プログラムが開かれました」。

サーバーにイベントを送信するのは簡単ですが、.NET アプリでどのユーザーが何をしたかを知るために、php サーバーからユーザー ID を取得するにはどうすればよいですか?

MSI インストーラーに引数 (ユーザー ID) を渡すことを考えましたが、その方法が見つかりませんでした。

PHP ユーザー ID と .NET アプリをリンクするにはどうすればよいですか?

説明 -

多くの人が、ログイン システムを使用してサーバーとアプリをバインドすることを提案しました。

これは確かに最も簡単な解決策ですが、私の Web サイトでは、アプリをダウンロードするためにユーザーにログインを強制しません (.NET アプリでログインの詳細を要求することもありません - オプションです)。ログインの詳細を尋ねる必要がなければ、そうすべきではないと思います。ユーザーのエクスペリエンスははるかに良くなります (アプリを使用するための手順がはるかに少なくなります)。ユーザーがデスクトップ アプリをダウンロードして使用する機会が増えます。

現在の流れは -> ウェブページ - ダウンロードをクリック - 実行 - アプリを使用 (10 秒かかります)

ログイン -> Web ページ - 登録 (メールを確認しますか?) - リダイレクト - ダウンロード クリック - 実行 - アプリ ログイン - アプリの使用 (ユーザーの場合、60 ~ 120 秒かかります)

4

3 に答える 3

10

プログラムからログイン

最善の方法は、ユーザーがプログラムで同じ資格情報を使用してサインインできるようにすることです。このようにして、プログラムは安全な OAuth2 認証を使用してバックエンド API と通信できます。これにより、プログラムがインターネットと通信していることをユーザーに透過的にすることもできます。

ファイル名にユーザー ID を含める

もう 1 つの方法は、ダウンロード中にインストーラーのファイル名にユーザー ID を追加し、インストーラーの実行時にそれを抽出することです。インストーラ ツールでこれが許可されているかどうかを確認する必要があります。また、ユーザー ID が UUID または同様のものである場合にのみ、これを行ってください。ユーザーに他の ID を推測させたくないからです。

App.config

3 番目のオプションは、ユーザー ID をApp.configファイルに追加することです。これを行うには、次の 2 つの方法があります。

  1. 非圧縮で.msi を作成App.configし、固定 UUID でユーザー ID 設定を追加します。PHP スクリプトは、ユーザーに送信する前に、UUID を検索して .msi バイナリに置き換えることができます。MST 変換の下のコード スニペットを参照してください
  2. カスタム .msi をオンデマンドでビルドしますApp.config。これは、Web サーバーが Windows で実行されている場合、またはこのジョブを実行できるリモート Windows ビルド サーバーがある場合にのみ機能します。

MST 変換

また、MST 変換を使用して、App.configのポイント 1 で説明したのと同じバイナリ置換トリックを使用することもできます。

どちらのオプションでも、バイナリセーフ関数を使用してインストーラーの値を置き換え、ファイルをダウンロードとしてユーザーに送信する PHP スクリプトを使用できます。

<?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;
?>

シリアルナンバー

私が考えることができる最後の方法は、最初の起動時にプログラムにシリアル番号を要求させ、Web サイトで各ユーザーに固有のシリアル番号を生成させることです。

于 2015-08-25T21:42:30.317 に答える
7

これはあなたがやりたいことではない可能性が非常に高いことに注意してください。それでもなお、それを行うためのいくつかの方法を説明します..

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 を作成して、次回プログラムを開いたときにそれらを認識できるようにするか、毎回ログインさせます。

于 2015-08-26T03:11:22.080 に答える