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!!!
过去几年我一直在使用这个小功能来验证用户凭据,没有任何问题。 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!!!