【问题标题】:System.DirectoryServices.AccountManagement.PrincipalContext broken after Windows 10 updateWindows 10 更新后 System.DirectoryServices.AccountManagement.PrincipalContext 损坏
【发布时间】:2016-02-16 12:09:00
【问题描述】:

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

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: 系统找不到指定的文件。

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

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

【问题讨论】:

  • 只是说我有同样的问题,我目前正在调查。如果您找到解决方案,请添加更新
  • 我已经用完了我所有的调试知识。该错误似乎发生在 IAds.GetInfo 中,但这是 COM 代码,因此没有可用的源代码。 Process Monitor 没有抛出任何线索,看起来没有任何访问文件的尝试。对我来说发生在两台机器上,我可能不得不回滚到以前的 Windows 10 版本
  • 我放弃了尝试找出导致问题的原因,而是尝试了一种解决方法。当我遇到问题时,我正在使用 Web > 服务器下的 IIS Express 进行调试。我在机器上创建了一个本地站点并将服务器更改为 Local IIS 并将项目 URL 指向它。从那里我能够在没有得到 FileNotFoundException 的情况下进行调试。
  • 很奇怪。我已经在使用本地 IIS,所以这不是我的问题。我会尝试重新创建 IIS 应用程序,看看是否能解决它
  • 我相信是因为在 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.DirectoryServices.AccountManagement 更新后找不到dll .dll - 虽然不确定如何处理该线索..

标签: c# filenotfoundexception principalcontext


【解决方案1】:

在我开始将机器回滚到以前的版本之前的最后一次谷歌,我发现了这个 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 )后,编辑它们的值。您可以分别使用您的用户名和公司名称。

【讨论】:

  • 当原始问题出现时,我在搜索中遇到了这个问题。当时没有这个答案。我会试一试。感谢您引导我回到它。
  • 添加注册表项也为我解决了这个问题。 @Nkosi 只需右键单击注册表编辑器中的 CurrentVersion,然后选择新建 > 字符串值。添加每个条目( RegisteredOwnerRegisteredOrganization )后,编辑它们的值。我分别使用了我的用户名和公司名称。
  • 我不得不在这里问我自己的问题,并多次提出这个问题,然后最后一次搜索让我找到了这个问题和答案。谢谢,我也在考虑重建系统。
  • 虽然这个答案似乎给出了问题的原因,但我认为它作为解决方案没有多大帮助。从开发人员的角度来看,Kris 在下面的回答似乎更有帮助......(他们的问题是这些密钥真的丢失了,还是 64 位应用程序在开发人员不想这样做的情况下错误地访问了 32 位密钥......)
  • 对我们来说,另一个答案肯定行不通,因为我们的应用需要以 32 位运行,因为它使用了一些 32 位 COM 组件
【解决方案2】:

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

Uncheck 'Prefer 32-bit' screenshot

【讨论】:

  • 我不明白为什么这没有更多的选票它比接受的答案要好得多!我是否应该在程序启动的任何地方添加随机注册表项,以便与注册表无关的调用正常工作?
  • @Syberdoor 借调。
  • 某些应用程序无法以 64 位方式运行,因为它们使用的是 64 位应用程序无法使用的本机 32 位 dll
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多