// Token: 0x060012B2 RID: 4786 RVA: 0x0003C778 File Offset: 0x0003A978
        internal void StartRunspace(AuthZPluginUserToken userToken)
        {
            string runspaceCacheKey = this.GetRunspaceCacheKey(userToken);

            if (string.IsNullOrEmpty(runspaceCacheKey))
            {
                AuthZLogger.SafeAppendGenericError("NullOrEmptyRunspaceCacheKey", "User token have an empty ExecutingUserName", false);
                return;
            }
            lock (base.InstanceLock)
            {
                RunspaceCacheValue runspaceCacheValue;
                if (this.runspaceCache.TryGetValue(runspaceCacheKey, out runspaceCacheValue))
                {
                    ExTraceGlobals.PublicPluginAPITracer.TraceDebug <string>((long)this.GetHashCode(), "[PswsBudgetManager.StartRunspace] item {0} is removed explicitly", runspaceCacheKey);
                    if (runspaceCacheValue != null && runspaceCacheValue.CostHandle != null)
                    {
                        runspaceCacheValue.CostHandle.Dispose();
                    }
                    this.runspaceCache.Remove(runspaceCacheKey);
                }
                CostHandle         costHandle = this.StartRunspaceImpl(userToken);
                RunspaceCacheValue value2     = new RunspaceCacheValue
                {
                    CostHandle = costHandle,
                    UserToken  = (PswsAuthZUserToken)userToken
                };
                ExTraceGlobals.PublicPluginAPITracer.TraceDebug <string, TimeSpan>((long)this.GetHashCode(), "[PswsBudgetManager.StartRunspace] Add value {0} to runspace cache. Expired time = {1}.", runspaceCacheKey, this.pswsRunspaceCacheTimeout);
                this.runspaceCache.InsertAbsolute(runspaceCacheKey, value2, this.pswsRunspaceCacheTimeout, new RemoveItemDelegate <string, RunspaceCacheValue>(this.OnRunspaceCacheItemExpired));
            }
            ExTraceGlobals.PublicPluginAPITracer.TraceDebug <string>((long)this.GetHashCode(), "[PswsBudgetManager.StartRunspace] Add/Update value {0} to connectedUser cache.", runspaceCacheKey);
            this.connectedUsers.AddOrUpdate(runspaceCacheKey, ExDateTime.Now, (string key, ExDateTime value) => ExDateTime.Now);
            AuthZPluginHelper.UpdateAuthZPluginPerfCounters(this);
        }
예제 #2
0
 private void IncreasePowershellConnections()
 {
     ExTraceGlobals.PublicPluginAPITracer.TraceDebug <string>(0L, "Increase PowershellConnections for {0}.", this.currentAuthZUserToken.UserName);
     if (this.connCounterStatus != ExchangeAuthorizationPlugin.ConnCounterStatus.WaitingIncreasement)
     {
         ExTraceGlobals.PublicPluginAPITracer.TraceError <ExchangeAuthorizationPlugin.ConnCounterStatus>(0L, "Try to increase the powershell connection counter, but connCounterStatus is NOT WaitingIncreasement, instead it is {0}.", this.connCounterStatus);
         this.connCounterStatus = ExchangeAuthorizationPlugin.ConnCounterStatus.Error;
         return;
     }
     this.activeRunSpaceCostHandle = WSManBudgetManager.Instance.StartRunspace(this.currentAuthZUserToken);
     if (this.currentAuthZUserToken.OrgId != null)
     {
         this.tenantActiveRunspaceCostHandle = WSManTenantBudgetManager.Instance.StartRunspace(this.currentAuthZUserToken);
     }
     this.connCounterStatus = ExchangeAuthorizationPlugin.ConnCounterStatus.Increased;
     AuthZLogger.SafeSetLogger(RpsAuthZMetadata.ServerActiveRunspaces, WSManBudgetManager.Instance.TotalActiveRunspaces);
     AuthZLogger.SafeSetLogger(RpsAuthZMetadata.ServerActiveUsers, WSManBudgetManager.Instance.TotalActiveUsers);
     AuthZLogger.SafeSetLogger(RpsAuthZMetadata.UserBudgetOnStart, WSManBudgetManager.Instance.GetWSManBudgetUsage(this.currentAuthZUserToken));
     AuthZLogger.SafeSetLogger(RpsAuthZMetadata.TenantBudgetOnStart, WSManTenantBudgetManager.Instance.GetWSManBudgetUsage(this.currentAuthZUserToken));
     AuthZPluginHelper.UpdateAuthZPluginPerfCounters(WSManBudgetManager.Instance);
 }
