Хобрук: Ваш путь к мастерству в программировании

Как удаленно подключиться к SQL-серверу с проверкой подлинности Windows в PHP7?

Я изо всех сил пытаюсь подключиться к серверу в своем приложении php. Сервер запущен, и я подключаюсь к нему через ODBC-соединение в excel:

DSN=vortest;UID=ramunasc;Trusted_Connection=Да;APP=Microsoft Office 2010;WSID=OFFICE22;DATABASE=vordata_sql;ApplicationIntent=ТОЛЬКО ДЛЯ ЧТЕНИЯ;

Я могу подключиться к серверу с помощью SQL Server Management Studio, и я делаю это с помощью проверки подлинности Windows. Однако код PHP не работает:

$serverName = "MP-SQL2\SQL2008";  
$connectionInfo = array( "Database"=>"vordata_sql", "UID"=>"ramunasc");  
/* Connect using Windows Authentication. */  
$conn = sqlsrv_connect( $serverName, $connectionInfo);  
if( $conn === false )  
{  
    echo "Unable to connect.</br>";  
    die( print_r( sqlsrv_errors(), true));  
}

Это дает ошибку:

Unable to connect

Array
(
       [0] => Array
        (
            [0] => 28000
            [SQLSTATE] => 28000
            [1] => 18456
            [code] => 18456
            [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'ramunasc'.
            [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'ramunasc'.
        )
    [1] => Array
        (
            [0] => 28000
            [SQLSTATE] => 28000
            [1] => 18456
            [code] => 18456
            [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'ramunasc'.
            [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'ramunasc'.
        )
)

Я новичок в базах данных Microsoft, поэтому я не уверен, что делаю что-то неправильно или неправильно понимаю, как эти вещи работают.


  • Попробуйте изменить свой UID на форму "DOMAIN\username". 31.01.2018
  • Это решено. Мне просто нужно было создать нового пользователя на сервере и выбрать аутентификацию SQL Server, а не аутентификацию Windows. 06.02.2018
  • Звучит скорее как обходной путь, чем решение, но он выполняет свою работу. 06.02.2018

Ответы:


1

Решение:

  1. Вы должны удалить "UID"=>"ramunasc" из $connectionInfo. Когда вы устанавливаете параметр подключения «UID» и не устанавливаете параметр подключения «Аутентификация», драйвер PHP пытается использовать аутентификацию SQL.
  2. Важно отметить, что при использовании проверки подлинности Windows для подключения к серверу используется идентификатор процесса или потока веб-сервера (если веб-сервер использует олицетворение), а не идентификатор конечного пользователя. Вот почему вы можете подключиться к серверу с помощью SQL Server Management Studio (проверив подлинность с помощью учетных данных Windows), но ваш сценарий не работает.

Тестовая среда:

  1. Выпуск SQL Server 2005 Express со смешанным режимом проверки подлинности.
  2. Apache 2.4 с PHP 7.1.12 и драйвером Microsoft PHP для SQL Server (php_sqlsrv_71_ts_x86.dll, версия 4.3).

Подключение с проверкой подлинности Windows (рабочий пример):

<?php
$server = '127.0.0.1';
$cinfo = array(
    "Database"=>'master'
);

$conn = sqlsrv_connect($server, $cinfo);
if( $conn === false )
{
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}

$sql = "SELECT CONVERT(varchar(32), SUSER_SNAME())";
$stmt = sqlsrv_query($conn, $sql);
if( $stmt === false ) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}

$row = sqlsrv_fetch_array($stmt);
echo "Login name: ".$row[0];

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

В моем случае результатом будет «Имя для входа: NT AUTHORITY\SYSTEM».

Подключиться с аутентификацией SQL-сервера (рабочий пример):

<?php
$server = '127.0.0.1';
$cinfo = array(
    "Database"=>'master',
    "UID"=>'username',
    "PWD"=>'password'
);

$conn = sqlsrv_connect($server, $cinfo);
if( $conn === false )
{
    echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
    exit;
}

$sql = "SELECT CONVERT(varchar(32), SUSER_SNAME())";
$stmt = sqlsrv_query($conn, $sql);
if( $stmt === false ) {
    echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
    exit;
}

$row = sqlsrv_fetch_array($stmt);
echo "Login name: ".$row[0];

sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

Результат: «Имя для входа: имя пользователя»

15.02.2018
Новые материалы

Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

«Очень простой» эволюционный подход к обучению с подкреплением
В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

Фишинг — Упаковано и зашифровано
Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..