1

ユーザーがグループ 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 を使用してこれを行う方法、または切断されたシナリオで機能する他の方法はありますか?

4

1 に答える 1

2

ユーザーをログオンする方法は次のとおりです (したがって、有効なユーザー/パスであることを確認します): MSDN リンク

ローカルアカウントを使用している場合、これは切断されていても機能するはずです

于 2012-05-24T06:36:16.420 に答える