Вопрос

Я задал вопрос несколько дней назад (Доступ к SQL Server 2005 с не доменной машины с использованием аутентификации Windows) которые получили некоторые интересные, но не полезные предложения. Я хотел бы задать вопрос снова, но ясно, что мои ограничения:

У меня есть домен Windows, в течение которого машина работает SQL Server 2005, и который настроен для поддержки только аутентификации Windows. Я хотел бы запустить клиентское приложение C # на машине в той же сети, но которая не находится в домене, и доступа к базе данных на экземпляре SQL Server 2005.

Я не могу создавать или модифицировать пользователей OS или SQL Server на любой машине, и я не могу внести какие-либо изменения в разрешения или невероятные, и я не могу использовать RUNS.

Я знаю, что я могу записать приложения Perl и Java, которые могут подключаться к базе данных SQL Server, используя только эти четыре параметра: имя сервера, имени базы данных, имя пользователя (в домене формы user) и пароль.

В C # Я пробовал разные вещи вокруг:

string connectionString = "Data Source=server;Initial Catalog=database;User Id=domain\user;Password=password";
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();

и попробовал настроить интегрированную безопасность в True и False, но ничего не работает. Это то, что я пытаюсь сделать просто невозможно в C #?

Спасибо за любую помощь, Мартин

Это было полезно?

Решение

Как вы правильно говорите, JDBC или PERL на машине Linux могут оба подключаться к SQL Server Использование аутентификации Windows и учетные данные, которые отличаются от в настоящее время вошедших в систему пользователей. То же самое верно для устройств Windows CE, Кстати.

Я думаю, что это то, что это не проблема C #, а водителя SQL Server OLE DB. Я думаю, что методы, упомянутые выше «Притворись, что машина Windows использует некоторые конкретные учетные данные» на уровне сети; Функция, которую не хватает водителя SQL Server OLE DB. Таким образом, мое предложение будет искать альтернативы (возможно, коммерческий?) Драйвер OLE DB, который может получить доступ к базам данных SQL Server. Я не уверен, что такая вещь существует, хотя.

Другие советы

У меня была похожая проблема, где я писал инструмент, который необходим для запуска на машине на одном домене и аутентифицироваться с SQL Server в другом домене, используя доверенное соединение. Все, что я мог найти на тему, сказала, что это не может быть сделано. Вместо этого вы должны присоединиться к домену, используйте SQL-аутентификацию, привязаться к некоторому паку под названием Kerberos или получите ребята сети для настройки доверенных отношений, чтобы назвать несколько альтернатив.

То есть я знал, что могу заставить его работать некоторое время, используя Runs, потому что я доказал это с SSMS:

C:\WINDOWS\system32\runas.exe /netonly /savecred /user:megacorp\joe.bloggs "C:\Program Files\Microsoft SQL Server\90\Tools\Binn\VSShell\Common7\IDE\SqlWb.exe"

Флаг Netonly позволил мне выполнить EXE с локальными учетными данными и получить доступ к сети с удаленными учетными данными, я думаю, в любом случае, я получил набор результатов, который я ожидал от удаленного сервера. Проблема была команда RUNAS сделала очень сложно отладить приложение, и это не пахнуло хорошо.

