Активный каталог: Система.Пространство имен DirectoryServices. Получение сообщения «Был передан недопустимый путь к каталогу»

#c# #active-directory #ldap

#c# #active-directory #ldap

Вопрос:

Следуя Инструкции: (Почти) Все в Active Directory с помощью C # учебника Я пытаюсь написать фрагмент для добавления пользователей в Active Directory, используя System.DirectoryServices пространство имен, но при каждой попытке я получаю ошибку, указанную в названии.

Как следует из ошибки, я взглянул на то, как было структурировано мое имя пути, но у меня все еще есть сомнения.

Моя цель — добавить нового пользователя и поместить его в группу объявлений. Технически, наши «Группы» на самом деле являются просто Организационными подразделениями в рамках родительского DC.

Наша иерархия объявлений обычно отформатирована таким образом…

Пример AD

Подразделение (Название отдела) > Подразделение (Пользователи) > CN (Пользователь)

Я бы также предположил, что я могу задать определенные свойства пользователю при добавлении его новой учетной записи, хотя я не уверен, каковы ограничения на это.

Ниже приведен код, который я написал. Я просмотрел несколько статей, кроме статьи о проекте Code, но я не уверен, что это просто мое непонимание или что. Конечно, это не так сложно, как я себе представляю. Возможно, я пока недостаточно разбираюсь в рекламе.

 public static string CreateUserAccount()
    {
        try
        {
            DirectoryEntryData newUserADdata = new DirectoryEntryData();
            string oGUID = string.Empty;

            string connectionPrefix = "LDAP://"   "DOMAIN";
            DirectoryEntry dirEntry = new DirectoryEntry(connectionPrefix);
            DirectoryEntry newUser = dirEntry.Children.Add

                // Define directory entry based on Organizational Units and Common Names
                ("CN="   newUserADdata.NewUserFirstName   newUserADdata.NewUserLastName   ", OU = "   newUserADdata.NewUserOrganizationDepartment   ", DC = domain, DC = local", "user");

            // Prepair Data for New Entry

            // Initial Login Information
            newUser.Properties["samAccountName"].Value = newUserADdata.NewUserLoginUserName;                                 // Set Initial Username
            newUser.Invoke("SetPassword", new object[] { newUserADdata.NewUserLoginPassword });                              // Set Initial Password
            newUser.Properties["userPrincipalName"].Value = newUserADdata.NewUserLoginUserName   "@domain.local";            // Principal Name
            newUser.Properties["pwdLastSet"].Value = "0";                                                                    // Set "Password Last Set" property to 0 to invoke a password change upon first login


            // General
            newUser.Properties["givenName"].Value = newUserADdata.NewUserFirstName;                                          // First name
            newUser.Properties["sn"].Value = newUserADdata.NewUserLastName;                                                  // Last Name
            newUser.Properties["displayName"].Value = newUserADdata.NewUserDisplayName;                                      // Display Name
            newUser.Properties["description"].Value = newUserADdata.NewUserDescription;                                      // Description
            newUser.Properties["physicalDeliveryOfficeName"].Value = newUserADdata.NewUserOffice;                            // Office
            newUser.Properties["telephoneNumber"].Value = newUserADdata.NewUserTelephone;                                    // Telephone Number
            newUser.Properties["homeDrive"].Value = newUserADdata.NewUserHomeDriveLetter;                                    // Home Drive Letter (H:)
            newUser.Properties["homeDirectory"].Value = newUserADdata.NewUserHomeDrivePath;                                  // Home Drive Path

            // Telephones
            newUser.Properties["homePhone"].Value = newUserADdata.NewUserTelephoneHome;                                      // Home Phone Number
            newUser.Properties["pager"].Value = newUserADdata.NewUserTelephonePager;                                         // Pager Number
            newUser.Properties["mobile"].Value = newUserADdata.NewUserTelephoneMobile;                                       // Mobile Phone Number
            newUser.Properties["facsimileTelephoneNumber"].Value = newUserADdata.NewUserTelephoneFax;                        // Fax Number
            newUser.Properties["ipPhone"].Value = newUserADdata.NewUserTelephoneIP;                                          // IP Phone Number

            // Address
            newUser.Properties["streetAddress"].Value = newUserADdata.NewUserAddressStreet;                                  // Street
            newUser.Properties["postOfficeBox"].Value = newUserADdata.NewUserAddressPObox;                                   // P.O. Box
            newUser.Properties["l"].Value = newUserADdata.NewUserAddressCity;                                                // City
            newUser.Properties["st"].Value = newUserADdata.NewUserAddressState;                                              // State/Province
            newUser.Properties["postalCode"].Value = newUserADdata.NewUserAddressZipCode;                                    // Zip/Postal Code
            newUser.Properties["c"].Value = newUserADdata.NewUserAddressCountry;                                             // Country/Region Name

            // Organization
            newUser.Properties["title"].Value = newUserADdata.NewUserOrganizationJobTitle;                                   // Job Title
            newUser.Properties["department"].Value = newUserADdata.NewUserOrganizationDepartment;                            // Deparment
            newUser.Properties["company"].Value = newUserADdata.NewUserOrganizationCompany;                                  // Company
            newUser.Properties["manager"].Value = newUserADdata.NewUserOrganizationManagerName;                              // Manager Name



            newUser.CommitChanges();
            oGUID = newUser.Guid.ToString();


            int val = (int)newUser.Properties["userAccountControl"].Value;

            ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
            /// Account Control Flags :: syntax ::  val | hex | hex | and so on...  http://support.microsoft.com/kb/305144
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////

            newUser.Properties["userAccountControl"].Value = val | 512; // Normal User Settings
            newUser.CommitChanges();
            dirEntry.Close();
            newUser.Close();
        }
        catch (System.DirectoryServices.DirectoryServicesCOMException e)
        {
            return "<br /><br /><div class='alert alert-danger'><b><i class='fa fa-exclamation-triangle'></i> An Error has occured:</b> <br /><br />"   e.ToString()   "</div>";

        }
        return "<br /><br /><div class='alert alert-success'><b>Success:<b> <br /><br />The User has been successfully added to Active Directory.</div>";
    }
  

