我正在为我工作的公司创建一个ActiveDirectory管理工具包。
在编写函数以使用System.DirectoryServices.AccountManagement读取和处理组成员资格及其附加的嵌套组时,我会抛出一个奇怪的异常。
这是代码:
var nestedgroups = user.GetAuthorizationGroups();
var groups = user.GetGroups();
try
{
foreach(Principal p in groups)
{
foreach(Principal np in nestedgroups)
{
if (p.Equals(np))
{
np.Delete();
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
nestedgroups
表示UserPrincipal.GetAuthorizationGroups();
groups
表示UserPrincipal.GetGroups();
功能的目的是从nestedgroups
中删除groups
中已存在的所有主体。这样做是为了提高进一步处理和输出分配给相关用户的组的性能。
if-block的条件为真,因此针对当前由foreach循环处理的Principal的Principal.Delete();
应该执行得非常好。
这就是问题的起点。一旦Delete() - 函数运行,它就会抛出以下异常:
Exception thrown: 'System.DirectoryServices.AccountManagement.PrincipalOperationException' in System.DirectoryServices.AccountManagement.dll
System.DirectoryServices.AccountManagement.PrincipalOperationException: A device attached to the system is not functioning.
当代码继续运行时,Principal不会从集合中删除(纠正我,如果这是不正确的措辞)。
我已将此异常提供给谷歌,但没有任何成功。
如果您能为我提供有关如何处理/避免此错误的个人经验的更多资源或提示,我将非常高兴。
答案 0 :(得分:0)
创建新列表并在返回之前将有效条目添加到该列表中。原始列表不必变异