Plugin mit Systemrechten ausführen

Normalerweise wird ein Plugin unter dem User, der es ausgelöst hat, ausgeführt. Es gibt fälle wo es nützlich sein kann das Plugin mit Systemrechten auszuführen. Z.b. Wenn auf Entitäten zugegriffen werden muss, auf die der Benutzer ausserhalb des Plugins keinen Zugriff haben soll. Behalte aber im Hinterkopf, dass im Audit Log nicht mehr der aktuelle Benutzer angezeigt wird, falls das Plugin mit Systemrechten läuft.

Wie wird es gemacht?

User:

organizationServiceFactory
.CreateOrganizationService(PluginExecutionContext.UserId)

System:

organizationServiceFactory.CreateOrganizationService(null)

Es kann natürlich nützlich sein im selben Plugin beide Möglichkeiten zu haben.
Das ist problemlos möglich. Mein Plugin Kontext bietet deshalb zwei Properties an (Singleton mit Lazy evaluation).
Anmerkung: Das Singleton bezieht sich hier auf den Kontext.

private readonly IOrganizationServiceFactory organizationServiceFactory;

private IOrganizationService organizationServiceSystemImpersonation;
private IOrganizationService organizationService;

/// <summary>
/// Gets a organization service which acts as the current user.
/// </summary>
/// <value>
/// The organization service.
/// </value>
internal IOrganizationService OrganizationService
{
    get
    {
        return organizationService ??
            (organizationService =
            organizationServiceFactory
                .CreateOrganizationService(PluginExecutionContext.UserId));
    }
}

/// <summary>
/// Gets a organization service which acts as system.
/// </summary>
/// <value>
/// The organization service.
/// </value>
internal IOrganizationService OrganizationServiceSystemImpersonation
{
    get
    {
        return organizationServiceSystemImpersonation ??
        (organizationServiceSystemImpersonation =
        organizationServiceFactory
            .CreateOrganizationService(null));
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *