我有一个 .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
文件中。有两种方法可以做到这一点:
- 使用未压缩的
App.config
创建您的 .msi,添加具有固定 UUID 的用户 ID 设置。您的 PHP 脚本可以查找 UUID 并将其替换为 .msi 二进制文件,然后再将其发送给用户。请参阅MST 转换 下的代码片段
- 使用自定义
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/