Почему DirectoryEntry.Invoke («SetPassword», значение) вызывает Credential Required CryptoAPI Private Key - PullRequest
0 голосов
/ 27 мая 2019

Недавно я работал над старым кодом, и при тестировании я начал видеть окно «Требуются учетные данные»: «Хотите ли вы, чтобы приложение получило доступ к вашему секретному ключу? Описание ключа: Закрытый ключ CryptoAPI. "

Credential Required: CyrptoAPI Private Key

Это происходит в этой строке кода:

object result = this.m_DirectoryEntry.Invoke(MethodName, Argument);

, где MethodName равно SetPassword.

Нажатие «Не разрешать» все еще позволяет методу продолжить.

Это также происходит, когда я запускаю приложение за пределами Visual Studio.Это не будет приемлемым пользовательским опытом.

Почему это происходит?Как мне это остановить?

Я использую Visual Studio Community 2015 Update 3 на компьютере с Server 2016.В проекте используется .NET 4.5.2.

Код для воссоздания

Новое решение.В свойствах проекта установите для целевой платформы значение .NET Framework 4.5.2.Добавьте ссылку на System.DirectoryServices.

namespace SetPasswordCryptoApiTester1
{
    using System;
    using System.DirectoryServices;

    class Program
    {
        static void Main(string[] args)
        {
            var adsPath = "LDAP://CN=path_to_user";

            using (var de = new DirectoryEntry(adsPath))
            {
                Console.WriteLine("Press a key to set the password...");
                Console.ReadKey(true);

                object result = de.Invoke("SetPassword", "Sausag32");

                Console.WriteLine("Press a key to continue...");
                Console.ReadKey(true);
            }
        }
    }
}

1 Ответ

1 голос
/ 03 июля 2019

Может быть, вы уже работали над этим, но я все равно решил ответить.Хотя я не могу с уверенностью сказать, что происходит.

Это вызывает метод SetPassword на собственном объекте Windows IADsUser.В разделе Замечания к документации описаны 3 способа сброса пароля.Возможно, что один из этих методов вызывает всплывающее окно, и когда вы нажимаете «Не разрешать», он просто переходит к следующему.

Первый, который он использует, - это LDAP через SSL (LDAPS).).Я никогда не видел этого, но может быть что-то странное в настройке LDAPS в вашем домене, где он запрашивает сертификат клиента, может быть?

Вы можете проверить эту теорию ... В PowerShell попробуйте это:

Invoke-WebRequest https://example.com:636

(замените «example.com» на ваше доменное имя) Вы либо получите ошибку сертификата (может быть, это всплывающее окно?), Но если SSL-рукопожатие работает, вы должны получить "Базовое соединение было закрыто ".

Если вы получаете это всплывающее окно при попытке через PowerShell, то я не думаю, что вы можете что-то сделать, если вы не являетесь администратором домена.Что-то должно измениться на контроллере домена.

...