C# - 无法在Windows 10上使用PrincipalContext(ContextType.Machine):系统找不到指定的文件

时间:2016-01-24 02:02:49

标签: c# windows active-directory

以下适用于Windows的多个服务器版本,以及Windows 7专业版和其他版本,但在Windows 10(至少两台机器)上,我收到错误:“系统找不到指定的文件。\ r \ n”。错误源是“Active Directory”

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

堆栈追踪:

   at System.DirectoryServices.AccountManagement.UnsafeNativeMethods.IADs.Get(String bstrName)
   at System.DirectoryServices.AccountManagement.CredentialValidator.BindSam(String target, String userName, String password)
   at System.DirectoryServices.AccountManagement.CredentialValidator.Validate(String userName, String password)
   at System.DirectoryServices.AccountManagement.PrincipalContext.ValidateCredentials(String userName, String password)
   at IsValidWindowsUser(String userName, String password) in MembershipProvider.cs:line xxx

以下是触发错误所需的最少代码量。在这种情况下,我使用的是ValidateCredentials(),但其他操作(如PrincipalSearches)也会因完全相同的错误而失败。

我已使用LogonUser()验证凭据是否有效; https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184(v=vs.85).aspx

    bool IsValidWindowsUser(string userName, string password)
    {
        using (var p = new PrincipalContext(ContextType.Machine))
            return p.ValidateCredentials(userName, password);
    }

重要位置:我发现这个WAS适用于两个Windows 10系统,但从那时起,两个系统的硬盘都被固态驱动器取代。操作系统移动是使用磁盘映像软件完成的,操作系统上的其他所有操作都完好无损。我知道磁盘/分区签名已更改。这会破坏/损坏凭证商店吗? Windows 7专业版计算机也更换了驱动器,但它仍然按预期工作。

可能相关的另一个老问题是:Validate a users credentials on the local machine

这个问题似乎也与PrincipalContext(ContextType.Machine)讨论了一个FileNotFoundException异常,但前提是没有网络连接。在我的情况下,始终存在网络连接。我会使用LogonUser,但我还需要测试组成员身份。

2 个答案:

答案 0 :(得分:3)

答案是在StackOverFlow上找到的.... System.DirectoryServices.AccountManagement.PrincipalContext broken after Windows 10 update

感谢Doogal

相关位......

  

问题是由于缺少注册表项引起的   HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \微软\的Windows   NT \ CurrentVersion,特别是:RegisteredOwner和   RegisteredOrganization

填充这些键,它应该工作。我甚至不需要重新启动我的应用程序。

在有人问之前,是的,我经常多次搜查......

答案 1 :(得分:1)

取消选中项目属性窗口中“首选32位”复选框,默认情况下会选中它 - 请参阅屏幕截图。这为我修好了!再次选中该复选框将导致您描述的例外重新出现。

Uncheck 'Prefer 32-bit' screenshot