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

2023-11-26

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

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

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

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

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

澄清 -

许多人提出使用登录系统来绑定服务器和应用程序。

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

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

登录 -> 网页 - 注册(确认电子邮件?) - 重定向 - 下载点击 - 运行 - 应用程序登录 - 使用应用程序 (用户需要 60-120 秒)


从程序登录

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

在文件名中包含用户 ID

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

应用程序配置

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

  1. 使用以下命令创建您的 .msiApp.config未压缩,添加具有固定 UUID 的用户 ID 设置。您的 PHP 脚本可以查找 UUID 并将其替换到 .msi 二进制文件中,然后再将其发送给用户。请参阅下面的代码片段MST变换
  2. 通过自定义按需构建 .msiApp.config。仅当您的网络服务器在 Windows 上运行或者您有可以执行此作业的远程 Windows 构建服务器时,此操作才有效。

MST变换

您还可以使用 MST 转换并使用与我在第 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;
?>

序列号

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用用户 ID 参数下载 MSI 安装程序 的相关文章

  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • Laravel 8、Sanctum、Fortify /logout 在 Postman 中抛出“CSRF 令牌不匹配”

    我安装了 L8 Sanctum 和 Fortify 进行身份验证 我以前可以 login 使用了Pre request Script设置X XSRF TOKEN 我什至得到了 api user成功地 但当我这样做时 logout 我在 Po
  • Laravel 5.3:护照实现 - {“error”:“invalid_client”,“message”:“客户端身份验证失败”}

    我按照中提到的确切步骤进行操作Laracast Laravel 5 3 的新增功能 Laravel Passport https laracasts com series whats new in laravel 5 3 episodes
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 通过ajax执行后期操作时如何克服CORS重定向问题?

    我可以通过外部登录表单中的 post 方法类型提交表单来登录 roundcube 实例 托管在另一台服务器上 我收到此错误 通过 ajax 签名时 XMLHttpRequest 无法加载https 192 168 0 7 mail http
  • 与 array_intersect 相反?

    是否有一个内置函数可以获取数组 1 中不存在于数组 2 中的所有成员 我知道如何以编程方式执行此操作 只是想知道是否有一个内置函数可以执行相同的操作 所以请不要提供代码示例 这听起来像是一份工作array diff http www php
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何移动 Zend_Layout 的“视图”

    通常它会是这样的结构 application modules somemodule views scripts index index phtml 我如何将其移动到 application templates somemodule temp
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • Angular 2 Material 日期选择器值

    我想用角度材质日期选择器在我的页面中获取日期 我使用此代码 但无法弄清楚如何正确访问所选值
  • javax.mail.MessagingException:无法连接到 SMTP 主机?

    以下是我发送邮件的代码 import java util Properties import javax mail Authenticator import javax mail Message import javax mail Mess
  • 在数据框中按组折叠文本[重复]

    这个问题在这里已经有答案了 如何在列中按组聚合数据框group并折叠列中的文本text 样本数据 df lt read table header T text group text a a1 a a2 a a3 b b1 b b2 c c1
  • 如何覆盖 WordPress 核心功能?

    这是我第一次接触WordPress 我的任务是把已经定制好的核心功能提取出来 放到一个非核心文件中 以便我们升级时更方便维护 这是其中一种方法的示例wp admin includes template php 原始代码 function m
  • Jsoup 获取部分页面

    我正在尝试抓取投标网站的内容 但无法获取该网站的完整页面 我在 xulrunner 上使用 crowbar 首先获取页面 因为 ajax 以惰性方式加载某些元素 然后从文件中抓取 但在 bidrivals 网站的主页上 即使本地文件格式良好
  • C 字符串库

    是否有一个用于 C 而不是 C 的 C 字符串库 它实现了抽象char and wchar t 字符串 要求是 获得 BSD MIT CDDL 许可证 实现某种引用计数机制 支持正则表达式 有 Unicode 支持 Thanks 关于什么t
  • PHP:从对象中获取数据

    我怎样才能得到user nicename来自这个对象 BP User Object data gt stdClass Object ID gt 1 user login gt NICENICE user pass gt P BwLHvV7z
  • GWT、Google App Engine、TimerTask 或 ServiceImpl 中的线程抛出异常

    我正在使用 GWT 和 Google App Engine 我有一系列记录 我想每 30 分钟更新一次 在里面服务实现我有以下代码 new Timer schedule new TimerTask Override public void
  • 对于密钥 authView,此类不符合键值编码[重复]

    这个问题在这里已经有答案了 当我在模拟器上运行我的应用程序时 它运行良好 当我尝试使用设备时 它不起作用 并且出现以下错误 NOTE 我在代码中没有找到任何类型的 authView 类 2011 02 24 12 04 14 472 Tes
  • boost::asio 从socket读取n个字节到streambuf

    我有一个序列化结构 它是通过套接字发送的 我需要分块读取它 因为它的一个字段包含剩余数据的大小 我需要读取前几个字节 找出长度并读取其余部分 这就是我所得到的 boost asio streambuf buffer boost system
  • 文本区域中的新行字符会增加 C# 中的文本长度

    我的 ASP NET MVC 应用程序中遇到此问题 在我的一个模型中 有一个字段 描述 该字段的数据库列设置为NVarchar 300 在我看来 我正在创建一个文本区域 如下所示 Html TextAreaFor m gt m Descri
  • 不活动后自动关闭工作簿

    我创建了一个宏 可以在一段时间不活动后关闭WB 如果我手动打开文件 它会完美工作 但如果我使用不同 WB 中的另一个宏来打开文件 它不会在设置的不活动时间后自动关闭 我用来自动关闭它的代码是 本工作簿模块 Private Sub Workb
  • 如何在两个单独的步骤中运行 MSVC 预处理器和编译器?

    我想运行 Microsoft Visual Studio 编译器cl exe不调用预处理器 这可能吗 我认为简单地编译预处理的源代码 使用 c标志 将使预处理器以无操作的方式运行 但显然情况并非如此 我做了一些基准测试 这是一个小源文件 m
  • 使用 Rails 3 中的 Devise 显示上次登录的详细信息

    我有一个 Rails 3 应用程序 它使用 Devise 进行身份验证 我想在用户管理表中显示每个用户上次登录的日期和时间 我的应用程序基于以下应用程序 https github com dannymcc rails3 base 我已阅读
  • WPF keyDown 响应时间准确度

    我正在开发一个应用程序 用户可以在其中看到某些内容 并且必须通过单击键盘上的按键来做出反应 反应时间至关重要 越准确越好 我只编写了几行代码来测试默认设置的示例应用程序 inf WPF namespace Test
  • 保存变量值并在页面刷新后检索它[重复]

    这个问题在这里已经有答案了 我将一个字符串值保存到一个变量中 我的网页在某个过程后自动重新加载 我需要知道即使在页面刷新后我是否可以获得该变量中存储的值 我使用 javascript 代码刷新我的网页window location relo
  • 在 WPF 文本块中获取段落的最佳方法是什么? (换行符?)

    我有一些带有 r n 换行符的文本 我想在 WPF 文本块中添加换行符 我尝试将 r n 替换为 不带空格 当我在 XAML 中设置 Text 属性时它起作用 但在从 C 代码隐藏中设置时似乎不起作用 那么 将 WPF 文本块中的 r n
  • mongo组查询如何保留字段

    大家 在 mongo 组查询中 结果仅显示参数中的键 如何像mysql查询组一样保留每个组中的第一个文档 例如 name age sex province city area address ddl1st 22 纯爷们 BeiJing Be
  • 使用 CSS 仅针对 Firefox

    使用条件注释 可以轻松地使用特定于浏览器的 CSS 规则来定位 Internet Explorer 有时 Gecko 引擎 Firefox 会出现问题 使用 CSS 规则仅针对 Firefox 而不是其他浏览器的最佳方法是什么 也就是说 不
  • 如何使用用户 ID 参数下载 MSI 安装程序

    我有一个 NET C 应用程序 包含在 MSI 安装程序中 myprogram exe 我有一个 PHP 网站和一个特定页面 用户可以通过链接下载该程序 我希望能够跟踪 NET 应用程序上的某些事件 例如 程序已打开 将事件发送到我的服务器