none
как изменить CN у IADsUser? RRS feed

  • Вопрос

  • Добрый день!

     

    Мне нужно найти в AD пользователя и изменить у него несколько параметров.. Все ок, но вот поля name, cn изменить не могу, пишет "Служба каталогов не может выполнить операцию на RDN-атрибуте объекта"

     

    Код на Делфи, но думаю, понятно будет

     

    Code Snippet

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Usr: IADsUser;
    begin
        Usr := GetObject('LDAP://CN=SomeUserName,OU=OU1,OU=OU2,DC=domain,DC=local') as IADsUser;
        Usr.Put('CN','AnotherUserName');
        Usr.SetInfo;
    end;

     

     

    Подскажите, как нужно правильно переименовывать пользователя?
    23 января 2009 г. 8:27

Ответы

  • Нет, так не получится. Поле name вообще зависимое поле, и не изменяется самостоятельно, для изменения cn вы должны выполнить операцию переименования/перемещения объекта, используя метод MoveHere

     

    set cont = GetObject("LDAP://dc=dom,dc=com")
    set newobj = cont.MoveHere("LDAP://cn=Jeff Smith,dc=dom,dc=com", "cn=Denise Smith")

     

    PS Вот такой скрипт работает

     

    set cont = GetObject("LDAP://ou=ou1,dc=dom,dc=com")
    cont.MoveHere "LDAP://cn=user101,ou=ou1,dc=dom,dc=com", "cn=user102"

    • Помечено в качестве ответа Vasily GusevModerator 14 октября 2009 г. 9:16
    23 января 2009 г. 8:41
    Модератор
  •  

    все.. я разобрался.. надо так делать

     

    Code Snippet

    Cont := GetObject('LDAP://CN=Users,DC=dom,DC=local') as IADsContainer;
    Usr := Cont.MoveHere('LDAP://CN=Администратор Сайта,CN=Users,DC=dom,DC=local', 'CN=Администратор Сайта 1') as IADsUser;

     

     

    спасибо большое!
    • Помечено в качестве ответа Vasily GusevModerator 14 октября 2009 г. 9:16
    23 января 2009 г. 9:26

