为什么DirectoryEntry.Invoke(“ SetPassword”,value)触发凭据所需的CryptoAPI私钥

时间:2019-05-27 08:31:37

标签: .net cryptoapi adsi directoryentry

我最近一直在处理一些旧代码,并且在测试时,我开始看到“需要凭据”窗口:“您是否要允许该应用访问您的私钥?密钥描述:CryptoAPI私钥。”

Credential Required: CyrptoAPI Private Key

它发生在以下代码行:

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

其中MethodNameSetPassword

单击“不允许”仍然允许该方法继续。

当我在Visual Studio外部运行应用程序时,也会发生这种情况。这将是无法接受的用户体验。

为什么会这样? 我该如何阻止它?

我在Server 2016机器上使用Visual Studio Community 2015 Update 3。该项目使用.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 个答案:

答案 0 :(得分:1)

也许您已经解决了这个问题,但是我还是想回答。尽管我不能肯定地说出什么事。

这将在本地Windows SetPassword对象上调用IADsUser方法。在Remarks section of the documenation中,它描述了3种尝试重置密码的方法。这些方法之一可能会导致弹出窗口,而当您单击“不允许”时,它将继续前进到下一个。

它使用的第一个是LDAP over SSL(LDAPS)。我从未见过,但是在您的域中可能需要客户端证书的域上设置LDAPS的方式可能有些奇怪?

您可以验证这一理论...在PowerShell中,尝试以下操作:

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

(用您的域名替换“ example.com”),您要么会收到证书错误(也许会弹出相同的消息?),但是如果SSL握手有效,那么您应该会得到“底层连接已关闭”。

如果在尝试通过PowerShell时确实弹出了该窗口,那么除非您是域管理员,否则我认为您无法做任何事情。在域控制器上必须进行一些更改。