Единственная возможная причина, по которой я могу догадаться, это то, что ctr.ctrid
- это null
или какой-то странный тип, с которым он не может справиться. Но сообщение об ошибке исключения подтвердит, что, если вы можете поделиться этим.
Но некоторые другие комментарии:
Mysearcher.SearchScope = SearchScope.Subtree;
Subtree
по умолчанию, поэтому вам не нужно установить его, если вы этого хотите.
centerDe.Properties[ "UserPropertyCache" ].Value = true;
UserPropertyCache
не является атрибутом AD. Я думаю, что вы пытаетесь использовать UsePropertyCache
(обратите внимание, без "r") свойство DirectoryEntry
, и в этом случае вы сделаете это:
centerDe.UsePropertyCache = true;
Но true
по умолчанию в любом случае, так что вам не нужно это делать.
Тогда это:
centerDe.RefreshCache();
Вызов RefreshCache()
сообщает go в AD и получить каждый атрибут для объекта. То же самое происходит, когда вы читаете атрибут, используя Properties
в первый раз, и атрибут еще не находится в кэше. Вы можете сказать ему, чтобы он извлекал только те атрибуты, которые вы действительно хотите просмотреть, выполнив следующее:
centerDe.RefreshCache(new [] { "telexNumber", "centerCode" });
Это скажет, что он будет извлекать только эти два атрибута.
Однако вы не ' Т даже нужно сделать это. Все, что вы делаете, это добавляете новое значение, так что вам все равно, что там уже есть.
Я вижу, что вы переключаетесь между .Value =
и .Add()
в зависимости от того, есть ли значение уже там, но вам не нужно. Вы можете просто использовать .Add()
, и это добавит значение, есть ли что-то уже там или нет.
И тогда есть это:
catch ( Exception ex )
{
throw;
}
Есть ли причина для этого? Как таковой, нет никакого смысла иметь блок try / catch, если вы только собираетесь его сбросить.
Вы также можете немного упростить свой код, используя continue
оператор.
Вот ваш код со всеми моими рекомендациями:
private void buttonfixCenters_Click( object sender, EventArgs e )
{
string adConnStr = ConfigurationSettings.AppSettings["DeUrl"];
string adServerUser = ConfigurationSettings.AppSettings["DeAcct"];
string adServerPassword = ConfigurationSettings.AppSettings["DePwd"];
string adServerContainer = ConfigurationSettings.AppSettings["AD_DomainOu"];
// looks like this: "DC=AD,DC=MyDomain,DC=org"
if( !string.IsNullOrEmpty( adConnStr ) && !string.IsNullOrEmpty(adServerUser) && !string.IsNullOrEmpty(adServerPassword) && !string.IsNullOrEmpty(adServerContainer) )
{
string adName = textBox_adname_unlock.Text;
try
{
DirectoryEntry startSearch = new DirectoryEntry( adConnStr, adServerUser, adServerPassword );
foreach ( Center ctr in CenterListFromCdss )
{
DirectorySearcher Mysearcher;
if ( startSearch == null )
{
throw new Exception( "No root in BuildDirectoryEntry(...)" );
}
Mysearcher = new DirectorySearcher( startSearch );
Mysearcher.Filter = "(&(objectCategory=organizationalUnit)(ou=" + ctr.shname + "))";
SearchResult result = Mysearcher.FindOne();
if ( result == null) continue;
DirectoryEntry centerDe = result.GetDirectoryEntry();
centerDe.Properties[ "telexNumber" ].Add( ctr.ctrid.ToString() );
centerDe.Properties[ "centerCode" ].Add( ctr.ctrCode.ToString() );
centerDe.CommitChanges();
centerDe.Close();
}
}
catch (Exception ex)
{
MessageBox.Show( "Exception: " + ex.ToString() );
}
}
}
Это, вероятно, все еще вызовет исключение на .Add( ctr.ctrid )
, но вам придется поделиться тем, что ошибка сообщение, прежде чем я могу помочь с этим.