Как создать или обновить пользовательские атрибуты (свойства) в active directory? С#
Я создаю приложение windows, которое синхронизирует исходные данные с Active Directory.
Это приложение работает следующим образом.
1. Выберите Исходные Данные(Отдел, Пользователь)
2. Пользовательские атрибуты отображения или управления от источника данных
3. Когда служба приложений запущена, она создает группы и пользователей в Active Directory
4.а также он устанавливает атрибуты для пользователей и групп.
Когда я пытаюсь установить атрибуты группы или пользователя (свойства), он выдает сообщение об исключении, подобное этому.
The directory service cannot perform the requested operation on the RDN attribute of an object.
Я пытался решить эту проблему, но мне это очень трудно, потому что я не очень хорошо разбираюсь в Active directory...
Код приведен ниже, пожалуйста, поделитесь своими знаниями.
Что я уже пробовал:
void CreateADUser(string ppk,string pk,DataRow row) { string pass = GetPass(pk,row,LogSections.AD); DirectoryEntry addept = adm.FindOU(ppk); string sOU = adm.GetPrincipalPath(addept); var aduser = adm.CreateNewUser(sOU, pk, pass, pk, null, null, adm.sDomain); SetAdUserProperties(pk, pass, row); MoveUser(ppk,pk); } void SetAdUserProperties(string pk,string pass,DataRow row) { if (row == null) return; List<ADMapping> MappingPatterns = GetAdMappings(Words.User,false); var colnames = Tool.GetColNames(row); var aduser = adm.GetUser(pk); var de=aduser.GetUnderlyingObject() as DirectoryEntry; foreach (var ADMap in MappingPatterns) { string val = ADMap.Mapping; val=Util.ReplaceColPattern(val, row); SetProperty(de, ADMap.CN, val); } if (!string.IsNullOrWhiteSpace(pass)) { var UserPkColumn = AppConfigHelper.GetAppString(Words.SourceUserPKColumn); UserPkColumn = Util.GetActualColName(UserPkColumn); aduser.SetPassword(pass); QueryHelper.Update(QueryHelper.ConnectionString, Words.ShadowUserTable ,new SqlParameter[] { new SqlParameter("@passwd", pass) } , new SqlParameter("@"+UserPkColumn,pk)); } aduser.Save(); } public void SetProperty(DirectoryEntry oDE, string sPropertyName, object sPropertyValue) { if (sPropertyValue != null && !string.IsNullOrWhiteSpace(sPropertyValue.ToString())) { if (oDE.Properties.Contains(sPropertyName)) { oDE.Properties[sPropertyName].Value = sPropertyValue; } else { oDE.Properties[sPropertyName].Add(sPropertyValue); } try { oDE.CommitChanges(); //exception here. oDE.Close(); } catch (Exception) { } } }