У меня есть домен Windows, в котором машина выполняет SQL Server 2005 и который настроен для поддержки только аутентификации Windows. Я хотел бы выполнить клиентское приложение C# на машине в той же сети, но который НЕ находится на домене, и получите доступ к базе данных по экземпляру SQL Server 2005 года.
Я думал, что это будет простой вопрос выполнения чего-то вроде этого:
string connectionString = "Data Source=server;Initial Catalog=database;User Id=domain\user;Password=password";
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
Однако это перестало работать: клиентская ошибка:
Система. Данные. SqlClient. SqlException: Вход в систему, отказавший для пользователя 'domain\user' и ошибка серверной стороны: Ошибка 18456, Серьезность 14, состояние 5
Я попробовал различные вещи включая установку интегрированной защиты к истине и лжи, и \вместо \в идентификаторе пользователя, но без успеха.
В целом я знаю, что это возможный соединиться с экземпляром SQL Server 2005 года от недоменной машины (например, я работаю с основанным на Linux приложением, которое счастливо делает это), но я, кажется, не могу разработать, как сделать это от машины Windows.
Можно создать локального пользователя на каждой машине с тем же именем пользователя и паролем. После создания этих пользователей предоставьте пользователю на машине SQL-сервера доступ к SQL-серверу на на другом компьютере ваше приложение должно работать от имени вновь созданного пользователя, если это веб-приложение, просто измените настройки пула приложений.
(Ответ Мартина Смита) Я все время использую RUNAS / NETONLY для запуска SSMS и BI dev studio и Visual Studio IDE. и другие сторонние приложения против сервера в домене, в котором мы не аутентифицируемся. Я не уверен, почему вы не можете этого сделать - у вас должна быть учетная запись в этом домене, которая работает с SQL Server, если вы используете интегрированную безопасность.
Кроме того, я модифицировал одну из моих основных программ на C #, чтобы использовать CreateProcessWithLogonW с LOGON_NETCREDENTIALS_ONLY ( Как встроить функциональность RUNAS / NETONLY в программу (C # /. NET / WinForms)? ), чтобы она отображала запрос для имени пользователя и пароля, а затем перезапустится.
Используя тот же API, я также сделал версию RUNAS / NETONLY, которая будет принимать пароль в командной строке, поскольку RUNAS НЕ разрешает вводить пароль в командной строке. Очевидно, что это неотъемлемая угроза безопасности, и я не использую ее часто.
Для полноты картины есть еще одно замечательное расширение оболочки: http://technet.microsoft.com/en-us/sysinternals/cc300361.aspx - обычное расширение Run As Shell не у меня нет возможности делать эквивалент / NETONLY.
Пробовали ли вы подключиться с именем машины\UserName? Я также полагаю, что такой пользователь должен быть создан в базе данных SQL - правильно?
В Management Studio при подключении к серверу в другом домене через Windows Authentication необходимо использовать "runas" Facility при запуске приложения.
runas /user:OTHERDOMAIN\OTHERUSERNAME /netonly
"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe"
Может быть, вы могли бы попробовать аналогичную вещь при запуске вашего приложения?