public void Create(CreateOpContext context) { ExchangeConnector exconn = (ExchangeConnector)context.Connector; ActiveDirectoryConnector adconn = exconn.ActiveDirectoryConnector; context.Uid = adconn.Create(context.ObjectClass, context.Attributes, context.Options); }
public void Create(CreateOpContext context) { ExchangeConnector exconn = (ExchangeConnector)context.Connector; ActiveDirectoryConnector adconn = exconn.ActiveDirectoryConnector; context.Uid = adconn.Create(context.ObjectClass, context.Attributes, context.Options); }
public void Create(CreateOpContext context) { ExchangeConnector exconn = (ExchangeConnector)context.Connector; Command cmdNew = ExchangeUtility.GetCommand( new PSExchangeConnector.CommandInfo(GetNewCommandName()), context.Attributes, exconn.Configuration); try { context.Uid = _helper.InvokePipelineAndGetGuid(exconn, cmdNew); } catch (ProxyAddressExistsException e) { // This is a tricky exception. Sometimes when creating an object that is already there (e.g. DistributionGroup), // PowerShell reports "ProxyAddressExists" instead of something like "ObjectExists" :( // So we have to distinguish these situations somehow... Name nameAttribute = ConnectorAttributeUtil.GetNameFromAttributes(context.Attributes); if (nameAttribute == null || nameAttribute.Value == null || nameAttribute.Value.Count() != 1) { LOGGER.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "ProxyAddressExistsException reported; but no single-valued NAME attribute present -- reporting as is"); throw new ConnectorException(e.Message, e); } String name = (String)nameAttribute.Value[0]; LOGGER.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "ProxyAddressExistsException reported; trying to see if object named " + name + " exists"); Command cmdGet = ExchangeUtility.GetCommand( new PSExchangeConnector.CommandInfo(GetGetCommandName()), exconn.Configuration); cmdGet.Parameters.Add("Identity", name); ICollection <PSObject> objects; try { objects = _helper.InvokePipeline(exconn, cmdGet); } catch (ObjectNotFoundException e1) { objects = null; } if (objects == null || objects.Count == 0) { LOGGER.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "...it does not -- reporting as is"); throw new ConnectorException(e.Message, e); } else { LOGGER.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "...it exists -- reporting as AlreadyExistsException"); throw new AlreadyExistsException(e.Message, e); } } if (ExecuteSetAfterNew()) { Command cmdSet = ExchangeUtility.GetCommand( new PSExchangeConnector.CommandInfo(GetSetCommandName()), context.Attributes, context.Uid, exconn.Configuration); try { _helper.InvokePipeline(exconn, cmdSet); } catch { // TODO rollback // rethrow original exception throw; } } }
public void CreateMain(CreateOpContext context) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); GetHandler(context).Create(context); LOG.Info("Exchange.Create method exiting, took {0} ms", stopWatch.ElapsedMilliseconds); }
public void CreateMain(CreateOpContext context) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); GetHandler(context).Create(context); LOGGER_API.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "Exchange.Create method exiting, took {0} ms", stopWatch.ElapsedMilliseconds); }
public void Create(CreateOpContext context) { ExchangeConnector exconn = (ExchangeConnector)context.Connector; Command cmdNew = ExchangeUtility.GetCommand( new PSExchangeConnector.CommandInfo(GetNewCommandName()), context.Attributes, exconn.Configuration); try { context.Uid = _helper.InvokePipelineAndGetGuid(exconn, cmdNew); } catch (ProxyAddressExistsException e) { // This is a tricky exception. Sometimes when creating an object that is already there (e.g. DistributionGroup), // PowerShell reports "ProxyAddressExists" instead of something like "ObjectExists" :( // So we have to distinguish these situations somehow... Name nameAttribute = ConnectorAttributeUtil.GetNameFromAttributes(context.Attributes); if (nameAttribute == null || nameAttribute.Value == null || nameAttribute.Value.Count() != 1) { LOGGER.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "ProxyAddressExistsException reported; but no single-valued NAME attribute present -- reporting as is"); throw new ConnectorException(e.Message, e); } String name = (String) nameAttribute.Value[0]; LOGGER.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "ProxyAddressExistsException reported; trying to see if object named " + name + " exists"); Command cmdGet = ExchangeUtility.GetCommand( new PSExchangeConnector.CommandInfo(GetGetCommandName()), exconn.Configuration); cmdGet.Parameters.Add("Identity", name); ICollection<PSObject> objects; try { objects = _helper.InvokePipeline(exconn, cmdGet); } catch (ObjectNotFoundException e1) { objects = null; } if (objects == null || objects.Count == 0) { LOGGER.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "...it does not -- reporting as is"); throw new ConnectorException(e.Message, e); } else { LOGGER.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "...it exists -- reporting as AlreadyExistsException"); throw new AlreadyExistsException(e.Message, e); } } if (ExecuteSetAfterNew()) { Command cmdSet = ExchangeUtility.GetCommand( new PSExchangeConnector.CommandInfo(GetSetCommandName()), context.Attributes, context.Uid, exconn.Configuration); try { _helper.InvokePipeline(exconn, cmdSet); } catch { // TODO rollback // rethrow original exception throw; } } }
/// <summary> /// Implementation of CreateOp.Create /// </summary> /// <param name="oclass">Object class</param> /// <param name="attributes">Object attributes</param> /// <param name="options">Operation options</param> /// <returns>Uid of the created object</returns> public Uid Create(ObjectClass oclass, ICollection <ConnectorAttribute> attributes, OperationOptions options) { const string operation = "Create"; ExchangeUtility.NullCheck(oclass, "oclass", this._configuration); ExchangeUtility.NullCheck(attributes, "attributes", this._configuration); LOG.Info("Exchange.Create method for {0}; attributes:\n{1}", oclass.GetObjectClassValue(), CommonUtils.DumpConnectorAttributes(attributes)); String database = (String)ExchangeUtility.GetAttValue("Database", attributes); LOG.Info("Database attribute before plugins call: " + database); plugins.OnBeforeCreate(oclass, attributes, options, _configuration); database = (String)ExchangeUtility.GetAttValue("Database", attributes); LOG.Info("Database attribute after plugins call: " + database); CreateOpContext context = new CreateOpContext() { Attributes = attributes, Connector = this, ConnectorConfiguration = this._configuration, ObjectClass = oclass, OperationName = operation, Options = options }; try { _scripting.ExecutePowerShell(context, Scripting.Position.BeforeMain); if (!_scripting.ExecutePowerShell(context, Scripting.Position.InsteadOfMain)) { CreateMain(context); } _scripting.ExecutePowerShell(context, Scripting.Position.AfterMain); return(context.Uid); } catch (Exception e) { LOG.Error(e, "Exception while executing Create operation: {0}"); throw; } }
/// <summary> /// Implementation of CreateOp.Create /// </summary> /// <param name="oclass">Object class</param> /// <param name="attributes">Object attributes</param> /// <param name="options">Operation options</param> /// <returns>Uid of the created object</returns> public Uid Create(ObjectClass oclass, ICollection <ConnectorAttribute> attributes, OperationOptions options) { const string operation = "Create"; ExchangeUtility.NullCheck(oclass, "oclass", this._configuration); ExchangeUtility.NullCheck(attributes, "attributes", this._configuration); LOGGER_API.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "Exchange.Create method for {0}; attributes:\n{1}", oclass.GetObjectClassValue(), CommonUtils.DumpConnectorAttributes(attributes)); CreateOpContext context = new CreateOpContext() { Attributes = attributes, Connector = this, ConnectorConfiguration = this._configuration, ObjectClass = oclass, OperationName = operation, Options = options }; try { _scripting.ExecutePowerShell(context, Scripting.Position.BeforeMain); if (!_scripting.ExecutePowerShell(context, Scripting.Position.InsteadOfMain)) { CreateMain(context); } _scripting.ExecutePowerShell(context, Scripting.Position.AfterMain); return(context.Uid); } catch (Exception e) { LOGGER.TraceEvent(TraceEventType.Error, CAT_DEFAULT, "Exception while executing Create operation: {0}", e); throw; } }
public void Create(CreateOpContext context) { context.Attributes = DeduplicateEmailAddresses(context, context.Attributes); // get recipient type string rcptType = ExchangeUtility.GetAttValue(ExchangeConnectorAttributes.AttRecipientType, context.Attributes) as string; if (rcptType == null || rcptType.Equals("")) { rcptType = ExchangeConnectorAttributes.RcptTypeUser; } ExchangeConnector exconn = (ExchangeConnector)context.Connector; ActiveDirectoryConnector adconn = exconn.ActiveDirectoryConnector; PSExchangeConnector.CommandInfo cmdInfoEnable = null; PSExchangeConnector.CommandInfo cmdInfoSet = null; switch (rcptType) { case ExchangeConnectorAttributes.RcptTypeMailBox: cmdInfoEnable = PSExchangeConnector.CommandInfo.EnableMailbox; cmdInfoSet = PSExchangeConnector.CommandInfo.SetMailbox; break; case ExchangeConnectorAttributes.RcptTypeMailUser: cmdInfoEnable = PSExchangeConnector.CommandInfo.EnableMailUser; cmdInfoSet = PSExchangeConnector.CommandInfo.SetMailUser; break; case ExchangeConnectorAttributes.RcptTypeUser: break; default: throw new ArgumentException( context.ConnectorConfiguration.ConnectorMessages.Format( "ex_bad_rcpt", "Recipient type [{0}] is not supported", rcptType)); } // first create the object in AD ICollection <ConnectorAttribute> adAttributes = ExchangeUtility.FilterOut(context.Attributes, PSExchangeConnector.CommandInfo.EnableMailbox, PSExchangeConnector.CommandInfo.SetMailbox, PSExchangeConnector.CommandInfo.EnableMailUser, PSExchangeConnector.CommandInfo.SetMailUser); Uid uid = adconn.Create(context.ObjectClass, adAttributes, context.Options); if (rcptType == ExchangeConnectorAttributes.RcptTypeUser) { // AD account only, we do nothing context.Uid = uid; return; } // add a empty "EmailAddresses" attribute if needed (address policy is disabled and no addresses are provided) ICollection <ConnectorAttribute> enhancedAttributes; ConnectorAttribute policyEnabledAttribute = ConnectorAttributeUtil.Find(ExchangeConnectorAttributes.AttEmailAddressPolicyEnabled, context.Attributes); if (policyEnabledAttribute != null && ConnectorAttributeUtil.GetBooleanValue(policyEnabledAttribute).HasValue&& ConnectorAttributeUtil.GetBooleanValue(policyEnabledAttribute).Value == false && ConnectorAttributeUtil.Find(ExchangeConnectorAttributes.AttPrimarySmtpAddress, context.Attributes) == null && ConnectorAttributeUtil.Find(ExchangeConnectorAttributes.AttEmailAddresses, context.Attributes) == null) { enhancedAttributes = new HashSet <ConnectorAttribute>(context.Attributes); enhancedAttributes.Add(ConnectorAttributeBuilder.Build(ExchangeConnectorAttributes.AttEmailAddresses)); LOGGER.TraceEvent(TraceEventType.Verbose, CAT_DEFAULT, "Added empty EmailAddresses attribute because address policy use is disabled and no addresses were provided"); } else { enhancedAttributes = context.Attributes; // no change } // prepare the command Command cmdEnable = ExchangeUtility.GetCommand(cmdInfoEnable, enhancedAttributes, uid, (ExchangeConfiguration)context.ConnectorConfiguration); Command cmdSet = ExchangeUtility.GetCommand(cmdInfoSet, enhancedAttributes, uid, (ExchangeConfiguration)context.ConnectorConfiguration); try { _helper.InvokePipeline(exconn, cmdEnable); _helper.InvokePipeline(exconn, cmdSet); } catch { LOGGER.TraceEvent(TraceEventType.Information, CAT_DEFAULT, "Rolling back AD create for UID: " + uid.GetUidValue()); // rollback AD create try { adconn.Delete(context.ObjectClass, uid, context.Options); } catch { LOGGER.TraceEvent(TraceEventType.Warning, CAT_DEFAULT, "Not able to rollback AD create for UID: " + uid.GetUidValue()); // note: this is not perfect, we hide the original exception throw; } // rethrow original exception throw; } context.Uid = uid; }