ユーザーがグループ WSMA に属しているかどうかを確認するだけでなく、ユーザー名とパスワードに基づいてユーザーを検証する必要がある Windows サービス (ローカル システム ユーザーとして実行) があります。私の現在のコードは次のようなものです:
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 を使用してこれを行う方法、または切断されたシナリオで機能する他の方法はありますか?