如何通过指向单个DB的多个实例的代码获取Acumatica实例安装ID

如何通过指向单个DB的多个实例的代码获取Acumatica实例安装ID,acumatica,acumatica-kb,Acumatica,Acumatica Kb,我有3个实例,它们都使用一个DB,我想要所有3个实例的安装ID 我试过这个, PXLicenseHelper.InstallationID 但它只返回当前实例的安装ID PXLicenseHelper.InstallationID 是否有任何方法可以让我一次获得所有3个实例的安装ID。我认为不可能从代码中获得,因为安装ID是基于站点的 您需要从数据库中获取一些信息。您可以尝试查看InstallationID列中的许可表。我假设有3个许可实例,在这个表中有3个许可条目 如果其他人对此有一些信息,我

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

我试过这个, PXLicenseHelper.InstallationID 但它只返回当前实例的安装ID

PXLicenseHelper.InstallationID


是否有任何方法可以让我一次获得所有3个实例的安装ID。

我认为不可能从代码中获得,因为安装ID是基于站点的

您需要从数据库中获取一些信息。您可以尝试查看InstallationID列中的
许可
表。我假设有3个许可实例,在这个表中有3个许可条目


如果其他人对此有一些信息,我很乐意听到。

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

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

  • InstallationIDBase
    是根据
    HostName
    userofprocess
    SiteName
    ApplicationVirtualPath
    计算的,这部分可以从
    pxlicenseheloper
    GetBaseInstallationId
    方法(如下所示)中找到

    //令牌:0x060092DB RID:37595 RVA:0x00290A40文件偏移量:0x0028EC40
    内部静态字符串GetBaseInstallationId(Serilog.ILogger记录器,LogEventLevel)
    {
    字符串hostName=Dns.GetHostName();
    字符串userofprocess=PXInstanceHelper.userofprocess;
    字符串siteName=HostingEnvironment.siteName;
    字符串applicationVirtualPath=HostingEnvironment.applicationVirtualPath;
    string installationIdBase=hostName+userofprocess+siteName+applicationVirtualPath;
    if(logger!=null&&logger.IsEnabled(级别))
    {
    logger.ForContext(“DnsHostName”,hostName,false)。ForContext(“WindowsUser”,userofprocess,false)。ForContext(“SiteName”,SiteName,false)。ForContext(“ApplicationVirtualPath”,ApplicationVirtualPath,false)。Write(级别,“基本安装ID为{BaseInstallationId}”,installationIdBase);
    }
    返回安装数据库;
    }
    
  • 结论是,从技术上讲,如果您为每个实例的IIS应用程序池使用不同的用户,那么获取
    userofprocess
    总是会遇到问题。如果您的所有实例都使用同一个用户,那么差异应该只存在于
    SiteName
    ApplicationVirtualPath
    中,它们不是很重要,可以从
    HostingEnvironment
    中找到


    我希望或者可以为我的答案添加更多细节,或者如果我找错了Acumatica的部分,请纠正我。

    谢谢你的意见Brendan。我尝试使用“许可”表,但没有可用的记录,可能是因为我没有应用任何许可证。任何其他建议都将受到高度赞赏。我不认为会有任何其他东西提供给您安装ID。您可以搜索InstallationID的数据库字段名。仅当实例获得许可时,许可表中才会有记录。在使用生产环境之前,您是否可以在表中添加一些许可证记录,以便在测试时进行模拟?但这是我唯一的猜测,因为看会起作用。谢谢Brendan,我会尝试这个解决方法,看看我会得到什么结果。谢谢Samvel的见解,非常感谢你的投入。我会尽量采纳你的建议,看看我能从中得到什么。
    // 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);
        }
    }
    
    // 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;
    }