我已经看到大量帖子从AD中提取数据,但我需要更新AD并且无法找到我正在寻找的内容。我的公司一直在使用第三方供应商(智能桌)来安置部门,经理和电话等。信息多年。 AD仅用于创建用户名和分配域访问权限。我们知道需要使用智能服务台内的信息更新AD到AD。我已经构建了一个查询来比较AD和智能桌面数据库,并希望获取该查询的结果,其中sn和givenName匹配并更新AD中的Ext。,Dept。等。我认为SSIS包可能是最好的方法,因此我可以将它作为预定的工作,因为我不认为我们将停止使用第三方软件。有没有人对使用SSIS有任何建议,如果是这样,你怎么可能去做。如果不是可以使用什么?
答案 0 :(得分:4)
我最近不得不从数据库中完成类似的任务(插入,更新) Active Directory用户。您可以通过几个选项完成此任务:
使用评论中提及的@billinkc等第三方软件。但是,除了职业选手之外,还有更多的优点。其中大多数都不符合成本效益,而且,它们的限制取决于你可以做什么(如果你不购买源代码)。不建议采取这种方式。
使用SSIS
包可以实现此任务。此technet article说明了如何使用外部源将用户导入Active Directory。 SSIS
包将使用VBA
或C#
中编写的外部脚本。本文中提供的C#
示例是在较早的.NET
库中编写的。它使用DirectoryEntry
类。使用此类没有任何问题,但是,对于.NET 3.5
及更高版本,Microsoft引入了System.DirectoryServices.AccountManagement
,这更易于使用。
使用AccountManagement
命名空间自行编写。听起来并不难。
由于您拥有数据库中的所有用户信息,因此您可以编写将返回用户信息的stored procedure
。
这里有一些适合你的东西。
通过调用stored procedure
从数据库加载用户信息。
public static DataTable GetUserInfoByUsername(string username)
{
//call stor proc to return data
//return datatable or custom class that will hold user iformation
}
编写两个用户Create
和Update
的方法。使用datatable
中的值填充Active Directory中的用户属性。
public static string CreateUser(DataTable dt, string password)
{
//CREATE CONNECTION TO ACTIVE DIRECTORY
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
//CREATE A NEW USERPRINCIPAL OBJECT
using (UserPrincipal principal = new UserPrincipal(ctx))
{
//TODO: you need to populate the below info with values from dt
principal.Enabled = true; //IF NOT ENABLED YOU CAN'T AUTHENTICATE THE USER
principal.UserPrincipalName = username;
principal.Name = "name";
principal.DisplayName = "firstname lastname";
principal.EmailAddress = "email@test.com";
principal.VoiceTelephoneNumber = "12345678910";
principal.GivenName = "firstname";
principal.Surname = "lastname";
principal.SetPassword(password);
try
{
principal.Save();
}
catch(Exception ex)
{
throw;
}
}
}
}
您可以采用类似的方法来更新用户。
public static void UpdateUser(string userName, DataTable dt)
{
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "yourdomain.com"))
{
//you have more than one way to search for a user in AD. Identitype has more choises
using (UserPrincipal principal = UserPrincipal.FindByIdentity(ctx, Identitype.samAccountName, username))
{
if (principal !== null)
//update user properties with data from datatable dt
...
principal.Save();
}
}
}
要记住的事情。默认情况下,UserPrincipal
类不显示每个活动目录属性。获取这些属性的最快方法是使用DirectoryEntry
类。您可以调用GetUnderlyingObject()
的{{1}}方法。
principal
如果您想运行某种工作来执行这些操作,只需让DirectoryEntry de = (principal.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("company"))
string company = de.Properties["company"][0].ToString();
}
返回所有用户并在调用任何这些方法之前使用stored procedure
循环。
我建议您编写一个Windows服务并在那里执行所有这些操作。
*注意代码不完整。根据您的需要,您需要修改代码。**