System.DirectoryServices.AccountManagement.PrincipalContext Windows 10 次更新后损坏

System.DirectoryServices.AccountManagement.PrincipalContext broken after Windows 10 update

过去几年我一直在使用这个小功能来验证用户凭据,没有任何问题。 createPrincipalContext 方法 returns a PrincipalContext with ContextType.Machine and the machine name.

public static bool ValidateCredentials(string username, string password, string domain = null) {
    try {
        using (var principalContext = createPrincipalContext(username, domain)) {
            username = GetLoginInfo(username).Username;
            // validate the credentials
            if (principalContext.ValidateCredentials(username, password)) {
                //once valid check if account is enabled
                using (UserPrincipal user = UserPrincipal.FindByIdentity(principalContext, username)) {
                    return user.Enabled.GetValueOrDefault(false);
                }
            }
        }
    } catch (PrincipalOperationException e) {
        traceError(e);
    } catch (Exception e) {
        traceError(e);
    }
    return false;
}

我的开发机器最近自动更新到最新版本Windows10,从那以后,principalContext.ValidateCredentials一直抛出以下异常。

System.IO.FileNotFoundException: The system cannot find the file specified.

除了机器更新外,没有其他任何改变。我最近几天一直在网上搜索可能导致问题的原因。

有没有人有确定可能的原因以及可能的解决方案的经验?

最后 Google 在我开始将我的机器回滚到以前的版本之前我发现了这个 https://connect.microsoft.com/IE/feedback/details/1904887/windows-10-insider-preview-build-10565

此问题是由于 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion 中缺少注册表条目引起的,特别是:RegisteredOwner 和 RegisteredOrganization

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

只需右键单击注册表编辑器中的 CurrentVersion,然后 select 新建 > 字符串值。添加每个条目(RegisteredOwner 和 RegisteredOrganization)后编辑它们的值。您可以分别使用您的用户名和公司名称。

取消选中 Prefer 32-bit 项目属性 window 选项卡下的复选框,它由默认 - 见截图。这为我修好了!再次选中该复选框将导致您描述的异常重新出现。我猜这会在可能的情况下强制它在 64 位模式下 运行,因此使用 64 位注册表路径而不是 WOW6432Node 注册表路径,因此它将找到它需要的正确键。

Uncheck 'Prefer 32-bit' screenshot

尝试将您的 构建平台目标更改为 "AnyCPU",我发现如果我的平台目标是 x86,我就会遇到这个问题!

为什么,还不知道,好像win 10有bug!!!