我有一个编写的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中,我得到以下异常:
我也尝试过改变
var username = "redacted";
到
var username = @"somecompany.com\redacted";
没有效果。
正如我之前所说,这可能是WinPE的问题,而不是我的代码,如果有必要,我可以删除此问题并在适当的站点上重新发布,但是如果有人有更多的WinPE编写应用程序经验,则可以非常感谢。