В конце концов я нашел эту статью на код проекта Что говорило об аутентификации, чтобы манипулировать Active Directory, вот основной класс, который делает олицетворение:

 используя систему; используя system.runtime.interopservices; // dlllimport с использованием System.security.Principal; // WindowsPhersonationContext Tampace TestApp {Class Empersonator {// Тип группы Enum enum Security_impersonation_level: int {securityAnonymous = 0, security steantification = 1, securityimpersonation = 2, SecurityDelection = 3} // Получает токен пользователя [DLLIMPORT («ADVAPI32.DLL», SETLASTERROR = true)] Статический внешний лом лом лом, строка PSZDOMAIN, строка PSZPASSWORD, INT DWLOGONTYPE, INT DWLOGONPROVIDER, REF INTPTR PHTOKEN); // закрывает открытые руки, возвращаемые в логотнике [dllimport ("kernel32.dll", charset = charset.auto)] Внешний статический Bool Cablehandle (ручка INTPTR); // Создает дубликатную ручку токена [DLLIMPORT («AdvaPi32.dll», CHARSET = CHARSET.AUTO, SETLASTERROR = TRUE)] Внешний статический Bool DuplicateToken (INTPTR ustakeTokenhandle, int security_impersonation_level, reft reptr duplicateletedhandle); WindowsimpersonationContext Newuser; /// /// пытается осиливать пользователя. Если успешно, возвращает /// WindowsimpersonationContext из новых пользователей Identity. /// /// Имя пользователя, которое вы хотите сделать empersonate /// Домен входа в систему /// Пароль пользователя для входа в систему с /// Public ImageSonator (string susername, string sdowain, string spassword) {// Инициализировать токены INTPTR PexistingTingtekenhandle = новый INTPTR ( 0); INTPTR PDUPLATETETECHANDLE = NEW INTPTR (0); PexistingTekenhandle = Intptr.zero; PDUPLATETETOKENDLE = INTPTR.ZERO; // Если имя домена было пустым, предположим, что локальный компьютер, если (SDomain == ») SDOMEAIN = System.environment.machinename; попробуйте {const int logon32_provider_default = 0; // Создать токен // const int logon32_logon_interactive = 2; const int logon32_logon_new_credentials = 9; // const int securityimpersonation = 2; // Получить дескриптор Token Bool Bimpersonated = logonUser (susername, sdowain, spassword, logon32_logon_new_credentials, logon32_provider_default, ref pexistingtekenhandle); // Подвескала ли неудачник? if (false == bimpersonated) {int nerrorcode = marshal.getlastwin32Error (); // Покажите причину, почему LogonUser не удалось бросить новое ApplicationException («LogonUser (), не удалось с кодом ошибки:« + NERRORCODE); } Bool Bretval = DuplicateToken (PexistingTingtekenhandle, (int) Security_impersonation_level.securityImpersonation, ref pduplicateTokenhandle); // DuplicateToken потерпел неудачу? if (false == bretval) {int nerrorcode = marshal.getlastwin32Error (); Closehandle (PexistingTokenhandle); // Закрыть существующую ручку // Показать причину, по которой дубликатованный неудача бросил новый ApplicationException («дубликаттованный () сбой с ошибками с кодом ошибки:« + NERRORCODE); } else {// Создать новую идентичность с использованием нового первичного токена Windowsidey NewID = новое Windowsidey (PDUPLATETETELAKEDALKLE); WindowsimpersonationContext AmbersonateSer = newid.impersonate (); Newuser = AmbersonatedUser; }. Если (pduplicateTokenhandle! = intptr.zero) CloseHandle (PduplicateToknhandle); }} Общественное пустовое отменить () {newuser.undo (); }}}

Использовать это только:

Impersonator impersonator = new Impersonator("username", "domain", "password");

//Connect to and use SQL server

impersonator.Undo();

Я добавил в метод отмены, в противном случае объект невероятки, как правило, получает сбор мусора. Я также изменил код для использования logon32_logon_new_credentials, но это была тэка и запустить его работать; Мне все еще нужно полностью понимать, что это делает, у меня есть ощущение, что это так же, как и Флаг / Нетонлы на Рунах. Я также собираюсь сломать конструктор немного.

Бесполезно указать имя пользователя и пароль в строке подключения, потому что те, кто подразумевает аутентификацию SQL, и вы уже указали, что SQL Server принимает только аутентификацию Windows.

Если сервер не позволяет аутентификации SQL, то Только Возможность подключения - использовать аутентификацию Windows, т. Е. IntegratedSecurity=true. Отказ Это означает, что ваш клиент будет проходить аутентификацию, так как можно выполнять учетные данные (или в настоящее время осенствует).

Для того, чтобы аутентификация Windows работать на работу, вы должны выбрать одно из следующих действий:

  • Присоединяйтесь к неменному соединенному компьютеру в домену (это может быть собственным доменом!) Что доверяет домену сервера, затем запустите клиентский процесс в качестве домена пользовательских учетных данных.
  • Используйте NTLM Mirrored учетные записи: пара локальных пользователей на клиенте и сервере с идентичным именем и паролями.
  • Грант как анонимный доступ к SQL Server.

Если вы не можете заставить клиентский хост доверять домену сервера, и вы не можете добавить зеркальные аккаунты NTLM, а администратор SQL Server достаточно вменяемый, чтобы не включить анонимность, то вы не сможете подключиться.

Вы должны Настроить SQL Server. Чтобы позволить аутентификации SQL Server, то есть аутентификации с использованием имени пользователя и пароля.

Вы не можете пройти аутентификацию по имени пользователя / пароле имени / пароля домена «Аутентификация сервера, т. Е. Укажите имя пользователя / пароль домена.

Я могу быть неправильным, конечно, но я уверен, что это не проблема C # или .NET. Как вы можете войти на SQL Server в своем приложении Perl или Java ??

Я дам вам ответ Java, с которым я более знакомый: я использую драйвер JTDS JDBC с четырьмя параметрами, упомянутыми выше. Применение Perl, о котором я знаю, но работает на поле Linux и может подключаться с теми же параметрами. Я не могу изменить SQL Server для поддержки аутентификации SQL.

Чтобы ответить на предложения Remus, я не могу сделать какие-либо из этих трех вещей, которые он предлагает, и все же приложения Java и Perl могут подключаться. Любые другие идеи?

Спасибо, Мартин

Вот образец код, который я использую для подключения с не доменной машины с использованием драйвера JTDS JDBC:

Class.forname («net.sourceforge.jtds.jdbc.driver»). NewinStance (); Ringe url = "JDBC: JTDS: SQLSERVER: // Сервер / База данных; Домен = Домен"; cont = drivermanager.getconnection (URL, "пользователь", "пароль");

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top