예제 #3
0
 private void OnKeyToRemoveBudgetsCacheValueRemoved(string key, string value, RemoveReason reason)
 {
     lock (this.instanceLock)
     {
         if (reason != RemoveReason.Removed)
         {
             ExTraceGlobals.PublicPluginAPITracer.TraceDebug <string, RemoveReason>(0L, "Key {0} is removed from budgets dictionary after timeout. Remove reason = {1}", key, reason);
             if (!BudgetManager.NormalCleanupCacheValue.Equals(value))
             {
                 this.RunspacesLeakDetected(key, value);
             }
             this.budgets.Remove(key);
         }
     }
     if (reason != RemoveReason.Removed)
     {
         this.UpdateBudgetsPerfCounter(this.budgets.Count);
         AuthZPluginHelper.UpdateAuthZPluginPerfCounters(this);
     }
     this.UpdateKeyToRemoveBudgetsPerfCounter(this.keyToRemoveBudgets.Count);
 }
예제 #4
0
 private void DecreasePowershellConnections()
 {
     ExTraceGlobals.PublicPluginAPITracer.TraceDebug <string>(0L, "Decrease PowershellConnections for {0}.", (this.currentAuthZUserToken == null) ? null : this.currentAuthZUserToken.UserName);
     if (this.connCounterStatus != ExchangeAuthorizationPlugin.ConnCounterStatus.Increased)
     {
         ExTraceGlobals.PublicPluginAPITracer.TraceError <ExchangeAuthorizationPlugin.ConnCounterStatus>(0L, "Try to decrease the powershell connection counter, but connCounterStatus is NOT Increased, instead it is {0}.", this.connCounterStatus);
         this.connCounterStatus = ExchangeAuthorizationPlugin.ConnCounterStatus.Error;
         return;
     }
     AuthZPluginHelper.DisposeCostHandleAndSetToNull(ref this.activeRunSpaceCostHandle);
     AuthZPluginHelper.DisposeCostHandleAndSetToNull(ref this.tenantActiveRunspaceCostHandle);
     if (this.currentAuthZUserToken != null)
     {
         WSManBudgetManager.Instance.RemoveBudgetIfNoActiveRunspace(this.currentAuthZUserToken);
         if (this.currentAuthZUserToken.OrgId != null)
         {
             WSManTenantBudgetManager.Instance.RemoveBudgetIfNoActiveRunspace(this.currentAuthZUserToken);
         }
     }
     this.connCounterStatus = ExchangeAuthorizationPlugin.ConnCounterStatus.Decreased;
     AuthZPluginHelper.UpdateAuthZPluginPerfCounters(WSManBudgetManager.Instance);
 }
 // Token: 0x060012B6 RID: 4790 RVA: 0x0003C9FC File Offset: 0x0003ABFC
 private void OnRunspaceCacheItemExpired(string key, RunspaceCacheValue value, RemoveReason reason)
 {
     ExTraceGlobals.PublicPluginAPITracer.TraceDebug <string, RemoveReason>((long)this.GetHashCode(), "[PswsBudgetManager.OnRunspaceCacheItemExpired] item {0} is removed. Reason = {1}", key, reason);
     if (reason != RemoveReason.Removed)
     {
         try
         {
             if (value != null)
             {
                 if (value.CostHandle != null)
                 {
                     value.CostHandle.Dispose();
                 }
                 else
                 {
                     ExTraceGlobals.PublicPluginAPITracer.TraceDebug((long)this.GetHashCode(), "[PswsBudgetManager.OnRunspaceCacheItemExpired] value.CostHandle = null");
                 }
                 if (value.UserToken == null)
                 {
                     ExTraceGlobals.PublicPluginAPITracer.TraceDebug((long)this.GetHashCode(), "[PswsBudgetManager.OnRunspaceCacheItemExpired] value.UserToken = null");
                 }
                 else
                 {
                     base.RemoveBudgetIfNoActiveRunspace(value.UserToken);
                     string     runspaceCacheKey = this.GetRunspaceCacheKey(value.UserToken);
                     ExDateTime exDateTime;
                     if (runspaceCacheKey != null && this.connectedUsers.TryRemove(runspaceCacheKey, out exDateTime))
                     {
                         ExTraceGlobals.PublicPluginAPITracer.TraceDebug <string>((long)this.GetHashCode(), "[PswsBudgetManager.OnRunspaceCacheItemExpired] User {0} is removed from connectedUsers cache.", runspaceCacheKey);
                     }
                 }
             }
         }
         finally
         {
             AuthZPluginHelper.UpdateAuthZPluginPerfCounters(this);
         }
     }
 }