[英]How to insert or update properties in Active Directory Users and Groups
我正在制作一個Windows應用程序,將源數據同步到Active Directory。
此應用程序的工作原理如下。
選擇源數據(部門,用戶)
從源數據映射用戶或部門屬性
運行應用程序服務時,它將在Active Directory中創建組和用戶
並且還將屬性設置為用戶和組。
當我嘗試設置組或用戶的attribute(properties)時,它會拋出這樣的異常消息。
在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();
之前DirectoryEntry.CommitChanges();
將UserPropertyCache
屬性設置為true
並調用RefreshCache
方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.