top of page

Sage 100 "echten" Benutzernamen in AppServer Kontext / "Real" user name in AppServer Context

(alle Versionen/all versions)

Sonntag, 1. Januar 2023

Deutsch


Situation

Code, der in Prozessen des Sage Applikationsservers läuft, hat - je nach Kontext - im Mandantenobjekt in "Benutzer.Name" nicht den "echten" Client-Usernamen stehen.


Mögliche Lösungen

Über den direkten Applikationsserver-Kontext hat man im Mandantenobjekt normalerweise den korrekten Client-Usernamen.

Zusätzlich gibt es die Möglichkeit, an die ursprüngliche Benutzer-Identifikation mit der Kontext-Property "UserID" des Applikationsserver-Context zu gelangen:

var ctx = Sagede.ApplicationServer.OfficeLine.ServiceContext.Current;
 
if ( ctx != null && ctx.ApplicationContext != null )
{
  if ( ctx.ApplicationContext is Sagede.ApplicationServer.OfficeLine.ApplicationContext ctx2 ) return ctx2.UserID;
}

Dies setzt voraus, dass für den laufenden Code der genaue Prozess-Kontext deterministisch ist.

D.h. Code, von dem man weiß, dass dieser 100% ausschließlich im AppServer-Prozess ausgelöst wird, kann wie zuvor gezeigt problemlos an den Benutzernamen kommen.


Hat man dagegen Code in einer DLL, der sowohl von Client-Prozessen als auch AppServer-Prozessen getriggert wird , gibt es mehrere Lösungsansätze , um den Kontext zu bestimmen.

Die offensichtliche Möglichkeit ist natürlich die, der Methode/Klasse den Ausführungskontext aus dem aufrufenden Code jeweils mitzugeben.


Alternativ kann man es auch über die Ermittlung des laufenden Prozesses bestimmen, falls eine klare Übergabe des Benutzernamens an den eigenen Code nicht überall vorgesehen war oder möglich ist.

Nachfolgendes Beispiel zeigt einen möglichen Ansatz dafür.

#region "Fields"
 
/// <summary>
/// The process / domain name of the current environment.
/// </summary>
private static string _processName;
 
#endregion
 
#region "User context"
 
/// <summary>
/// Checks the name of the process for field <see cref="_processName"/>.
/// </summary>
private static void CheckProcessName()
{
  if ( string.IsNullOrWhiteSpace( _processName ) )
  {
    try
    {
      _processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
 
      if ( _processName.Contains( @"\" ) )
      {
        _processName = System.IO.Path.GetFileName( _processName );
      }
    }
    catch
    {
      _processName = "(unknown)";
    }
  }
}
 
/// <summary>
/// Ermittelt den <b>tatsächlichen Benutzernamen</b> im aktuellen Prozess-Kontext.<br />
/// Beispiel: Wenn der aktuelle Prozess eine Sage Applikationsserver-Instanz ist, dann muss der Benutzer auf besondere Weise ermittelt werden!<br/>
/// <br />
/// Gets <b>the real user name</b> in the current process context.<br />
/// Example: If the current process is a Sage ERP application server instance, the user must be determined in a special way!<br/>
/// </summary>
/// <param name="mandator">The Sage ERP mandator instance (German "<c>Mandant</c>").</param>
/// <returns>Real user name or <see cref="string.Empty"/> in case of problems.</returns>
public static string GetRealUserName( Sagede.OfficeLine.Engine.Mandant mandator )
{
  try
  {
    CheckProcessName();
 
    // **SAG_OLCheck_NewVersion** OL90
    if ( _processName.ContainsEnhanced( "Sagede.ApplicationServer" ) )
    {
      var ctx = Sagede.ApplicationServer.OfficeLine.ServiceContext.Current;
 
      if ( ctx != null
           && ctx.ApplicationContext != null )
      {
        if ( ctx.ApplicationContext is Sagede.ApplicationServer.OfficeLine.ApplicationContext ctx2 ) return ctx2.UserID;
      }
    }
 
    if ( mandator != null )
    {
      return mandator.Benutzer.Name;
    }
  }
  catch
  {
    // ignored
  }
 
  return string.Empty;
}
 
#endregion


bottom of page