RydenChoi Ответов: 0

Как создать или обновить пользовательские атрибуты (свойства) в 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)
        {   
        }
     }
}

0 Ответов