我有一个 Windows 服务(以本地系统用户身份运行),除了检查用户是否属于 WSMA 组外,还需要根据用户名和密码验证用户。我当前的代码是这样的:
var pc = new PrincipalContext(ContextType.Machine);
using (pc)
{
try
{
if (pc.ValidateCredentials(username, password))
{
using (var groupEntry = new DirectoryEntry("WinNT://./WSMA,group"))
{
foreach (object member in (IEnumerable)groupEntry.Invoke("Members"))
{
using (var memberEntry = new DirectoryEntry(member))
{
if (memberEntry.Path.ToLower().EndsWith(username.ToLower()))
{
return new LoginResult{ success = true };
}
}
}
}
}
return new LoginResult{ success = false };
}
catch (PrincipalOperationException poe)
{
if (poe.ErrorCode == -2147023688)
{
return new LoginResult { Success = false, ErrorMessage = "Password expired" };
}
throw poe;
}
}
只要我连接到网络,这一切都可以正常工作,但是如果我拔掉网线,那么 ValidateCredentials 调用会给我以下错误消息:
用户代码未处理的 FileNotFoundException。找不到网络路径。
我想这与 AD 有关,但我只需要检查本地用户,而不是域用户,因此不需要网络访问。
有什么方法可以使用 PrincipalContext 或其他在断开连接的情况下工作的方法?