我最近一直在处理一些旧代码,并且在测试时,我开始看到“需要凭据”窗口:“您是否要允许该应用访问您的私钥?密钥描述:CryptoAPI私钥。”
它发生在以下代码行:
object result = this.m_DirectoryEntry.Invoke(MethodName, Argument);
其中MethodName
是SetPassword
。
单击“不允许”仍然允许该方法继续。
当我在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);
}
}
}
}
答案 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时确实弹出了该窗口,那么除非您是域管理员,否则我认为您无法做任何事情。在域控制器上必须进行一些更改。