У меня есть написанное на C # приложение, которое по существу очищает номер служебного тега, чтобы сгенерировать имя для записи в Unattend.xml, который вводится при развертывании Windows. Одной из функций, запрошенных нашими специалистами, является возможность автоматического удаления компьютеров из Active Directory, содержащих этот номер тега службы. Тем не менее, я получаю исключение, которое кажется настолько общим, насколько это возможно.
Существует довольно много вопросов, нацеленных на это сообщение об ошибке и на класс DirectorySearcher, но большинство из них относятся к приложениям ASP.Net и / или WCF, поэтому ответы либо А) уже присутствуют в моем коде; или Б) не имеет отношения к моей среде.
Метод в приведенном ниже коде работает в 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 Enterprise, однако внутри WinPE я получаю следующее исключение:
Я также пытался изменить
var username = "redacted";
до
var username = @"somecompany.com\redacted";
без эффекта.
Как я уже говорил, это скорее проблема с WinPE, чем с моим кодом, и, если необходимо, я могу удалить это и сделать репост на соответствующем сайте, но если у кого-то будет больше опыта написания приложений для WinPE, любое руководство будет с благодарностью.