#c# #.net #windows-server-2008
#c# #.net #windows-server-2008
Вопрос:
У меня есть следующая настройка.
Сервер Windows 2008, который не является частью домена, но имеет множество пользователей, настроенных локально на компьютере (мы не используем active directory). У меня есть приложение, запущенное на другом компьютере (в настоящее время 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)
Я должен также упомянуть, что «Другой пользователь» также является администратором на сервере 2008. Почему только пользователь-администратор может быть проверен? Я пробовал несколько разных учетных записей, не являющихся администраторами, и ни одна из них не работает. Я точно знаю, что имя пользователя / пароль, которые я использую, действительны и что пользователи не отключены или что-то в этом роде. Мне не удается найти решение в Google, возможно, потому, что это должно быть так просто, я, должно быть, упускаю что-то совершенно очевидное… Любая помощь была бы высоко оценена.
(Отредактировано для добавления следующего абзаца)
Я все еще не разобрался в этой проблеме, но подумал, что продолжу в надежде, что кто-нибудь поможет, я в растерянности. То, что происходит, очень странно. Я просматриваю средство просмотра событий -> Журналы Windows-> Безопасность, чтобы посмотреть, поможет ли это указать на проблему. Странно то, что в этих журналах все сообщается как успешное, и никаких проблем не указано. Несмотря на это, я все еще получаю исключение UnauthorizedAccessException с сообщением «Ошибка общего отказа в доступе» на моем клиенте C #. Я также заметил, что источником исключения является «Active Directory», несмотря на тот факт, что мы не используем active directory (сервер даже не в домене, а только в рабочей группе). Кто-нибудь знает, как я мог бы получать журналы успеха в средстве просмотра событий, но при этом я все еще получаю исключения внутри клиента?
(Отредактировано для добавления следующего абзаца)
Интересно, если я вызываю ValidateCredentials с неверным паролем для моей учетной записи «anotherUser», исключение не генерируется и корректно возвращает false . Однако он продолжает выдавать исключение, когда пароль правильный. Кто-нибудь знает, почему это может быть? Это вообще не имеет смысла, и я действительно не хочу зависеть от этого странного поведения, я хочу знать, почему успешный вызов выдает исключение, и устранить основную причину…
Спасибо!
(отредактировано, чтобы исправить ошибку, в которой я сказал, что третий вызов возвращает false, когда он фактически генерирует исключение)
Комментарии:
1. Вы подтвердили, что на компьютере, на котором выполняется код, существует «другой пользователь» и что пароль действителен? Заблокирована ли учетная запись? также, можете ли вы предоставить текст исключения и внутренний текст исключения, если он существует.
2. Код выполняется на компьютере с XP, поэтому ‘anotherUser’ не существует в этом окне, но он существует на сервере 2008. Пароль правильный, и пользователь не заблокирован или не отключен. Я могу войти на компьютер напрямую, используя комбинацию ‘anotherUser’ UN / PW. Я также пробовал несколько пользователей, и у всех них (кроме администратора) одна и та же проблема. Идет трассировка стека.
3. Я все еще не разобрался в этой проблеме, если у кого-нибудь есть какая-либо информация, которая привела бы меня в правильном направлении, я был бы очень признателен.
4. можете ли вы войти на компьютер xp с учетной записью ‘anotheruser’?
5. Я попытался создать ‘anotherUser’ на моем компьютере XP с тем же паролем, что и у пользователя на сервере 2008, и это ничего не изменило, он по-прежнему терпит неудачу с исключением, упомянутым выше. Я также пробовал без ‘anotherUser’, существующего на моем компьютере XP, и это также завершается неудачей. Моя требуемая функциональность заключается в том, чтобы пользователь не программировался локально, но я подумал, что попробую столько комбинаций, сколько смогу, чтобы попытаться точно выяснить, что происходит. Возможно, то, что я пытаюсь сделать, просто невозможно с хранилищем SAM…