如何在 Active Directory 用户和组中插入或更新属性
How to insert or update properties in Active Directory Users and Groups
我正在制作一个 windows 将源数据同步到 Active Directory 的应用程序。
这个应用程序是这样工作的。
选择源数据(部门、用户)
从源数据映射用户或部门属性
当应用程序服务为 运行 时,它会在 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)
{
}
}
}
这里很难看出问题的原因是什么,因为我们没有看到您要设置的属性。
就是说,如果您的 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);
}
如果我必须做出有根据的猜测,我会说您正在尝试设置无法设置的属性,或者您要添加的用户没有设置所有强制属性.
这个问题我也在其他论坛问过,终于搞定了
在 DirectoryEntry.CommitChanges();
之前将 UserPropertyCache
属性 设置为 true
并调用 RefreshCache
方法。
我正在制作一个 windows 将源数据同步到 Active Directory 的应用程序。
这个应用程序是这样工作的。
选择源数据(部门、用户)
从源数据映射用户或部门属性
当应用程序服务为 运行 时,它会在 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)
{
}
}
}
这里很难看出问题的原因是什么,因为我们没有看到您要设置的属性。
就是说,如果您的 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);
}
如果我必须做出有根据的猜测,我会说您正在尝试设置无法设置的属性,或者您要添加的用户没有设置所有强制属性.
这个问题我也在其他论坛问过,终于搞定了
在 DirectoryEntry.CommitChanges();
之前将 UserPropertyCache
属性 设置为 true
并调用 RefreshCache
方法。