Есть какие-нибудь идеи, как я мог бы заставить это работать?
Я действительно ценю это.


Обновить:


Для тех из вас, кто пришел к этому сообщению в поиске решений AD..

Я выбрал решение, предложенное marc_s. Это значительно упрощает работу и ускоряет разработку. Стоит упомянуть, что свойства класса UserPrincipal немного ограничивают. Решение, которое я нашел для этого, заключается в использовании основных расширений. Это позволит вам добавить дополнительные свойства к классу, которые не включены, такие как, например, physicalDeliveryOfficeName или, возможно facsimileTelephoneNumber , например.

Ответ №1:

Если вы используете .NET 3.5 и выше, вам следует ознакомиться с System.DirectoryServices.AccountManagement (S.DS.AM ) пространство имен. Прочитайте все об этом здесь:

В принципе, вы можете определить контекст домена и легко находить пользователей и / или группы в AD:

 // set up domain context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
    // find a user
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");

    if(user != null)
    {
       // do something here....     
    }

    // add a new user
    UserPrincipal newUser = new UserPrincipal(ctx);

    // set properties
    newUser.givenName = "....";
    newUser.surname = "....";
    .....

    // save new user
    newUser.Save();
}
  

Новый S.DS.AM позволяет действительно легко взаимодействовать с пользователями и группами в AD!

Комментарии:

1. Тогда я, безусловно, прошел бы квалификацию. Я должен это проверить

2. Я искал статьи, посвященные этой теме, но по большей части это были просто вопросы и ответы. Я ценю ваш вклад. Я посмотрю статью и узнаю о реструктуризации моего кода, чтобы соответствовать этому новому пространству имен.