public void Update(UpdateOpContext context) { ExchangeConnector exconn = (ExchangeConnector)context.Connector; ActiveDirectoryConnector adconn = exconn.ActiveDirectoryConnector; adconn.Update(context.UpdateType, context.ObjectClass, context.Uid, context.Attributes, context.Options); }
public void TestContainerChange_account() { ActiveDirectoryConnector connector = new ActiveDirectoryConnector(); connector.Init(ConfigHelper.GetConfiguration()); Uid createOuUid = null; Uid createUserUid = null; try { // create container for this test ICollection<ConnectorAttribute> ouAttributes = GetNormalAttributes_OrganizationalUnit(); createOuUid = CreateAndVerifyObject(connector, ActiveDirectoryConnector.ouObjectClass, ouAttributes); ICollection<ConnectorObject> ouResults = TestHelpers.SearchToList( connector, ActiveDirectoryConnector.ouObjectClass, FilterBuilder.EqualTo(createOuUid)); Assert.AreEqual(1, ouResults.Count); Assert.AreEqual(createOuUid, ouResults.ElementAt(0).Uid); // as a reminder, the uid is the dn for non account objects (idm backward compatiblity) String ouPath = createOuUid.GetUidValue(); // create user ICollection<ConnectorAttribute> userAttributes = GetNormalAttributes_Account(); createUserUid = CreateAndVerifyObject(connector, ObjectClass.ACCOUNT, userAttributes); //now change user container to the newly created one Name createdName = ConnectorAttributeUtil.GetNameFromAttributes(userAttributes); String newName = ActiveDirectoryUtils.GetRelativeName(createdName); newName += ", " + ouPath; ICollection<ConnectorAttribute> updateAttrs = new HashSet<ConnectorAttribute>(); updateAttrs.Add(new Name(newName)); updateAttrs.Add(createUserUid); connector.Update(UpdateType.REPLACE, ObjectClass.ACCOUNT, updateAttrs, null); ICollection<ConnectorObject> results = TestHelpers.SearchToList( connector, ObjectClass.ACCOUNT, FilterBuilder.EqualTo(createUserUid)); Assert.AreEqual(1, results.Count); Assert.AreEqual(createUserUid, results.ElementAt(0).Uid); ConnectorAttribute foundContainerAttr = results.ElementAt(0).GetAttributeByName("ad_container"); Assert.IsNotNull(foundContainerAttr); String lhs = ActiveDirectoryUtils.NormalizeLdapString(ouPath); String rhs = ActiveDirectoryUtils.NormalizeLdapString(ConnectorAttributeUtil.GetStringValue(foundContainerAttr)); Assert.AreEqual(lhs, rhs); } finally { if (createUserUid != null) { //remove the one we created DeleteAndVerifyObject(connector, ObjectClass.ACCOUNT, createUserUid, false, true); } if (createOuUid != null) { //remove the one we created DeleteAndVerifyObject(connector, ActiveDirectoryConnector.ouObjectClass, createOuUid, false, true); } } }
public Uid UpdateReplaceAndVerifyObject(ActiveDirectoryConnector connector, ObjectClass oclass, Uid uid, ICollection<ConnectorAttribute> attributes) { attributes.Add(uid); Filter uidFilter = FilterBuilder.EqualTo(uid); // find the object ... can't update if it doesn't exist ICollection<ConnectorObject> currentConnectorObjects = TestHelpers.SearchToList( connector, oclass, uidFilter); Assert.AreEqual(1, currentConnectorObjects.Count); Uid updatedUid = connector.Update(UpdateType.REPLACE, oclass, attributes, null); Assert.IsNotNull(updatedUid); uidFilter = FilterBuilder.EqualTo(updatedUid); ICollection<ConnectorObject> updatedConnectorObjects = TestHelpers.SearchToList( connector, oclass, uidFilter); Assert.IsTrue(updatedConnectorObjects.Count == 1); VerifyObject(attributes, updatedConnectorObjects.ElementAt(0)); return updatedUid; }
public Uid UpdateAddAndVerifyUser(ActiveDirectoryConnector connector, ObjectClass oclass, Uid uid, ICollection<ConnectorAttribute> attributes, OperationOptions searchOptions) { // find the existing one, and save off all attributes Filter uidFilter = FilterBuilder.EqualTo(uid); ICollection<ConnectorObject> currentObjects = TestHelpers.SearchToList( connector, oclass, uidFilter, searchOptions); Assert.IsTrue(currentObjects.Count == 1); ICollection<ConnectorAttribute> currentAttributes = currentObjects.ElementAt(0).GetAttributes(); // build a list that has the 'added' values added to the existing values ICollection<ConnectorAttribute> comparisonAttributes = new List<ConnectorAttribute>(); foreach (ConnectorAttribute updateAttribute in attributes) { ConnectorAttribute existingAttribute = ConnectorAttributeUtil.Find( updateAttribute.Name, currentAttributes); comparisonAttributes.Add(AttConcat(updateAttribute, existingAttribute)); } // make sure the uid is present in the attributes attributes.Add(uid); // now update with ADD to add additional home phones Uid updatedUid = connector.Update(UpdateType.ADD, oclass, attributes, null); // find it back ICollection<ConnectorObject> updatedObjects = TestHelpers.SearchToList( connector, oclass, uidFilter, searchOptions); Assert.IsTrue(updatedObjects.Count == 1); VerifyObject(comparisonAttributes, updatedObjects.ElementAt(0)); return updatedUid; }
public void TestSync(bool searchChildDomains, String container) { //Initialize Connector ActiveDirectoryConnector connector = new ActiveDirectoryConnector(); ActiveDirectoryConfiguration configuration = (ActiveDirectoryConfiguration)ConfigHelper.GetConfiguration(); configuration.SearchContext = container; configuration.SearchChildDomains = searchChildDomains; connector.Init(configuration); Uid createUid = null; ICollection<Uid> createdUids = new List<Uid>(); try { SyncTestHelper syncHelper = new SyncTestHelper(); // do the first sync //connector.Sync(ObjectClass.ACCOUNT, syncHelper.Token, syncHelper.SyncHandler_Initial, null); syncHelper.Init(connector.GetLatestSyncToken(ObjectClass.ACCOUNT)); ICollection<ConnectorAttribute> attributes = null; // create some users for (int i = 0; i < 10; i++) { attributes = GetNormalAttributes_Account(); createUid = CreateAndVerifyObject(connector, ObjectClass.ACCOUNT, attributes); syncHelper.AddModUid(createUid, attributes); createdUids.Add(createUid); } // sync, and verify connector.Sync(ObjectClass.ACCOUNT, syncHelper._token, syncHelper.SyncHandler_ModifiedAccounts, null); syncHelper.CheckAllSyncsProcessed(); // reset everything syncHelper.Init(connector.GetLatestSyncToken(ObjectClass.ACCOUNT)); // modify a user, then add some users, then modify one of the added users attributes = new List<ConnectorAttribute>(); attributes.Add(createdUids.First()); attributes.Add(ConnectorAttributeBuilder.Build("sn", "replaced")); connector.Update(UpdateType.REPLACE, ObjectClass.ACCOUNT, attributes, null); syncHelper.AddModUid(createdUids.First(), attributes); for (int i = 0; i < 10; i++) { attributes = GetNormalAttributes_Account(); createUid = CreateAndVerifyObject(connector, ObjectClass.ACCOUNT, attributes); syncHelper.AddModUid(createUid, attributes); createdUids.Add(createUid); } attributes = new List<ConnectorAttribute>(); attributes.Add(createdUids.Last()); attributes.Add(ConnectorAttributeBuilder.Build("sn", "replaced")); connector.Update(UpdateType.REPLACE, ObjectClass.ACCOUNT, attributes, null); syncHelper.AddModUid(createdUids.Last(), attributes); // sync, and verify connector.Sync(ObjectClass.ACCOUNT, syncHelper._token, syncHelper.SyncHandler_ModifiedAccounts, null); syncHelper.CheckAllSyncsProcessed(); syncHelper.Init(connector.GetLatestSyncToken(ObjectClass.ACCOUNT)); // delete the user foreach (Uid uid in createdUids) { DeleteAndVerifyObject(connector, ObjectClass.ACCOUNT, uid, false, true); syncHelper.AddDelUid(uid); } // sync and verify connector.Sync(ObjectClass.ACCOUNT, syncHelper._token, syncHelper.SyncHandler_DeletedAccounts, null); syncHelper.CheckAllSyncsProcessed(); createUid = CreateAndVerifyObject(connector, ObjectClass.ACCOUNT, GetNormalAttributes_Account()); syncHelper.AddModUid(createUid, attributes); createdUids.Add(createUid); // now get the latest sync token, and it // should be greater or equal to the last one we saw SyncToken latestToken = connector.GetLatestSyncToken(ObjectClass.ACCOUNT); Assert.Greater(GetUpdateUsnFromToken(latestToken), GetUpdateUsnFromToken(syncHelper._token)); Assert.GreaterOrEqual(GetDeleteUsnFromToken(latestToken), GetDeleteUsnFromToken(syncHelper._token)); } finally { foreach (Uid uid in createdUids) { DeleteAndVerifyObject(connector, ObjectClass.ACCOUNT, uid, false, false); } } }
public void TestRemoveAttributeValue() { ActiveDirectoryConnector connector = new ActiveDirectoryConnector(); connector.Init(ConfigHelper.GetConfiguration()); Uid createUid = null; try { int randomNumber = GetRandomNumber(); ICollection<ConnectorAttribute> attributes = new HashSet<ConnectorAttribute>(); attributes.Add(ConnectorAttributeBuilder.Build( "ad_container", GetProperty(ConfigHelper.CONFIG_PROPERTY_CONTAINER))); attributes.Add(ConnectorAttributeBuilder.Build( "userPassword", "secret")); attributes.Add(ConnectorAttributeBuilder.Build( "sAMAccountName", "nunit" + randomNumber)); attributes.Add(ConnectorAttributeBuilder.Build( "givenName", "nunit")); attributes.Add(ConnectorAttributeBuilder.Build( "sn", "TestUser" + randomNumber)); attributes.Add(ConnectorAttributeBuilder.Build( "displayName", "nunit test user " + randomNumber)); attributes.Add(ConnectorAttributeBuilder.Build( Name.NAME, "cn=nunit" + randomNumber + "," + GetProperty(ConfigHelper.CONFIG_PROPERTY_CONTAINER))); attributes.Add(ConnectorAttributeBuilder.Build( "mail", "nunitUser" + randomNumber + "@some.com")); attributes.Add(ConnectorAttributeBuilder.Build( "otherHomePhone", "512.555.1212", "512.123.4567")); createUid = CreateAndVerifyObject(connector, ObjectClass.ACCOUNT, attributes); ICollection<ConnectorAttribute> modifyAttributes = new HashSet<ConnectorAttribute>(); modifyAttributes.Add(createUid); modifyAttributes.Add(ConnectorAttributeBuilder.Build("otherHomePhone", "512.555.1212")); connector.Update(UpdateType.DELETE, ObjectClass.ACCOUNT, modifyAttributes, null); Filter uidFilter = FilterBuilder.EqualTo(createUid); IList<ConnectorObject> objects = TestHelpers.SearchToList(connector, ObjectClass.ACCOUNT, uidFilter); Assert.AreEqual(1, objects.Count); ConnectorAttribute otherHomePhoneAttr = ConnectorAttributeUtil.Find( "otherHomePhone", objects[0].GetAttributes()); Assert.AreEqual(1, otherHomePhoneAttr.Value.Count); Assert.AreEqual("512.123.4567", ConnectorAttributeUtil.GetSingleValue(otherHomePhoneAttr)); } finally { if (createUid != null) { //remove the one we created DeleteAndVerifyObject(connector, ObjectClass.ACCOUNT, createUid, false, true); } } }
public void Update(UpdateOpContext context) { ExchangeConnector exconn = (ExchangeConnector)context.Connector; ActiveDirectoryConnector adconn = exconn.ActiveDirectoryConnector; // update in AD first var filtered = ExchangeUtility.FilterOut( context.Attributes, PSExchangeConnector.CommandInfo.EnableMailbox, PSExchangeConnector.CommandInfo.EnableMailUser, PSExchangeConnector.CommandInfo.SetMailbox, PSExchangeConnector.CommandInfo.SetMailUser); adconn.Update(context.UpdateType, context.ObjectClass, context.Uid, filtered, context.Options); // retrieve Exchange-related information about the user string query = "(objectGUID=" + ActiveDirectoryUtils.ConvertUIDToSearchString(context.Uid) + ")"; ConnectorObject currentObject = _helper.GetCurrentObject(context, query); ICollection <ConnectorAttribute> attributesForReplace = _helper.DetermineNewAttributeValues(context, currentObject); attributesForReplace = DeduplicateEmailAddresses(context, attributesForReplace); string origRcptType; var newRcptType = _helper.DetermineOrigAndNewAttributeValue(context, currentObject, attributesForReplace, ExchangeConnectorAttributes.AttRecipientType, out origRcptType); if (newRcptType == null) { newRcptType = ExchangeConnectorAttributes.RcptTypeUser; } string origDatabase; var newDatabase = _helper.DetermineOrigAndNewAttributeValue(context, currentObject, attributesForReplace, ExchangeConnectorAttributes.AttDatabase, out origDatabase); // PART 1 - DEALING WITH MailUser CASE if (ExchangeConnectorAttributes.RcptTypeMailUser.Equals(newRcptType)) { // disabling Mailbox if needed if (ExchangeConnectorAttributes.RcptTypeMailBox.Equals(origRcptType)) { Command cmdDisable = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.DisableMailbox, attributesForReplace, context.Uid, exconn.Configuration); cmdDisable.Parameters.Add("Confirm", false); _helper.InvokePipeline(exconn, cmdDisable); } // enabling MailUser if needed if (!ExchangeConnectorAttributes.RcptTypeMailUser.Equals(origRcptType)) { // Enable-MailUser needs the value of ExternalEmailAddress, so we have to get it string origExternalEmailAddress; var newExternalEmailAddress = _helper.DetermineOrigAndNewAttributeValue(context, currentObject, attributesForReplace, ExchangeConnectorAttributes.AttExternalEmailAddress, out origExternalEmailAddress); if (String.IsNullOrEmpty(newExternalEmailAddress)) { throw new InvalidOperationException("Missing ExternalEmailAddress value, which is required for a MailUser"); } ExchangeUtility.SetAttValue(ExchangeConnectorAttributes.AttExternalEmailAddress, newExternalEmailAddress, attributesForReplace); // now execute the Enable-MailUser command Command cmdEnable = ExchangeUtility.GetCommand( PSExchangeConnector.CommandInfo.EnableMailUser, attributesForReplace, context.Uid, exconn.Configuration); _helper.InvokePipeline(exconn, cmdEnable); } // setting MailUser attributes Command cmdSet = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.SetMailUser, attributesForReplace, context.Uid, exconn.Configuration); _helper.InvokePipeline(exconn, cmdSet); } // PART 2 - DEALING WITH UserMailbox CASE else if (ExchangeConnectorAttributes.RcptTypeMailBox.Equals(newRcptType)) { // enable mailbox if necessary // we should execute something like this here: // get-user -identity id|?{$_.RecipientType -eq "User"}|enable-mailbox -database "db" // unfortunately I was not able to get it working with the pipeline... that's why there are two commands // executed :-( // alternatively there can be something like: // get-user -identity id -RecipientTypeDetails User|enable-mailbox -database "db", but we have then trouble // with detecting attempt to change the database attribute if (!ExchangeConnectorAttributes.RcptTypeMailBox.Equals(origRcptType)) { Command cmdEnable = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.EnableMailbox, attributesForReplace, context.Uid, exconn.Configuration); _helper.InvokePipeline(exconn, cmdEnable); } else { // are we trying to update the database? if (newDatabase != null && origDatabase != null && !newDatabase.Equals(origDatabase)) { throw new ArgumentException( context.ConnectorConfiguration.ConnectorMessages.Format( "ex_not_updatable", "Update of [{0}] attribute is not supported", ExchangeConnectorAttributes.AttDatabase)); } } Command cmdSet = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.SetMailbox, attributesForReplace, context.Uid, exconn.Configuration); _helper.InvokePipeline(exconn, cmdSet); } // PART 3 - DEALING WITH User CASE else if (ExchangeConnectorAttributes.RcptTypeUser.Equals(newRcptType)) { if (ExchangeConnectorAttributes.RcptTypeMailBox.Equals(origRcptType)) { Command cmdDisable = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.DisableMailbox, attributesForReplace, context.Uid, exconn.Configuration); cmdDisable.Parameters.Add("Confirm", false); _helper.InvokePipeline(exconn, cmdDisable); } else if (ExchangeConnectorAttributes.RcptTypeMailUser.Equals(origRcptType)) { Command cmdDisable = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.DisableMailUser, attributesForReplace, context.Uid, exconn.Configuration); cmdDisable.Parameters.Add("Confirm", false); _helper.InvokePipeline(exconn, cmdDisable); } else if (ExchangeConnectorAttributes.RcptTypeUser.Equals(origRcptType)) { // if orig is User, there is no need to disable anything } else { throw new InvalidOperationException("Invalid original recipient type: " + origRcptType); } Command cmdSet = ExchangeUtility.GetCommand(PSExchangeConnector.CommandInfo.SetUser, attributesForReplace, context.Uid, exconn.Configuration); _helper.InvokePipeline(exconn, cmdSet); } else { // unsupported rcpt type throw new ArgumentException( context.ConnectorConfiguration.ConnectorMessages.Format( "ex_bad_rcpt", "Recipient type [{0}] is not supported", newRcptType)); } }