根据 MS 文档 SystemIdentification.GetSystemIdForPublisher 应该为同一台计算机返回相同的 Id,只要发布者相同。
文档: 此方法返回的标识符特定于当前设备上的应用发布者。
该ID具有以下特征:
每个系统都是唯一的 在任何特定系统上,同一发布者的所有应用程序都将获得该 ID 的相同值(对于所有用户)。相反,同一系统上不同发行商的应用程序将获得不同的ID。 可以离线创建 在 Windows 重新启动、重新安装和升级后仍然存在,包括全新安装(请参阅下文了解例外情况) 在大多数硬件修改中仍然存在 在 OneCore 中可用
我使用 .NET 8 创建了不同的解决方案和应用程序,并且尝试了不同的方法,但 ID 仍然相同。
1- csproj 文件中的 Spesify 公司属性。
2- 使用两个不同的代码签名证书对 exe 文件进行签名。
3- 创建 assembly.cs 文件并在其中创建 Spesify Company 属性。
代码示例
SystemIdentificationInfo systemIdentificationInfo = SystemIdentification.GetSystemIdForPublisher();
WSIBuffer hardwareId = systemIdentificationInfo.Id;
byte[] hash = SHA256.HashData(hardwareId.ToArray());
string hexString = BitConverter.ToString(hash).Replace("-", "").ToUpper();
我已经使用不同的控制台和 WPF 应用程序对其进行了测试。
是否有另一种方法可以在 .NET 8 应用程序中指定发布者 ID?
我应该提到我需要将它与 WPF 应用程序一起使用
我已经找到了答案,我将把它留在这里,以供将来可能遇到同样问题的人使用。
首先,我试图找到一种方法来获取每台机器特定的 HWID。
我遇到了可以使用 GetPackageSpecificToken 获取的 ASHWID,但是,当我尝试使用它时抛出错误,经过一些研究和测试,我发现它用于 UWP,但即使你使用 Microsoft.工具包.Uwp NuGet,它仍然会抛出错误,直到我发现它意味着属于应用程序包一部分的应用程序。
后来我发现SystemIdentificationInfo对我来说确实有用,但是,即使在我尝试了上面问题中提到的所有解决方案之后,ID始终是相同的。
直到我发现这张我丢失的纸条。
注意
系统标识字符串是使用调用应用程序的 发布者 ID 和从系统派生的标识符 固件/硬件。 系统标识字符串将是相同的 对于所有未打包的 (Win32) 应用程序和所有打包的应用程序,没有 发布者 ID。
经过一些测试后的最终结论是,即使它可以在常规未打包(Win32)应用程序上运行,但您的发布者信息来自应用程序包,因此您的应用程序仍将被视为无发布者 当您使用该方法而不将应用程序打包到应用程序包中时。
对我来说,使用 Windows 应用程序打包项目打包我的应用程序确实有效。
另一个解决方案是,您可以使用自己的逻辑来混淆结果,以便为自己的应用程序拥有自己唯一的 HWID。