c# - 如何使用用户 ID 参数下载 MSI 安装程序

标签 c# php .net installation msitransform

我有一个 .NET C# 应用程序,封装在 MSI 安装程序中 - “myprogram.exe”。我有一个 PHP 网站和一个特定页面,用户可以在其中通过链接下载程序。

我希望能够跟踪 .NET 应用程序上的某些事件。例如 - “程序已打开”。

将事件发送到我的服务器很容易,但是我如何从 php 服务器获取用户 ID,这样我才能知道哪个用户在 .NET 应用程序上做了什么?

我考虑过将参数(用户 ID)传递给 MSI 安装程序,但找不到方法。

如何在 PHP 用户 ID 和 .NET 应用程序之间建立链接?

澄清 -

许多人提出使用登录系统在服务器和应用程序之间进行绑定(bind)。

这确实是最简单的解决方案,但在我的网站上,我不会强制用户登录才能下载应用程序(我也不会在 .NET 应用程序中请求登录详细信息 - 它是可选的)。如果我们不必询问登录详细信息,我认为我们不应该这样,用户体验会好得多(使用该应用程序的步骤要少得多)- 用户下载和使用桌面应用程序的机会更大。

考虑当前流程是 -> 网页 - 下载点击 - 运行 - 使用应用 (需要 10 秒)

用登录->网页-注册(确认邮箱?)-重定向-下载点击-运行-app登录-使用app (用户需要 60-120 秒)

最佳答案

从程序登录

最好的方法是让用户使用您程序中的相同凭据登录。这样,您的程序就可以使用安全的 OAuth2 身份验证与您的后端 API 进行通信。这也让用户清楚地知道该程序正在与互联网通信。

在文件名中包含用户 ID

另一种方法是在下载过程中将用户 ID 添加到安装程序的文件名中,并在安装程序运行时将其解压缩。您将必须检查您的安装程序工具是否允许这样做。此外,仅当您的用户 ID 是 UUID 或类似的东西时才这样做,因为您不希望用户猜测其他 ID。

App.config

第三种选择是将用户 ID 添加到 App.config 文件中。有两种方法可以做到这一点:

  1. 使用未压缩的 App.config 创建您的 .msi,添加具有固定 UUID 的用户 ID 设置。您的 PHP 脚本可以查找 UUID 并将其替换为 .msi 二进制文件,然后再将其发送给用户。请参阅MST 转换
  2. 下的代码片段
  3. 使用自定义 App.config 按需构建 .msi。这仅在您的网络服务器在 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;
?>

序列号

我能想到的最后一种方法是让程序在第一次启动时询问序列号,让您的网站为每个用户生成一个唯一的序列号。

关于c# - 如何使用用户 ID 参数下载 MSI 安装程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164471/

相关文章:

c# - 如何在新线程上运行任务并立即返回给调用者?

c# - 如何从 C# 中的 pdf 中提取图像?

c# - 方法未从任务委托(delegate)中调用

php - PDO 语句比 MySQL CLI 长 400 倍

php - 动态添加的表单字段未显示在发布的数据中

.net - Azure Blob 存储的逻辑应用触发器不起作用

c# - 在 WPF 应用程序中使用 Xbox 360 Controller

c# - Visual Studio 2010 的精度问题

javascript - 如何使文本框可点击

.net - Linq To SQL : Retain list order when using . 包含