Проблемы с .net ValidateCredentials, вызывающим исключение для любого пользователя кроме Администратора - PullRequest
2 голосов
/ 10 ноября 2011

У меня есть следующие настройки.

Сервер Windows 2008, который НЕ является частью домена, но на нем сконфигурировано много пользователей локально (мы не используем активный каталог).У меня есть приложение, работающее на другом компьютере (в настоящее время Windows XP) в сети (также не являющееся частью домена), которое должно проверить, есть ли у пользователя действительные учетные данные на нашем сервере 2008 года.

Я пробовал кучуразличных комбинаций, но не может заставить вещи работать и не хватает вещей, чтобы попробовать.В настоящее время я запускаю следующий код и не могу понять, почему он работает только для пользователя с правами администратора.

PrincipalContext pc = new PrincipalContext(ContextType.Machine, "machineName");
//returns true
bool test1 = pc.ValidateCredentials("Administrator", "aValidPassword");
//returns false
bool test2 = pc.ValidateCredentials("Administrator", "anInvalidPassword");
//throws an exceptoin for any valid username/password combination I send
bool test3 = pc.ValidateCredentials("anotherUser", "aValidPassword");

Приведенный выше код работает правильно при попытке подтвердить администратор, но если я пытаюсь проверить ЛЮБОЙдругой пользователь на этой машине получает следующее исключение:

System.UnauthorizedAccessException: General access denied error
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)

Я должен также упомянуть, что «anotherUser» также является администратором на сервере 2008 года.Почему только пользователь с правами администратора может быть проверен?Я пробовал несколько разных учетных записей без прав администратора, и ни одна из них не работает.Я точно знаю, что имя пользователя / пароль, которые я использую, является действительным и что пользователи не отключены или что-то в этом роде.Мне не повезло в поиске решения, возможно, потому что это должно быть так просто, я должен упустить что-то явно очевидное ... Любая помощь будет принята с благодарностью.

(Отредактировано, чтобы добавить следующий абзац)

Я до сих пор не разобрался в этой проблеме, но думал, что последую в надежде, что кто-нибудь поможет, я в растерянности.Это очень странно, что происходит.Я смотрю на Просмотр событий-> Журналы Windows-> Безопасность, чтобы увидеть, поможет ли это указать на проблему.Странно то, что в этих журналах все сообщается об успехе и проблем не указано.Несмотря на это, я все еще получаю UnauthorizedAccessException с сообщением «Ошибка общего доступа запрещена» на моем клиенте C #.Я также заметил, что источником исключения является «Active Directory», несмотря на тот факт, что мы не используем активный каталог (сервер даже не входит в домен, он находится только в рабочей группе).Кто-нибудь знает, как я мог получить журналы успеха в средстве просмотра событий, но я все еще получаю исключения в клиенте?

(отредактировано, чтобы добавить следующий абзац)

Интересно, если явызовите ValidateCredentials с неверным паролем для моей учетной записи «anotherUser», он не выдает исключение и правильно возвращает false.Он продолжает выдавать исключение, когда пароль правильный, хотя.Кто-нибудь знает, почему это будет?Это не имеет никакого смысла, и я действительно не хочу зависеть от этого странного поведения. Я хочу знать, почему успешный вызов вызывает исключение и устраняет основную причину ...

Спасибо!

(отредактировано для исправления ошибки, когда я сказал, что третий вызов возвращает false, когда он фактически выдает исключение)

...