在WinPE中使用DirectorySearcher.FindAll()会导致COMException 0x80005000

时间:2019-07-01 14:51:11

标签: c# comexception winpe directorysearcher

我有一个编写的C#应用​​程序,该应用程序实质上会刮擦服务标签号以生成要写入部署Windows时注入的Unattend.xml的名称。我们的技术人员要求的功能之一是能够从Active Directory中自动删除包含该服务标签号的计算机。但是,我遇到了一个异常,该异常似乎与您可能会得到的一样普遍。

有很多针对该错误消息和DirectorySearcher类的问题,但是大多数问题都引用了ASP.Net和/或WCF应用程序,因此答案要么是A)我的代码中已经存在;要么是或B)与我的环境无关。

下面的代码中的方法可以在Windows内正常运行,因此我感觉这可能是WinPE依赖项,可能需要移至SuperUser或ServerFault(以任何一种为准)。

代码如下:

public static void RemovePCsFromAD(string searchFor)
{
    List<string> pcList = new List<string>();
    var username = "redacted";
    var password = "redacted";
    var domain = new DirectoryEntry("LDAP://somecompany.com/DC=somecompany,DC=com",username,password);
    var search = new DirectorySearcher(domain);
    search.PropertiesToLoad.Add("name");
    search.Filter = "(&(objectClass=Computer)(name=*" + searchFor + "*))";
    search.Sort = new SortOption("name", SortDirection.Ascending);

    using (SearchResultCollection allThePCs = search.FindAll())
    {
        if (allThePCs != null)
        {
            foreach (SearchResult result in allThePCs)
            {
                pcList.Add(result.Properties["name"][0].ToString());
            }

            DialogResult ShouldIDelete = MessageBox.Show("The following PCs with service tag \"" + searchFor + "\" "were found in AD:" + Environment.NewLine + Environment.NewLine +
                pcList.ToString() + Environment.NewLine + Environment.NewLine +
                "Do you want to delete them from active directory?", "Your attention is required", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);

            if (ShouldIDelete == DialogResult.Yes)
            {
                PrincipalContext pContext = new PrincipalContext(ContextType.Domain);
                foreach (var pc in pcList)
                {
                    ComputerPrincipal computer = ComputerPrincipal.FindByIdentity(pContext, pc);
                    if (computer != null)
                    {
                        computer.Delete();
                    }
                }
            }
        }
    }
}

这在Windows 10企业版中非常有效,但是在WinPE中,我得到以下异常:

enter image description here

我也尝试过改变

var username = "redacted";

var username = @"somecompany.com\redacted";

没有效果。

正如我之前所说,这可能是WinPE的问题,而不是我的代码,如果有必要,我可以删除此问题并在适当的站点上重新发布,但是如果有人有更多的WinPE编写应用程序经验,则可以非常感谢。

0 个答案:

没有答案