我正在使用.NET 4.5中的System.DirectoryServices.AccountManagement
创建帐户并在其上设置属性。其中一个要求是从模板帐户复制组成员身份(包括主要组)。该代码包括以下内容:
foreach (var group in userPrincipal.GetGroups()) {
var groupPrincipal = (GroupPrincipal) @group;
if (groupPrincipal.Sid != templatePrimaryGroup.Sid) {
groupPrincipal.Members.Remove(userPrincipal);
groupPrincipal.Save();
}
}
大约90%的时间都有效。其余时间,它失败了:
<{1>}来电{p>。我的猜测是,在我下次访问之前,用户没有完全创建某种竞争条件。我从诊断日志记录中知道每次我都要使用相同的域控制器(它使用相同的
System.DirectoryServices.DirectoryServicesCOMException was unhandled HResult=-2147016656 Message=There is no such object on the server.
Source=System.DirectoryServices ErrorCode=-2147016656 ExtendedError=8333 ExtendedErrorMessage=0000208D: NameErr: DSID-03100213, problem 2001 (NO_OBJECT), data 0, best match of: 'OU=Whatever,DC=domain,DC=local`
GetGroups
以符合我的预期)所以这不是复制问题。
我的猜测准确吗?有没有一个好方法来处理这个?我可以投入一个PrincipalContext
,但这似乎是一个最好的警察,最糟糕的是脆弱。那么正确的做法是什么?
答案 0 :(得分:1)
尝试类似:
int maxWait = 120;
int cnt = 0;
bool usable = false;
while (usable == false && cnt < maxWait)
{
try
{
foreach (var group in userPrincipal.GetGroups())
{
var groupPrincipal = (GroupPrincipal)@group;
if (groupPrincipal.Sid != templatePrimaryGroup.Sid)
{
groupPrincipal.Members.Remove(userPrincipal);
groupPrincipal.Save();
}
}
usable = true;
break;
}
catch
{
System.Threading.Thread.Sleep(500);
}
}
if (usable)
//All okay
;
else
//Do something
;
这样你可以尝试“一段时间”。如果它运行良好,如果不执行记录错误之类的操作,那么以后可以运行fix-it脚本。