Все ответы

  • Нет, так не получится. Поле name вообще зависимое поле, и не изменяется самостоятельно, для изменения cn вы должны выполнить операцию переименования/перемещения объекта, используя метод MoveHere

     

    set cont = GetObject("LDAP://dc=dom,dc=com")
    set newobj = cont.MoveHere("LDAP://cn=Jeff Smith,dc=dom,dc=com", "cn=Denise Smith")

     

    PS Вот такой скрипт работает

     

    set cont = GetObject("LDAP://ou=ou1,dc=dom,dc=com")
    cont.MoveHere "LDAP://cn=user101,ou=ou1,dc=dom,dc=com", "cn=user102"

    • Помечено в качестве ответа Vasily GusevModerator 14 октября 2009 г. 9:16
    23 января 2009 г. 8:41
    Модератор
  • а что потом нужно делать с newobj?

     

    и тип для cont должен быть IADsContainer?

     

    и какого типа должен быть newobj?

    23 января 2009 г. 8:59
  • Хотя и пишу скрипты, но не являюсь специалистом в программировании. Знаю ответ только на второй вопрос - да, это IADsContainer. Посмотрите статью по применению данного метода:

     

    http://msdn.microsoft.com/en-us/library/aa705991.aspx

    23 января 2009 г. 9:05
    Модератор
  •  

    Code Snippet
    Cont := GetObject('LDAP://DC=dom,DC=local') as IADsContainer;
    Usr := Cont.MoveHere('LDAP://CN=Администратор Сайта,CN=Users,DC=dom,DC=local', 'CN=Администратор Сайта 1') as IADsUser;

     

     

    вот так переименовывает нормально, но переносит запись из Users в корневую папку.. а если писать так

     

    Code Snippet
    Cont := GetObject('LDAP://DC=el,DC=loc') as IADsContainer;
    Usr := Cont.MoveHere('LDAP://CN=Администратор Сайта 1,CN=Users,DC=el,DC=loc', 'CN=Администратор Сайта 2,CN=Users') as IADsUser;

     

     

     то выдает ошибку "Произошло нарушение именования"

     

    как правильно переименовать, чтоб запись осталась в том же OU, в котором и была?   
       

    23 января 2009 г. 9:20
  •  

    все.. я разобрался.. надо так делать

     

    Code Snippet

    Cont := GetObject('LDAP://CN=Users,DC=dom,DC=local') as IADsContainer;
    Usr := Cont.MoveHere('LDAP://CN=Администратор Сайта,CN=Users,DC=dom,DC=local', 'CN=Администратор Сайта 1') as IADsUser;

     

     

    спасибо большое!
    • Помечено в качестве ответа Vasily GusevModerator 14 октября 2009 г. 9:16
    23 января 2009 г. 9:26
  • У меня похожая проблема... надо переименовать пользователя ( поле fullname в AD), скрипт VBS ...
    Скрипт переименовывает и поле display name, в соответствии с форматом "Фамилия имя".

    --------------------------------------------------------------------------------------------------------------------------------------

    Set oTargetOU = GetObject("LDAP://"&strTargetOU) //-  strTargetOu берет данные из командной строки
    oTargetOU.Filter = Array("user")

    For each usr in oTargetOU
        if instr(usr.SamAccountName, "$") = 0 then 
            if instr(usr.displayName, ",") = 0 then
                vTempName = usr.get("displayName")
                astrWords = split(vTempName)
                CountWords = UBound(astrWords) - LBound(astrWords) +1
                if CountWords = 2 then
                    vFirst = astrWords(0)
                    vLast = astrWords(1)
                    vFullname = vLast + " " + vFirst
                    usr.put "Sn", vLast
                    usr.put "GivenName", vFirst
                end if
                if CountWords = 3 then
                    vFirst = astrWords(0)
                    vMiddle = astrWords(1)
                    vLast = astrWords(2)
                    vFullname = vLast + " " + vFirst + " " + vMiddle
                    usr.get("displayName")
                    usr.put "Sn", vLast
                    usr.put "GivenName", vFirst
                    usr.put "middleName", vMiddle
                    usr.put "cn", vFullName  // вот с этим проблемы  - Служба каталогов не может выполнить операцию на RDN-атрибуте объекта
                end if
            usr.put "displayName", vFullName
               usr.setinfo
            wscript.echo vFullName
                end if
        end if
    --------------------------------------------------------------------------


    Без попытки переименовать cn все работает.
    Если писать как в примере

    Set cont = GetObject("LDAP://OU=Sales, DC=Fabrikam,DC=com")
    Set usr = cont.MoveHere("LDAP://CN=jeffsmith,OU=Sales, DC=Fabrikam,DC=com", "CN=jayjamison"

    , подставляя свои cn=full name пользователя, ou, dc ,   потом cn="правильное имя пользователя",
    тоже работает, только один раз....

    и не получается написать так, чтобы cn пользователя изменялось, выбираясь из всех пользователей, находящихся в OU и заменялось их же displayname ... Какие только переменные не подставляю :~(


    Если кому-то не сложно, подскажите пожалуйста, как еще можно решить эту проблему ?

    13 октября 2009 г. 9:45
  • usr.put "cn", vFullName  - нельзя выполнять PUT для CN. Этот атрибут - ридонли. Необходимо делать
    MoveHere
    А один раз выполняется - потому что DN объекта после
    MoveHere("LDAP://CN=jeffsmith,OU=Sales, DC=Fabrikam,DC=com", "CN=jayjamison"
    меняется. Его нужно выполнять в последнюю очередь

    Если ответ Вам помог, нажмите на изображение зеленой галочки - «пометить как ответ». Если ответ был для Вас полезен, Вы можете пометить это сообщение как «полезное», нажав на ссылку "проголосовать за полезное сообщение".
    13 октября 2009 г. 10:18
  • Спасибо, но никак не пойму чем (какой переменной?) заменить
    LDAP://CN=<переменная>,OU=Sales, DC=Fabrikam,DC=com", "CN=переменнаяvFullName"
    13 октября 2009 г. 10:45
  • Спасибо, но никак не пойму чем (какой переменной?) заменить
    LDAP://CN=<переменная>,OU=Sales, DC=Fabrikam,DC=com", "CN=переменнаяvFullName"

    http://msdn.microsoft.com/en-us/library/aa705991(VS.85).aspx
    Если ответ Вам помог, нажмите на изображение зеленой галочки - «пометить как ответ». Если ответ был для Вас полезен, Вы можете пометить это сообщение как «полезное», нажав на ссылку "проголосовать за полезное сообщение".
    13 октября 2009 г. 10:49