C# System.DirectoryServices.AccountManagement.PrincipalContext在Windows 10更新后损坏

C# System.DirectoryServices.AccountManagement.PrincipalContext在Windows 10更新后损坏,c#,filenotfoundexception,principalcontext,C#,Filenotfoundexception,Principalcontext,在过去的几年里,我一直在毫无问题地使用这个小功能来验证用户凭据。createPrincipalContext方法返回带有ContextType.Machine和机器名称的PrincipalContext public static bool ValidateCredentials(字符串用户名、字符串密码、字符串域=null){ 试一试{ 使用(var principalContext=createPrincipalContext(用户名、域)){ username=GetLoginInfo(u

在过去的几年里,我一直在毫无问题地使用这个小功能来验证用户凭据。
createPrincipalContext
方法返回带有
ContextType.Machine
和机器名称的
PrincipalContext

public static bool ValidateCredentials(字符串用户名、字符串密码、字符串域=null){
试一试{
使用(var principalContext=createPrincipalContext(用户名、域)){
username=GetLoginInfo(username);
//验证凭据
if(principalContext.ValidateCredentials(用户名、密码)){
//一旦有效,检查帐户是否已启用
使用(UserPrincipal user=UserPrincipal.FindByIdentity(principalContext,username)){
返回user.Enabled.GetValueOrDefault(false);
}
}
}
}捕获(主操作异常){
跟踪误差(e);
}捕获(例外e){
跟踪误差(e);
}
返回false;
}
我的开发机器最近自动更新到最新版本的Windows 10,从那时起,
principalContext.ValidateCredentials
一直引发以下异常

System.IO.FileNotFoundException:系统找不到指定的文件

除了机器更新之外,没有其他更改。在过去的几天里,我一直在网上搜索可能导致这个问题的原因


有没有人有过识别原因和解决方案(如果可能)的经验?

在我开始将我的机器回滚到以前的版本之前,我找到了最后一个谷歌

该问题是由HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion中缺少注册表项引起的,具体来说是:RegisterDowner和RegisteredOrganization

编辑: 按Windows R并键入regedit.exe来运行注册表编辑器。浏览到上面的位置


只需在注册表编辑器中右键单击CurrentVersion并选择New>String Value。添加每个条目(RegisteredDowner和RegisteredOrganization)后,编辑它们的值。您可以分别使用用户名和公司名称。

取消选中项目“属性”窗口中“生成”选项卡下的“首选32位”复选框,默认选中该复选框-请参见屏幕截图。这个给我修好了!再次选中该复选框将导致您描述的异常重新出现。我猜如果可能的话,这将强制它以64位模式运行,因此使用64位注册表路径而不是WOW6432Node注册表路径,因此它将找到所需的正确键


尝试将您的构建平台目标更改为“AnyCPU”,我发现如果我的平台目标是x86,我就有这个问题


为什么,却不知道,好像赢了10只虫子

只是说我有同样的问题,我目前正在调查。如果您找到解决方案,请添加更新。我已经用光了这方面的所有调试知识。错误似乎发生在IAds.GetInfo中,但这是COM代码,因此没有可用的源代码。Process Monitor不会提供任何线索,看起来也不会有人试图访问文件。对我来说,如果发生在两台机器上,我可能不得不回滚到以前的Windows 10构建。我放弃了试图找出问题的原因,而是尝试了一种解决方法。当我遇到问题时,我正在Web>服务器下使用IIS Express进行调试。我在机器上创建了一个本地站点,将服务器更改为本地IIS,并将项目Url指向它。从那以后,我就可以在没有得到FileNotFoundException.wird的情况下进行调试了。我已经在使用本地IIS,所以这不是我的问题。我将尝试重新创建IIS应用程序,看看这是否修复了itI,我认为这是因为在C:\Program Files(x86)更新后找不到dll\参考Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.DirectoryServices.AccountManagement.dll-但不确定如何处理该线索..当原始问题出现时,我在搜索中遇到了这个问题。当时没有这个答案。我要试一试。谢谢你指导我回到它。添加注册表项也为我解决了这个问题@在注册表编辑器中右键单击CurrentVersion并选择New>String Value。添加每个条目(RegisteredDowner和RegisteredOrganization)后,编辑它们的值。我分别使用了我的用户名和公司名称。我不得不在这里问我自己的问题,并多次戳这个问题,最后一次搜索让我找到了这个问题和答案。谢谢,我也在考虑重建系统。虽然这个答案似乎给出了问题的原因,但我觉得它对解决问题没有多大帮助。从开发人员的角度来看,Kris下面的答案似乎更有帮助。。。(还有一个问题是,这些密钥是否真的丢失了,或者64位应用程序是否在开发人员不愿意的情况下错误地访问了32位密钥…)对于我们来说,另一个答案肯定不起作用,因为我们的应用程序需要以32位运行,因为它使用了一些32位COM组件。我不明白为什么这没有更多的选票。这是比公认的答案好得多的答案!我是否应该在程序启动的任何地方添加随机注册表项,以便与注册表无关的调用正常工作?@Syberdoor Seconded。有些应用程序不能以64位运行,因为它们使用本机32位DLL,而这些DLL不能作为64位应用程序使用