Использование DirectorySearcher.FindAll () в WinPE приводит к COMException 0x80005000 - PullRequest
0 голосов
/ 01 июля 2019

У меня есть написанное на 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 я получаю следующее исключение:

enter image description here

Я также пытался изменить

var username = "redacted";

до

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

без эффекта.

Как я уже говорил, это скорее проблема с WinPE, чем с моим кодом, и, если необходимо, я могу удалить это и сделать репост на соответствующем сайте, но если у кого-то будет больше опыта написания приложений для WinPE, любое руководство будет с благодарностью.

...