34

在过去的几年里,我一直在使用这个小功能来验证用户凭据,没有任何问题。该createPrincipalContext方法返回一个PrincipalContextwithContextType.Machine和机器名称。

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;
}

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

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

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

有没有人在确定可能是什么原因以及可能的解决方案方面有任何经验?

4

3 回答 3

50

在我开始将我的机器回滚到以前的版本之前的最后一个谷歌,我发现了这个 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,然后选择新建 > 字符串值。添加每个条目( RegisteredOwner 和 RegisteredOrganization )后,编辑它们的值。您可以分别使用您的用户名和公司名称。

于 2015-11-24T16:10:02.320 回答
14

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

取消选中“首选 32 位”屏幕截图

于 2016-03-17T07:18:56.203 回答
2

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

为什么,但不知道,似乎是赢 10 错误!

于 2016-04-24T07:38:51.373 回答