#c# #active-directory #ldap
#c# #active-directory #ldap
Вопрос:
Следуя Инструкции: (Почти) Все в Active Directory с помощью C # учебника Я пытаюсь написать фрагмент для добавления пользователей в Active Directory, используя System.DirectoryServices
пространство имен, но при каждой попытке я получаю ошибку, указанную в названии.
Как следует из ошибки, я взглянул на то, как было структурировано мое имя пути, но у меня все еще есть сомнения.
Моя цель — добавить нового пользователя и поместить его в группу объявлений. Технически, наши «Группы» на самом деле являются просто Организационными подразделениями в рамках родительского DC.
Наша иерархия объявлений обычно отформатирована таким образом…
Подразделение (Название отдела) > Подразделение (Пользователи) > 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 ) пространство имен. Прочитайте все об этом здесь:
- Управление участниками безопасности каталога в .NET Framework 3.5
- Документы MSDN в системе.DirectoryServices.Управление учетными записями
В принципе, вы можете определить контекст домена и легко находить пользователей и / или группы в 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. Я искал статьи, посвященные этой теме, но по большей части это были просто вопросы и ответы. Я ценю ваш вклад. Я посмотрю статью и узнаю о реструктуризации моего кода, чтобы соответствовать этому новому пространству имен.