如何在 Active Directory 用户和组中插入或更新属性
Posted
技术标签:
【中文标题】如何在 Active Directory 用户和组中插入或更新属性【英文标题】:How to insert or update properties in Active Directory Users and Groups 【发布时间】:2017-03-06 08:22:53 【问题描述】:我正在制作一个将源数据同步到 Active Directory 的 Windows 应用程序。
这个应用程序是这样工作的。
选择源数据(部门、用户)
从源数据映射用户或部门属性
应用程序服务运行时,会在 Active Directory 中创建组和用户
它还为用户和组设置属性。
当我尝试设置组或用户属性(属性)时,它会抛出这样的异常消息。
在 DirectoryEntry.CommitChanges();阻止
The directory
service cannot perform the requested operation on the RDN attribute of an object.
我试图解决它,但这对我来说真的很难,因为我不擅长 Active Directory...
代码如下,请分享您的知识。
//ppk: department key column, pk:user key column, row : Source DataTable's row
void CreateADUser(string ppk,string pk,DataRow row)
//password
string pass = GetPass(pk,row,LogSections.AD);
//OU
DirectoryEntry addept = adm.FindOU(ppk);
//principal path
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 of mapped column(AD User attributes)
List<ADMapping> MappingPatterns = GetAdMappings(Words.User,false);
//Columns name of Source Data table's row
var colnames = Tool.GetColNames(row);
//get user proterties
var aduser = adm.GetUser(pk);
//directory entry of users
var de=aduser.GetUnderlyingObject() as DirectoryEntry;
//looping mapped column of user attributes
foreach (var ADMap in MappingPatterns)
string val = ADMap.Mapping;
//mapped columns value
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)
【问题讨论】:
【参考方案1】:我也在其他论坛上问过这个问题,终于明白了。
在DirectoryEntry.CommitChanges();
之前将UserPropertyCache
属性设置为true
并调用RefreshCache
方法。
【讨论】:
【参考方案2】:这里很难看出问题的原因是什么,因为我们没有看到您尝试设置的属性。
也就是说,如果 AD 对象上不存在属性,则不能只添加属性,因此这部分代码肯定存在问题:
if (oDE.Properties.Contains(sPropertyName))
oDE.Properties[sPropertyName].Value = sPropertyValue;
else
//The following line will never work in this context
oDE.Properties[sPropertyName].Add(sPropertyValue);
如果我必须做出有根据的猜测,我会说您要么尝试设置无法设置的属性,要么您添加的用户没有设置所有强制属性。
【讨论】:
以上是关于如何在 Active Directory 用户和组中插入或更新属性的主要内容,如果未能解决你的问题,请参考以下文章
如何将Active Directory ldif文件导入openldap服务器?
Active Directory LDAP 用户输入啥作为用户名来登录 OBIEE 分析?
如何在 Powershell 中模拟 Active Directory 用户?