1

我有 3 个实例,它们都使用一个数据库,我想要所有 3 个实例的安装 ID。

我已经尝试过 PXLicenseHelper.InstallationID 但它仅返回当前实例的安装 ID。

PXLicenseHelper.InstallationID

有什么方法可以让我一次获得所有 3 个实例的安装 ID。

4

2 回答 2

1

在对此安装 ID 进行了一些研究后,我得出以下结论:

  1. Acumatica 是基于InstallationIDBase+的计算安装 ID PXDatabase.Provider.SchemaCache.DatabaseName。这可以从 PXDBFeaturedAccessProvider 的安装 ID 属性 getter(如下所示)中看到。

    // Token: 0x170019A8 RID: 6568
    // (get) Token: 0x06008B0D RID: 35597 RVA: 0x0026A52C File Offset: 0x0026872C
    public override byte[] InstallationID
    {
        get
        {
            return PXCriptoHelper.CalculateSHA(PXLicenseHelper.InstallationIdBase + PXDatabase.Provider.SchemaCache.DatabaseName);
        }
    }
    
  2. InstallationIDBase是根据 、 、 和 计算的,HostNameUserOfTheProcess部分SiteName可以ApplicationVirtualPathPXLicenseHelperGetBaseInstallationId方法中找到(如下图)。

    // Token: 0x060092DB RID: 37595 RVA: 0x00290A40 File Offset: 0x0028EC40
    internal static string GetBaseInstallationId(Serilog.ILogger logger, LogEventLevel level)
    {
        string hostName = Dns.GetHostName();
        string userOfTheProcess = PXInstanceHelper.UserOfTheProcess;
        string siteName = HostingEnvironment.SiteName;
        string applicationVirtualPath = HostingEnvironment.ApplicationVirtualPath;
        string installationIdBase = hostName + userOfTheProcess + siteName + applicationVirtualPath;
        if (logger != null && logger.IsEnabled(level))
        {
            logger.ForContext("DnsHostName", hostName, false).ForContext("WindowsUser", userOfTheProcess, false).ForContext("SiteName", siteName, false).ForContext("ApplicationVirtualPath", applicationVirtualPath, false).Write<string>(level, "Base installation ID is {BaseInstallationId}", installationIdBase);
        }
        return installationIdBase;
    }
    

UserOfTheProcess结论是,从技术上讲,如果您为每个实例使用不同的用户用于 IIS 应用程序池,那么您总是会遇到问题。如果您的所有实例都使用同一个用户,那么区别应该只在SiteNameApplicationVirtualPath不是那么重要,可以从HostingEnvironment.

如果我正在寻找 Acumatica 的错误部分,我希望HB_AcumaticaRuslanDev可以为我的答案添加更多细节或纠正我。

于 2019-08-08T21:48:00.147 回答
0

我认为代码不可能,因为安装 ID 是基于站点的。

您将需要数据库中的某些内容来为您提供该信息。您可以尝试查看LicensingInstallationID 列中的表格。我假设使用 3 个许可实例,您将在此表中有 3 个许可条目。

如果其他人有这方面的一些信息,我很想听听。

于 2019-08-08T13:09:07.493 回答